H.264碼流的RTP封裝(上)

H.264碼流的RTP封裝(上)

1. 概括

RTP(Real-time Transport Protocol,實時傳輸協議)是一個網絡傳輸協議。它爲數據提供了具有實時特徵的端對端傳送服務。

隨着信息化的發展,人們對於某些信息,更看重信息的實時性,而不是完整性,這就產生了流媒體技術。流媒體技術具有啓動時延小,節省客戶端空間等優勢。流媒體技術的一種實現方法就是使用RTP協議進行網絡傳輸,利用RTP協議所提供特性實現實時性。

2. RTP封裝結構及方法

2.1 RTP報頭

RTP報頭固定報頭具有12個字節,其結構如下圖1所示。

1 RTP

其中:

(1)V:版本號。本次版本號爲2;

(2)P:填充標誌。可直接置零。

(3)X:擴展標誌。可直接置零。

(4)CC:CSRC計數。若無CSRC,則置零即可。

(5)M:標誌位。標誌位的具體解釋可由具體協議規定。如可用於幀邊界標誌。

(6)PT:負載類型。對於H.264來說,該值爲105。

(7)Sequence number:序列號。序列號用於對RTP包進行計數。每發送一個RTP包,序列號加1。序列號的初始值可以置爲零,也可用隨機數開始。初始值如果是隨機的,用利於加密。

(8)timestamp:時間戳。時間戳的增量爲採樣頻率/幀率。同一幀的時間戳應該是一樣的。時間戳的初始值也可以從零開始,或以隨機數開始。按RFC3984規定,採用90000HZ的時鐘。所以如果幀率爲15,則時間戳增量爲6000。

(9)SSRC:同步源識別符。若只使用下個同步源,則SSRC應該一樣。JM中直接將這四個字節置爲0x12345678。

(10)CSRC:可無。

事實上,使用JM或JSVM視頻編碼測試模式輸出的264流使用的是NALU封裝。而NALU的結構是由起始碼前綴、NALU頭部和NALU負荷數據組成。其中起始碼前綴可以是0x 00 00 01或0x 00 00 00 01。因此前綴可能是三字節或是四字節。NALU頭部如圖2所示。NALU頭部由一個比特的F位、兩個比特的NRI和五個比特的TYPE組成。其中,F位強制爲0,TYPE類型爲0到23的值。

2 NALU

另外,對於JM來說,其編碼也可以輸出RTP結構的文件。而且其RTP結構還包括8個字節的前綴,即四個字節的RTP大小和四個字節的識別符。如圖3所示。RTP大小包括12個字節的RTP頭 + RTP數據。

3 示例:RTP起始碼

通過上面的論述可知,對於H264碼流,其RTP封裝就是將原始的NALU起始碼前綴替換成RTP起始碼+RTP頭部。注意,如果進行組合封裝或拆包封裝,RTP固定頭部後面還會有一些指示組合或拆包的字節。

2.2 RTP封裝方法

RTP有三種封裝方法,即單包封裝、組合封裝和拆包封裝。當數據包大小超過最大傳輸單元(MTU,一般爲1500字節)時,可以對數據包進行拆包封裝。如果數據包太小,還可以選擇進行組合封裝。RTP包的接收端只需要檢測RTP頭部12個字節之後的第一個字節便可知道該包是單包封裝、組合封裝還是拆分封裝。當使用單包封裝時,該字節只低五位爲1-23的數值;當進行組合封裝時,該五位爲24-27的數值;當進行拆包封裝時,爲28或29。

0 沒有定義

1-23 NAL單元 單個 NAL 單元包.

24 STAP-A 單一時間的組合包

25 STAP-B 單一時間的組合包

26 MTAP16 多個時間的組合包

27 MTAP24 多個時間的組合包

28 FU-A 分片的單元

29 FU-B 分片的單元

30-31 沒有定義

(1)單包封裝

當數據包大小小於MTU時,一般採用單包封裝。如前所述,NALU單元由起始碼前綴、NALU頭部和NALU載荷組成。因此在進行單包封裝時,只需要將NALU單元的起始碼前綴去掉,加上RTP起始碼和RTP頭部。如待NALU單元如下所示:

【00 00 00 01】【67 42 A0 1E 23 56 。。。】

則單包封裝後結構如下:

【4字節的RTP大小】【FF FF FF FF】【12字節的RTP頭部】【67 42 A0 1E 23 56 。。。】

注意:現實的RTP封裝是沒有前面8個字節的。本人只是爲了適應JM進行封裝所以加上8個字節的起始碼。

(2)拆包封裝

拆包封裝有兩種拆包方法,即FU-A和FU-B。本人採用FU-A方法進行拆包封裝。FU-A封裝結構如圖4所示。

圖4 FU-A結構

其中FU indicator爲FU-A封裝指示字節。該字節結構如圖5所示。FU header爲FU頭部,其結構如圖6所示。

5 FU indicator

FU indicator位用於標識該RTP包爲拆包封裝。由圖5可見,其結構和NALU的頭部結構相同。其中F0NRI和該包所荷載NALU頭部中NRI相同,TYPE28(若採用FU-B,則TYPE值爲29)。

6 FU header

FU header中,S位指示該RTP包是否是原NALU中的第一個分片,若是第一個分片,則置1;E位,若該分片是本次拆包的最後一個分片,則該位置1;R位保留,置0;TYPE和FU indicator中的TYPE相同。

(3)組合封裝

組合封裝有四種組合方式,本文不討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章