音視頻傳輸協(xié)議(RTSP/RTP/RTCP)(十三)

前言

RTP/RTCP協(xié)議設(shè)計(jì)用來(lái)傳輸音視頻數(shù)據(jù),對(duì)應(yīng)的RFC文檔為:RFC3550,對(duì)應(yīng)的中文版RFC3550中文版

RTP被定義為在一對(duì)一或者一對(duì)多的傳輸情況下工作,其目的是為了提供時(shí)間信息和實(shí)現(xiàn)流同步。RTP的典型應(yīng)用是建立在UDP上的,也可以建立在TCP等其它協(xié)議之上進(jìn)行工作,一般將其看作傳輸層的一部分,位于UDP層之上,應(yīng)用層之下,它不保證數(shù)據(jù)傳輸?shù)目煽啃?/p>

RTCP為RTP提供服務(wù)質(zhì)量保證,其主要功能為:服務(wù)質(zhì)量的監(jiān)視與反饋、媒體間的同步,以及多播組中成員的標(biāo)識(shí)。RTCP協(xié)議是基于每隔一段時(shí)間給會(huì)話(huà)的所有參與者發(fā)送一些控制包的機(jī)制。RTCP包中包含有已發(fā)送的數(shù)據(jù)包的數(shù)量、丟失的數(shù)據(jù)包的數(shù)量等統(tǒng)計(jì)資料,從而各參與者可以利用這些信息動(dòng)態(tài)的改變傳輸速率。

RTP數(shù)據(jù)包構(gòu)成

RTP數(shù)據(jù)包一般由:Header+有效載荷數(shù)據(jù):構(gòu)成,Header一般為12字節(jié),有效載荷數(shù)據(jù)則可以是音頻數(shù)據(jù),h264碼流,PS碼流等等

  • RTP頭部組成
    頭部一般至少包含12個(gè)固定字節(jié),也包括若擴(kuò)展干字節(jié)。

1字節(jié) V(2bit)+P(1bit)+X(1bit)+CC(4bit) 2字節(jié)M(1bit)+PT(7bit) 3 4字節(jié)SN(序列號(hào)) 5 6 7 8字節(jié)timestamp(4字節(jié)) 9 10 11 12字節(jié)SSRC[13 14 15 16字節(jié)CSRC(4字節(jié),可選 可以有多個(gè),數(shù)量為前面CC的值大小)....] [擴(kuò)展頭部...當(dāng)前面X==1時(shí)才有]

如下圖片,其中當(dāng)CC的值大于0時(shí),CSRC為擴(kuò)展字節(jié)。


image.png

1、版本號(hào)(V):占2位,用來(lái)標(biāo)志使用的RTP版本。
2、填充位(P):占1位,如果P=1,則該RTP包的尾部包含附加的填充字節(jié)。3、作用是為了字節(jié)對(duì)齊,填充字節(jié)的數(shù)量保存在最后一個(gè)字節(jié)中
4、擴(kuò)展位(X):占1位,如果X=1,則RTP固定頭部后面就跟有一個(gè)擴(kuò)展頭部,即上面的CSRC信息
5、CSRC計(jì)數(shù)器(CC):占4位,指示 CSRC標(biāo)識(shí)符的數(shù)量。
標(biāo)記位(M):占1位,當(dāng)M=1時(shí),對(duì)于視頻流, 它表示一幀的結(jié)束,而對(duì)于音頻,則表示一次談話(huà)的開(kāi)始。
6、載荷類(lèi)型(PT):占7位,標(biāo)識(shí)了RTP載荷的類(lèi)型,比如是視頻還是音頻類(lèi)型
7、序列號(hào)(SN):占16位,發(fā)送方在每發(fā)送完一個(gè)RTP包后就將該域的值增加1,接收方可以由該域檢測(cè)包的丟失及恢復(fù)包序列。序列號(hào)的初始值是隨機(jī)的。
8、時(shí)間戳(timestamp):占32位,記錄了該包中數(shù)據(jù)的第一個(gè)字節(jié)的采樣時(shí)刻。在一次會(huì)話(huà)開(kāi)始時(shí),時(shí)間戳初始化成一個(gè)初始值(隨機(jī)生成)。即使在沒(méi)有信號(hào)發(fā)送時(shí),時(shí)間戳的數(shù)值也要隨時(shí)間而不斷地增加。時(shí)間戳是去除抖動(dòng)和實(shí)現(xiàn)同步不可缺少的。
9、同步源標(biāo)識(shí)符(SSRC):占32位,用來(lái)表示RTP包的類(lèi)型,每次開(kāi)啟新的流會(huì)話(huà)該值都會(huì)變化
10、特約信源(CSRC):每個(gè)CSRC標(biāo)識(shí)符占32位,可以有0~15個(gè),每個(gè)CSRC 標(biāo)識(shí)了包含在該RTP報(bào)文有效載荷中的所有特約信源。當(dāng)CC>0時(shí)有此信息擴(kuò)展信息XXXX:定義的擴(kuò)展信息,當(dāng)X為1時(shí)有此信息

  • 抖動(dòng)和丟包率

1、端到端延遲:端到端延遲=數(shù)據(jù)包的接收時(shí)間-數(shù)據(jù)包的發(fā)送時(shí)間;
3、抖動(dòng)率=(數(shù)據(jù)包P↓[j]的延遲-數(shù)據(jù)包P↓[i]的延遲)/(數(shù)據(jù)包P↓[j]的序號(hào)j-數(shù)據(jù)包P↓[i]的序號(hào)i)

