一尚氛、RTP協(xié)議概述
RTP(Real-time Transport Protocol)實(shí)時(shí)傳輸協(xié)議阅嘶,由IETF的多媒體傳輸工作小組發(fā)布的網(wǎng)絡(luò)傳輸協(xié)議讯柔,標(biāo)準(zhǔn)為RFC3550/3551护昧。RTP協(xié)議支持TCP和UDP兩種傳輸方式,RTP協(xié)議負(fù)責(zé)對(duì)流媒體數(shù)據(jù)進(jìn)行封包并實(shí)現(xiàn)媒體流的實(shí)時(shí)傳輸捣炬,但并不能為按順序傳送的數(shù)據(jù)包提供可靠的傳送機(jī)制,也不提供流量和擁塞控制婿屹,這些是依靠RTCP協(xié)議來完成的推溃,兩者配合使用铁坎。本文主要從數(shù)據(jù)處理的角度實(shí)現(xiàn)對(duì)H.265的RTP封裝進(jìn)行詳細(xì)介紹厢呵。
二襟铭、RTP協(xié)議解析
RTP協(xié)議是由RTP Header和RTP Payload兩部分組成的短曾,具體如下圖所示:
RTP Header | RTP Payload |
---|
1嫉拐、RTP Header
RTP頭部前12個(gè)字節(jié)的含義是固定的婉徘,具體的含義如下所示:
V:RTP協(xié)議的版本號(hào)盖呼,占2位,當(dāng)前協(xié)議版本號(hào)為2约炎。
P:填充標(biāo)志圾浅,占1位憾朴,如果P=1伊脓,則在該報(bào)文的尾部填充一個(gè)或多個(gè)額外的八位組魁衙,它們不是有效載荷的一部分剖淀。
X:擴(kuò)展標(biāo)志纵隔,占1位捌刮,如果X=1舒岸,則在RTP報(bào)頭后有一個(gè)擴(kuò)展頭蛾派。
CC:CSRC計(jì)數(shù)器洪乍,占4位,指示CSRC 標(biāo)志符的個(gè)數(shù)岂贩。
M: 標(biāo)記萎津,占1位褥紫,不同的有效載荷有不同的含義,對(duì)于視頻部念,標(biāo)記一幀的結(jié)束氨菇;對(duì)于音頻查蓉,標(biāo)記會(huì)話的開始豌研。
PT: 有效荷載類型唬党,占7位驶拱,用于說明RTP報(bào)文中有效載荷的類型蓝纲。
sequence number:序列號(hào)税迷,占16位箭养,用于表示發(fā)送者所發(fā)送的RTP報(bào)文的序列號(hào)露懒,每發(fā)送一個(gè)報(bào)文砂心,序列號(hào)增1辩诞。這個(gè)字段當(dāng)下層的承載協(xié)議用UDP的時(shí)候,網(wǎng)絡(luò)狀況不好的時(shí)候可以用來檢查丟包撩炊。同時(shí)出現(xiàn)網(wǎng)絡(luò)抖動(dòng)的情況可以用來對(duì)數(shù)據(jù)進(jìn)行重新排序拧咳,序列號(hào)的初始值是隨機(jī)的骆膝,同時(shí)音頻包和視頻包的sequence是分別計(jì)數(shù)的。
timestamp:相對(duì)時(shí)間戳掐暮,占32位路克,反映了該RTP報(bào)文的第一個(gè)八位組的采樣時(shí)刻。接收者使用時(shí)戳來計(jì)算延遲和延遲抖動(dòng)瓢宦,并進(jìn)行同步控制刁笙。
SSRC:同步信源標(biāo)識(shí)符疲吸,占32位摘悴,用于標(biāo)志同步信源蹂喻。該標(biāo)識(shí)符是隨機(jī)選擇的口四,參加同一視頻會(huì)議的兩個(gè)同步信源不能有相同的SSRC蔓彩。
CSRC:特約信源標(biāo)志符赤嚼,每個(gè)CSRC標(biāo)識(shí)符占32位更卒,可以有0~15個(gè)蹂空。每個(gè)CSRC表示了包含在該RTP報(bào)文有效載荷中的所有特約信源腌闯。
2姿骏、RTP Payload
(1) 單個(gè)NALU包模式
PayloadHdr:?jiǎn)伟J较缕渲禐镠.265的NALU Header蘸泻。
NAL unit payload data:負(fù)載數(shù)據(jù)悦施。
示例:
[00 00 00 01 40 01 0c 01 ff ff 01 60 70 82......]
以上為一個(gè)H.265 NALU單元VPS,按單包封裝為RTP格式如下:
[RTP Header] [40 01 0c 01 ff ff 01 60 70 82......]
即NALU單元去掉開始頭去团,直接作為RTP Payload加上RTP Header進(jìn)行發(fā)送即可抡诞。
(2)分包模式
PayloadHdr:與H.265 NALU Header結(jié)構(gòu)一致,只是修改了其中的Type類型土陪,Type=49昼汗。
FU header:具體組成如下所示
S:1bit,值為1表示分包開始鬼雀,其余情況為0顷窒。
E:1bit,值為1表示分包結(jié)束源哩,其余情況為0鞋吉。
FUType:等于H.265 NALU Header中的Type類型。
[00 00 00 01 26 01 af 1d 78 06 90 ......]
開始包:
[RTP Header] [62 01 93 ......]
中間包:
[RTP Header] [62 01 13 ......]
結(jié)束包:
[RTP Header] [62 01 53 ......]
三谓着、H265封裝示例
讀取一個(gè)H.265文件却音,封裝為RTP協(xié)議格式進(jìn)行傳輸句灌,具體實(shí)現(xiàn)如下所示:
(1)單包模式
(2)分包模式
開始包:
中間包:
結(jié)束包