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,是一種封裝格式,