從RTSP協議傳輸的H264視頻流中取出每一個幀屬於I、P、B中的哪一種幀


本文地址: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM