基于ARM的移動視頻監(jiān)控終端設計與實現(xiàn)
2.1 H.264視頻流的傳輸
2.1.1 傳輸方式選擇
視頻的實時傳輸要求較低的時間延遲,并且允許一定的丟包率。由于TCP協(xié)議的3次握手以及丟包重傳機制會造成一定的延時,在實時監(jiān)控系統(tǒng)中有一定缺陷,而UDP協(xié)議是面向無鏈接、不可靠的傳輸層協(xié)議,具有消耗資源小,傳輸速度快等特點,在視頻傳輸過程中偶爾丟包不會對監(jiān)控畫面產生較大影響。UDP協(xié)議不提供數(shù)據(jù)包分包、封裝、數(shù)據(jù)包排序等缺點,為保障視頻流傳輸?shù)目煽啃?,網絡傳輸部分采用建立在UDP協(xié)議之上的RTP(Real-time Transport Protocol)實時傳輸協(xié)議來實現(xiàn),通過套接字與前端建立連接,以接收視頻流數(shù)據(jù)。RTP提供帶有實時特性的端對端數(shù)據(jù)傳輸服務,包括有效載荷類型的定義、序列號、時間戳和傳輸檢測控制?;赗TP/UDP/IP協(xié)議傳輸視頻流封裝格式如圖2所示。
2.1.2 視頻流傳輸
采用UDP協(xié)議傳輸RTP包時會出現(xiàn)亂序的現(xiàn)象,所謂亂序就是監(jiān)控終端接收到RTP包順序可能前端發(fā)送的順序不一致,因此,首先要對接收的RTP包排序。采用在內存中建立一個雙向鏈表來保存接收的RTP包,按照RTP報頭的序列號(Sequence Number)順序存放到鏈表中,雙向鏈表結構體定義如下,部分變量用于RTP分片封包模式。
每當接收到一個新的RTP包后,根據(jù)序列號從鏈表尾開始搜索并插入到合適的位置,比如,接收到一個序列號SN=26的RTP包在鏈表中分配內存,找到位于25,27之間的位置插入該包,RTP包排序過程如圖3所示。
H.264視頻流NALU單元封裝成RTP包時,要遵循RTP負載格式標準,H.264負載格式定義了3種類型的負載結構:單一NALU模式、組合封包模式、分片封包模式。單一NALU模式是一個RTP包僅由一個完整的NALU組成;組合封包模式是可能由多個NALU組成一個RTP包;分片封包模式是將一個NALU單元封裝成多個RTP包,采用分片封包模式的原因是網絡傳輸協(xié)議有最大傳輸單元(MTU)一般為1500B上限,如果NALU大于MTU,IP層將其自動分割為幾個小于MTU的數(shù)據(jù)包,這樣無法檢測數(shù)據(jù)包是否有丟失,所以有必要采取分片封包模式,在接收端把擁有相同時間戳的多個RTP包按照序列號重組成一個完整的NALU。分片封包模式的RTP包格式如圖4所示。
評論