本文地址:http://www.cnblogs.com/herbix/p/4270035.html
RTSP是一個控制協議,其中的數據是用RTP傳輸的。
RTP使用了UDP,每個UDP包的內容區(沒有UDP頭)都包含以下的幾個部分:
RTP_FIXED_HEADER 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X| CC |M| PT | sequence number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | timestamp | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | synchronization source (SSRC) identifier | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | contributing source (CSRC) identifiers | | .... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
V: 版本
P: 填充標志,占1位,如果P=1,則在該報文的尾部填充一個或多個額外的八位組,它們不是有效載荷的一部分。
X:擴展標志,占1位,如果X=1,則在RTP報頭后跟有一個擴展報頭。
CC: CSRC的個數
M: 對於H264視頻幀,表示這是最后一個分片
PT: 載荷類型,H264是96(0x60)
SSRC: 會話標識
CSRC: 忘記了
緊隨其后的是NALU_HEADER
NALU_HEADER +---------------+ |0|1|2|3|4|5|6|7| +-+-+-+-+-+-+-+-+ |F|NRI| Type | +---------------+
F: 始終為0
NRI: 重要性
Type: 類型
Type Packet Type name ---------------------------------------------------- 0 undefined 1 不分區,非IDR圖像的片(I, P, B幀) 2 片分區A 3 片分區B 4 片分區C 5 IDR圖像中的片(I幀) 6 補充增強信息單元(SEI) 7 序列參數集(SPS) 8 圖像參數集(PPS) 9 分界符 10 序列結束 11 碼流結束 12 填充 13-23 reserved 24 STAP-A Single-time aggregation packet 25 STAP-B Single-time aggregation packet 26 MTAP16 Multi-time aggregation packet 27 MTAP24 Multi-time aggregation packet 28 FU-A Fragmentation unit 29 FU-B Fragmentation unit 30-31 undefined
如果H264的Slice過大,無法裝入一個UDP包中,一般來說這里就要分包。分包時,NALU_HEADER中Type字段為FU-A(28),下一字節為FU_HEADER。
FU_HEADER +---------------+ |0|1|2|3|4|5|6|7| +-+-+-+-+-+-+-+-+ |S|E|R| Type | +---------------+
S: 開始的片
E: 結束的片
R: 始終為0
Type: 類型,和NALU_HEADER的類型一致
后面的部分就是H264的內容了。H264是按照Slice傳輸的,每個Slice有一個Slice頭,據說Slide頭使用了指數哥倫布編碼(k=0),需要先進行解碼。
指數哥倫布編碼(k=0):
數據 數據+1 寫作二進制(n位) 前加n-1個0(編碼結果) 0 1 1 1 1 2 10 010 2 3 11 011 3 4 100 00100 4 5 101 00101 5 6 110 00110 6 7 111 00111 7 8 1000 0001000 ... ... ... ...
解碼就反過來,先數0的個數,然后再取相應位數的數據出來。
011110100001101 -> 011 1 1 010 0001101 -> 11 1 1 10 1101 -> 3 1 1 2 13 -> 2 0 0 1 12
Slide頭的第二個參數為slice_type,也就是解出來的第二個數,表示IPB幀:
slice_type Name of slice_type 0 P (P slice) 1 B (B slice) 2 I (I slice) 3 SP (SP slice) 4 SI (SI slice) 5 P (P slice) 6 B (B slice) 7 I (I slice) 8 SP (SP slice) 9 SI (SI slice)
參考:
[1] http://blog.csdn.net/jefry_xdz/article/details/8461343
[2] http://www.cnweblog.com/fly2700/archive/2012/02/23/319718.html
[3] http://blog.csdn.net/wangjiannuaa/article/details/6966505
[4] http://blog.sina.com.cn/s/blog_4171e65d0100o4pt.html
[5] http://baike.baidu.com/view/1268656.htm?fromtitle=RTP&fromid=8974125&type=syn