完整的C/S架構的基於RTP/RTCP的H.264視頻傳輸方案。此方案中,在伺服器端和用戶端分別進行了功能模組設計。伺服器端:RTP封裝模組主要是對H.264碼流進行打包封裝;RTCP分析模組負責產牛和發送RTCP包並分析接收到的RTCP包;QoS反饋控制模組則根據RR報文反饋資訊動態對發送速率進行調整;發送緩衝模組則設定連接埠發送RTP、RTCP包。用戶端:RTP模組對接收到的RTP包進行解析判斷;RTCP模組根據SR報文統計關鍵資訊,產牛並發送RR包。然後,在VC++6.0下用Socket編程,完成基於RTP/UDP/IP的H.264視頻傳輸,並在區域網路內運行較好。
基於RTP/UDP/lP的H.264視頻傳輸結構設計
對於H.264視頻的即時傳輸應用來說,TCP的重傳機制引入的時延和抖動是無法容忍的,因此我們採用UDP傳輸協議。但是UDP協議本身是面向不需連線的,不能提供品質保證。而基於UDP之上的高層協議RTP/RTCP可以一起提供流量控制和擁塞控制服務。圖給出了基於RTP/UDP/IP的H.264視頻傳輸的架構。
H.264視頻流的RTP封裝策略
從圖4—1可以看出,H.264視頻資料首先經RTP進行封裝,打包成適合網路傳輸的資料包才能進行傳輸。所以,如何設計合適的RTP封裝策略對H.264視頻資料進行封裝是十分重要的。一般來說,在H.264中,RTP封裝應該遵循幾個設計原則:
1、較低的開銷,因此MTU的尺寸應該限制在100—64K位元組範圍內。
2、易於區分分組的重要性,而不必對分組內的資料解碼。
3、應能檢測到資料的類型,而不需解碼整個資料流,並能根據編碼流之間的相關性丟棄無用資料,如網關應能檢測A型分割的丟失,並能丟棄相應的B型和C型分割。
4、應支援將一個NALU拆分為若干個RTP包:不同大小的輸入圖片決定了NALU的長度可能會大於MTU,只有拆分後才會避免IP層在傳輸時出現分區。
5、支援將多個NALU彙集在一個RTP分組中,即在一個RTP包中傳輸超過一個NALU,當多個圖片的編碼輸出小於M1IU時就考慮此模式,以提高網路傳輸效率。
RTP載荷封裝設計
本文的網路傳輸是基於IP協議,所以傳輸單元最大值(MTU)最大為1500位元組,在使用IP/UDP/RTP的協議階層的時候,這其中包括至少20位元組的IP頭,8位元組的UDP頭,以及12位元組的RTP頭。這樣,頭資訊至少要佔用40個位元組,那麼RTP載荷的最大尺寸為1460位元組。
一方面,如果每個IP分組都填滿1500位元組,那麼協議頭的開銷為2.7%,如果RTP載荷的長度為730位元組,協議頭的開銷仍達到5.3%,而假設RTP載荷的長度不到40位元組,那麼將有50%的開銷用於頭部,這將對網路造成嚴重資源浪費。另一方面,如果將要封裝進RTP載荷的資料大於1460位元組,並且我們沒有在應用程式層資料裝載迸RTP包之前進行載荷分割,將會產生大於MTU的包。在IP層其將會被分割成幾個小於MTU尺寸的包,這樣將會無法檢測資料是否丟失。因為IP和UDP協議都沒有提供分組到達的檢測,如果分割後第一個包成功接收而後續的包丟失,由於只有第一個包中包含有完整的RTP頭資訊,而RTP頭中沒有關於載荷長度的標識,因此判斷不出該RTP包是否有分割丟失,只能認為完整的接收了。並且在IP層的分割無法在應用程式層實現保護從而降低了非平等包含方案的效果。由於UDP資料分組小於64K位元組,而且一個片的長度對某些應用場合來說有點太小,所以應用程式層的打包也是RTP打包機制的一個必要部分。最新的RFC3984標準中提供了針對H.246媒體流的RTP負載格式,主要有三種:
單個NAL單元分組、彙總分組、片分組。
NAL單元單一打包
將一個NAL單元封裝進一個包中,也就是說RTP負載中只包含一個NAL單元,NAL頭部兼作RTP頭部。RTP頭部類型即NAL單元類型1-23,如所示:
NAL單元的重組
此分組類型用於將多個NAL單元彙總在一個RTP分組中。一些H.264的NAL單元的大小,如SEI NAL單元、參數集等都非常小,有些只有幾個位元組,因此應該把它們組合到一個RTP包中,將會有利於減小頭標(RTP/UDP/IP)的開銷。目前存在著兩種類型彙總分組:
NAL單元的分割
將一個NAL單元分割,使用多個RTP分組進行傳輸。共有兩個類型FU—A和FU—B,單元類型中分別為28和29。根據IP層MTU的大小,對大尺寸的NALU必須要進行分割,可以在分別在兩個層次上進行分割:
1)視頻編碼層VCL上的分割
為了適應網路MTU的尺寸,可以使用編碼器來選擇編碼Slice NALU的大小,從而使其提供較好的效能。一般是對編碼Slice的大小進行調整,使其小於1460位元組,以免IP層的分割。
2)網路提取層NAL上的分割
在網路提取層上對NALU的分割主要是採用分區單元方案,H.264標準中提出了分割機制,可以使NAL單元的尺寸小於1460位元組。注意:此方式是針對同一個NAL單元進行分割的,不適用於彙總分組。一個NAL單元採用分割分組後,每個RTP分組序號依次遞增l,RTP時間戳記相同且惟一。NAL單元的分割是RTP打包機制的一個重要環節,總結其分割機制主要有如下幾個特點:
①分割NALU時,是以RTP序號升序進行傳輸。在序號不迴圈的前提下,屬於前一幀映像的所有映像片包以及A/B/C資料分割包的序號要小於後幀映像中的映像片及資料分割包的序號。
②一個符號機制來標記一個分割的NALU是第一個還是最後一個NAL單元。
3.存在另外一個符號機制用來檢測是否有丟失的分塊。
④輔助增強資訊包和頭資訊包可以任意時間發送。
⑤同一幀映像中的映像片可以以任意順序發送,但是對於低時延要求的網路系統,最好是以他們原始的編碼順序來發送。
1)單一時間彙總分組(STAP):包括單一時間彙總分組A(STAP—A)和單一時間彙總分組B(STAP—B),按時間戳記進行組合,他們的NAL單元具有相同的時間戳記,一般用於低延遲環境。STAP—ASTAP—B的單元類型分別為24和25。
2)多時間彙總分組(MTAP):包括16位元位移多時間彙總分組(MTAPl6)和24位元位移多時間彙總分組(MTAP24)不同時間戳記也可以組合,一般用於高延遲的網路環境,比如流媒體應用.它的打包方案相對複雜,但是大大增強了基於流媒體的H.264的效能。MTAPl6 MTAP24的單元類型分別為26和27。
RTP包的封裝流程設計
根據H.264NAL單元的分割重組的性質以及RTP打包規則,本文實行的對RTP打包的設計如下:
1、若接收到的NAL單元小於MAX—SIZE(此時MAX-sIZE為設定的傳輸單元最大值),則對它進行單一打包,也就是將此NAL單元直接放進RTP包的載荷部分,產生一個RTP包。
2、若接收到的NAL單元大於MAx—SIZE位元組,則對它進行分割,然後對分割後的NAL單元進行步驟1方式打包。分割方案如下:
其中Nsize是分割前的NAL單元大小,N是分割後NAL單元的大小。K分割後的單元數。分割後最後一個單元的大小可能會小於N,這時必須使用RTP載荷填充是其同前面的分塊大小相同,此時RTP頭中的填充標識位值為1。
3、對SEI,參數集等小NAL單元重組,將它們合并到一個RTP包中。雖然步驟3中的重組方案可以減小IP/UDP/RTP頭部開銷,但是對於包丟失率比較高的網路環境,這意味著一個RTP包的丟失可能會導致多片的丟失,往往一個片中就有一個P映像,解碼後的視頻品質必然會嚴重下降。因此,在丟失率的網路中可以採用NAL單元的重組方案,而在高丟失率的網路環境中採用NAL單元重組時要進行有效差錯控制.在本文中不使用重組方案。
RTP/RTCP包的封裝實現
RTP包封裝設計
RTcP包的封裝設計
RTCP報文封裝在UDP資料報中進行傳輸,發送時使用比它所屬的RTP流的連接埠號碼大1的協議號(RTP使用偶數號,RTCP使用奇數號)。以下是RTCP頭部資料結構:
原文地址:http://hi.baidu.com/ilovejoy/blog/item/daee10efa91e501afdfa3c5f.html