天天看點

h264資料通過RTP分片傳輸的例子

使用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

繼續閱讀