首先學(xué)習(xí)一下RTP/RTCP的基礎(chǔ)知識。
RTP/RTCP協(xié)議
RTP報頭
當(dāng)沒有CSRC時RTP報頭一共12個字節(jié)。
報頭格式如下:
版本號(V):2比特,用來標(biāo)志使用的RTP版本,當(dāng)前協(xié)議版本號為2。
填充位(P):1比特,如果P=1,則在該報文的尾部填充一個或多個額外的八位組,它們不是有效載荷的一部分。
擴(kuò)展位(X):1比特,如果X=1,RTP固定頭部后面就跟有一個擴(kuò)展頭部。
CSRC計數(shù)器(CC):4比特,表示含有固定頭部后面跟著幾個CSRC。
標(biāo)記位(M):1比特,該位的解釋由配置文檔(Profile)來承擔(dān)。不同的有效載荷有不同的含義,對于視頻,標(biāo)記一幀的結(jié)束;對于音頻,標(biāo)記會話的開始。(對于分組中的重要事件可用該位標(biāo)識)。
有效載荷類型(PT):7比特,標(biāo)識了RTP載荷的類型。比如H264視頻、AAC音頻等。
序列號(SN):16比特,發(fā)送方在每發(fā)送完一個RTP包后就將該域的值增加1,接收方可以由該域檢測包的丟失及恢復(fù)包序列。這個字段當(dāng)下層的承載協(xié)議用UDP的時候,網(wǎng)絡(luò)狀況不好的時候可以用來檢查丟包。同時出現(xiàn)網(wǎng)絡(luò)抖動的情況可以用來對數(shù)據(jù)進(jìn)行重新排序,序列號的初始值是隨機(jī)的,同時音頻包和視頻包的sequence是分別記數(shù)的。
時間戳:32比特,記錄了該包中數(shù)據(jù)的第一個字節(jié)的采樣時刻。在一次會話開始時,時間戳初始化成一個初始值。即使在沒有信號發(fā)送時,時間戳的數(shù)值也要隨時間而不斷地增加。時間戳是去除抖動和實現(xiàn)同步不可缺少的。
同步源標(biāo)識符(SSRC):32比特,同步源就是指RTP包流的來源。在同一個RTP會話中不能有兩個相同的SSRC值。該標(biāo)識符是隨機(jī)選取的,RFC1889推薦了MD5隨機(jī)算法。
當(dāng)上面CSRC計數(shù)器(CC)等于0時上面一共12字節(jié),當(dāng)大于0時有以下CSRC列表:
貢獻(xiàn)源列表(CSRC List):0~15項,每項32比特,用來標(biāo)志對一個RTP混合器產(chǎn)生的新包有貢獻(xiàn)的所有RTP包的源。由混合器將這些有貢獻(xiàn)的SSRC標(biāo)識符插入表中。SSRC標(biāo)識符都被列出來,以便接收端能正確指出交談雙方的身份。
SSRC代表會話中的一路數(shù)據(jù)流id,比如一個會話中的一個用戶有一路音頻和一路視頻,這時就有兩個不同的SSRC。
CSRC是在用到mixer混合(混音)時才會出現(xiàn),也就是說幾個源rtp包經(jīng)過mixer后,mixer會將他們各自的payload整合,并生成一個新的ssrc代替原來的各個ssrc,并且把他們各自的ssrc作為csrc插入新的rtp包中。
也就是說csrc的值為混合前每一路的ssrc。
CC是CSRC計數(shù),只有4位,表示一共有幾個CSRC。所以CSRC如果多于15個那最多只能有15個CSRC被標(biāo)識。
CSRC是為了在混音后指出當(dāng)前發(fā)言者。
有效載荷根據(jù)不同的音視頻類型有不同的打包方式。比如H264使用PS流封裝,MPEG2使用PES封裝。
RTCP
由于每個對話成員定期發(fā)送RTCP信息包,隨著參加者不斷增加,RTCP信息包頻繁發(fā)送將占用過多的網(wǎng)絡(luò)資源,為了防止擁塞,必須限制RTCP信息包的流量,控制信息所占帶寬一般不超過可用帶寬的 5%,因此就需要調(diào)整 RTCP包的發(fā)送速率。由于任意兩個RTP終端之間都互發(fā) RTCP包,因此終端的總數(shù)很容易估計出來,應(yīng)用程序根據(jù)參加者總數(shù)就可以調(diào)整RTCP包的發(fā)送速率。
RTCP封裝的僅僅是一些控制信息,因而分組很短,所以可以將多個RTCP分組封裝在一個UDP包中。
根據(jù)所攜帶的控制信息不同RTCP信息包可分為5類:
類型:200,SR 發(fā)送端報告
類型:201,RR 接收端報告
類型:202,SEDS 源描述包
類型:203,BYE 結(jié)束傳輸
類型:204,APP 應(yīng)用描述功能
SR和RR為報告包,比較重要,每個復(fù)合包的第一個包必須為SR或者RR,就算沒有SR/RR信息也應(yīng)該發(fā)一個空的報告包。
RTCP的詳細(xì)協(xié)議參考RFC3550,本文底部附有英文原版和中文版(不全)地址。
附
RFC3550英文版 - RTP: A Transport Protocol for Real-Time Applications
RFC3550 RTP 中文版
RTP協(xié)議全解析(H264碼流和PS流)