RTP、PS、H264格式解析

1、RTP包

將PS或者MPEG-TS等數據打包爲RTP的方法是:在MPEG-TS數據前面加上RTP Header,如下圖所示:

                                                  (圖片來源:https://blog.csdn.net/leixiaohua1020/article/details/50535230

所以解析RTP包時,只要將RTP header解析完成即可,header字段結構如下:

                                                    (圖片來源:https://blog.csdn.net/u011006622/article/details/80675054

版本號(V):2比特,用來標誌使用的RTP版本,固定爲2。

填充位(P):1比特,如果該位置位,則該RTP包的尾部就包含附加的填充字節。

擴展位(X):1比特,如果該位置位的話,RTP固定頭部後面就跟有一個擴展頭部。

CSRC計數器(CC):4比特,含有固定頭部後面跟着的CSRC的數目。

標記位(M):1比特,該位的解釋由配置文檔(Profile)來承擔.

載荷類型(PT):7比特,標識了RTP載荷的類型。

序列號(SN):16比特,發送方在每發送完一個RTP包後就將該域的值增加1,接收方可以由該域檢測包的丟失及恢復包序列。序列號的初始值是隨機的。

時間戳:32比特,記錄了該包中數據的第一個字節的採樣時刻。在一次會話開始時,時間戳初始化成一個初始值。即使在沒有信號發送時,時間戳的數值也要隨時間而不斷地增加(時間在流逝嘛)。時間戳是去除抖動和實現同步不可缺少的。

同步源標識符(SSRC):32比特,同步源就是指RTP包流的來源。在同一個RTP會話中不能有兩個相同的SSRC值。該標識符是隨機選取的 RFC1889推薦了MD5隨機算法,就是ssrc。

貢獻源列表(CSRC List):0~15項,每項32比特,用來標誌對一個RTP混合器產生的新包有貢獻的所有RTP包的源。由混合器將這些有貢獻的SSRC標識符插入表中。SSRC標識符都被列出來,以便接收端能正確指出交談雙方的身份。

代碼如下,要注意現在電腦CPU大多數使用小端,網絡字節序使用大端,所以代碼中字段順序有所不同:

typedef struct RTP_FIXED_HEADER{
	/* byte 0 */
	unsigned char csrc_len:4;       /* expect 0 */
	unsigned char extension:1;      /* expect 1 */
	unsigned char padding:1;        /* expect 0 */
	unsigned char version:2;        /* expect 2 */
	/* byte 1 */
	unsigned char payload:7;
	unsigned char marker:1;        /* expect 1 */
	/* bytes 2, 3 */
	unsigned short seq_no;            
	/* bytes 4-7 */
	unsigned  long timestamp;        
	/* bytes 8-11 */
	unsigned long ssrc;            /* stream number is used here. */
} RTP_FIXED_HEADER;

                                                (代碼來源:https://blog.csdn.net/leixiaohua1020/article/details/50535230

具體解析RTP包代碼例子可以看:
https://blog.csdn.net/leixiaohua1020/article/details/50535230
https://blog.csdn.net/dong_beijing/article/details/70225932

2、PS

ps全名MPEG-PS,是一種封裝格式,

 

 

 

 

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