數(shù)據(jù)包P↓[j]的延遲=數(shù)據(jù)包P↓[j]接收時(shí)間-數(shù)據(jù)包P↓[j]發(fā)送時(shí)間
數(shù)據(jù)包P↓[i]的延遲=數(shù)據(jù)包P↓[i]接收時(shí)間-數(shù)據(jù)包P↓[i]發(fā)送時(shí)間

4、吞吐量:?jiǎn)挝粫r(shí)間內(nèi),某個(gè)節(jié)點(diǎn)發(fā)送和接收的數(shù)據(jù)量,單位一般是b/s
5、丟包率:指測(cè)試中所丟失數(shù)據(jù)包數(shù)量占所發(fā)送數(shù)據(jù)包的比率。丟包率與數(shù)據(jù)包長(zhǎng)度以及包發(fā)送頻率相關(guān)
6、關(guān)于延遲和抖動(dòng)
延遲是不可避免的,而抖動(dòng)是可以通過(guò)某些技術(shù)方案優(yōu)化的,常見(jiàn)于緩沖技術(shù)

RTCP數(shù)據(jù)包的構(gòu)成

RTCP一般和RTP建立在同一連接的端口對(duì)上,一般在創(chuàng)建RTP/RTCP連接時(shí),會(huì)創(chuàng)建一對(duì)端口,其中偶數(shù)端口給RTP使用,奇數(shù)端口給RTCP使用。RTP和RTCP使用相同的連接方式(TCP/UDP)

RTCP數(shù)據(jù)包有多種類(lèi)型,如下:


image.png

各種類(lèi)型的RTCP包前面的8個(gè)字節(jié)是固定的,后面的則根據(jù)包類(lèi)型有所區(qū)別,具體參考文檔 RFC3550,這里以接收端RR報(bào)文為例:

image.png

1字節(jié)V(2bit)+P(1bit)+RC(5bit) 2字節(jié)PT(8bit) 3 4字節(jié)(lenght)+5 6 7 8字節(jié)SSRC+報(bào)告塊1(SSRC_1,24字節(jié))+......報(bào)告塊n(SSRC_N,24字節(jié))

V:2bit,RTCP版本,一般為2
P: 1bit,如果為1,則說(shuō)明在RTCP尾部會(huì)有填充直接,填充字節(jié)長(zhǎng)度為RTCP最后一個(gè)字節(jié)的值
RC:5bit,本RTCP報(bào)文中報(bào)告塊的個(gè)數(shù),不超過(guò)32。每一路流都會(huì)建立一個(gè)報(bào)告塊,比如如果同時(shí)包含音頻流,視頻流,則會(huì)建立兩個(gè)報(bào)告塊
PT:1字節(jié),RTCP類(lèi)型,比如201就為RR
length:2字節(jié),整個(gè)RTCP報(bào)文的長(zhǎng)度
SSRC:4字節(jié),唯一標(biāo)識(shí)該RTCP

以上是所有RTCP報(bào)文的固定字節(jié),以下是報(bào)告塊的結(jié)構(gòu),每一個(gè)報(bào)告塊結(jié)構(gòu)都相同,個(gè)數(shù)由前面的RC的值決定

SSRC_n:4字節(jié),報(bào)告塊的SSRC,與RTP對(duì)應(yīng)

fraction lost:1字節(jié),上次 RR 發(fā)送之后,從 SSRC_n 源的 RTP 報(bào)文丟包率(該值除以 256 則得到百分比的丟包率),如果有RTP包重傳機(jī)制,則計(jì)算的丟失部分有可能是負(fù)數(shù),這里要處理讓其為0。

cumulative number of packets lost:24 bits,從接收開(kāi)始,SSRC_n 源的 RTP 報(bào)文丟失的數(shù)量。定義為期望的減去實(shí)際接收的,其中接收的包括遲到的和復(fù)制的,如果有復(fù)制,丟失可能為負(fù)。期望的報(bào)文定義為由上次接收的序列號(hào)延伸出的序列號(hào)減去接收到的初始序列號(hào)。

extended highest sequence number received:32 bits
低 16 位包含從源 SSRC_n 接收到的 RTP 數(shù)據(jù)報(bào)文中最高的序列值、高16位表示循環(huán)的次數(shù)

interarrival jitter:32 bits
關(guān)于 RTP 數(shù)據(jù)報(bào)文 interarrival 時(shí)間的統(tǒng)計(jì)方差的估值,以 timestamp 單元來(lái)估值,表現(xiàn)為無(wú)符號(hào)整數(shù)。interarrival jitter J 定義為 D 的均方差,D為接收者和發(fā)送者的間隔。像下面方程所示,等于兩個(gè)報(bào)文的“相對(duì)傳輸時(shí)間”(the relative transit time) 的差;相對(duì)傳輸時(shí)間是一個(gè)報(bào)文的 RTP timestamp 和到達(dá)接收者的時(shí)鐘的差,在相同單元衡量。

last SR timestamp (LSR):32 bits NTP timestamp的中間 32 位作為從源 SSRC_n 來(lái)的最近的 RTCPSR。如果尚未接收到 SR,域設(shè)置為零。

delay since last SR (DLSR):32 bits延遲定義為從接收到從源 SSRC_n 來(lái)的上一個(gè) SR 到發(fā)送本接收?qǐng)?bào)告塊的間隔,表示為 1/65536 秒一個(gè)單元。如果尚未收到 SR,DLSR 域設(shè)置為零

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容