使用RTP傳輸H264資料時,當NALU的長度太長需要分包時,如下是一個例子,如想知道更詳細的協定說明可以參考末尾連接配接。
在live555内部,收到一段資料每包開頭如下
7c 81 e1 42
7c 1 d 8f
7c 1 a7 c8
7c 1 28 2d
。。。
7c 1 6b fb
7c 1 14 2b
7c 41 43 3b
live555将以上資料處理,得到的資料如下傳回給使用者
61, e1, 42, 19, ff, 7f, 04, 8b, 99, 5c, 3
這是一個264的p幀
資料的第一個位元組7c是FU indicator
第二個位元組81, 1, 41等是FU header
The FU indicator octet has the following format:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
The FU header has the following format:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
FU:Fragmentation Units
7c寫為二進制是01111100,即是:
0 11 11100
F 禁止位是0(0)
NRI 重要性訓示位是 3(11)
NALU 類型是28(11100),FU-A型的分片的單元
81寫為二進制是10000001,即是:
1 0 0 00001
S: 設定為1時表示是一個NALU的起始包,這裡是1,說明是起始包
E: 設定為1時表示是一個NALU的結束包,這裡是0,說明不是結束包
R: 保留位
Type: 載荷的類型,這裡是1,因為是對264的分包,是以是說明載荷是264的非IDR圖像的片
41寫為二進制是01000001,即是:
0 1 0 00001
S: 設定為1時表示是一個NALU的起始包,這裡是0,說明不是起始包
E: 設定為1時表示是一個NALU的結束包,這裡是1,說明是結束包
Type: 載荷的類型,這裡是1,因為是對264的分包,是以是說明載荷是264的非IDR圖像的片
在接收完一包資料後組包,得到264的NALU頭61,寫為二進制是01100001,即是:
0 11 00001
禁止位同FU indicator的禁止位
重要性訓示位同FU indicator的重要性訓示位
類型同FU header的類型說明
以上是分包時的例子,不分包時則收到的資料直接就是:
61, e1, 42, 19, ff, 7f, 04, 8b, 99, 5c, 3
STAP-B and FU-B structures include DON
DON: Decoding Order Number
http://www.rfc-editor.org/rfc/rfc3984.txt
http://blog.csdn.net/yaorongzhen123/article/details/8453174
http://www.cppblog.com/czanyou/archive/2009/12/25/67940.html