天天看點

RTP協定--圖文解釋

一、什麼是RTP

資料傳輸協定RTP,用于實時傳輸資料。RTP封包由兩部分組成:報頭和有效載荷。

RTP協定--圖文解釋

二、RTP的會話過程

當應用程式建立一個RTP會話時,應用程式将确定一對目的傳輸位址。目的傳輸位址由一個網絡位址和一對端口組成,有兩個端口:一個給RTP包,一個給RTCP包,使得RTP/RTCP資料能夠正确發送。RTP資料發向偶數的UDP端口,而對應的控制信号RTCP資料發向相鄰的奇數UDP端口(偶數的UDP端口+1),這樣就構成一個UDP端口對。 RTP的發送過程如下,接收過程則相反。

1)RTP協定從上層接收流媒體資訊碼流(如H.263),封裝成RTP資料包;

2)RTCP從上層接收控制資訊,封裝成RTCP控制包。

2)RTP将RTP 資料包發往UDP端口對中偶數端口;RTCP将RTCP控制包發往UDP端口對中的接收端口。

三、RTP Header解析

RTP協定--圖文解釋

前12位元組是固定的,CSRC可以有多個或者0個。

1)V:RTP協定的版本号,占2位,目前協定版本号為2

2)P:填充标志,占1位,如果P=1,則在該封包的尾部填充一個或多個額外的八位組,它們不是有效載荷的一部分

3)X:擴充标志,占1位,如果X=1,則在RTP報頭後跟有一個擴充報頭

4)CC:CSRC計數器,占4位,訓示CSRC辨別符個數

5)M:标志,占1位,不同的有效載荷有不同的含義,對于視訊,标記一幀的結束;對于音頻,标記會話的開始。

6)PT(payload type):有效荷載類型,占7位,用于說明RTP封包中有效載荷的類型,如GSM音頻、JPEM圖像等,在流媒體中大部分是用來區分音頻流和視訊流,這樣便于用戶端進行解析。

7)序列号:占16位,用于辨別發送者所發送的RTP封包的序列号,每發送一個封包,序列号增1。這個字段當下層的承載協定用UDP的時候,網絡狀況不好的時候可以用來檢查丢包。當出現網絡抖動的情況可以用來對資料進行重新排序。序列号的初始值是随機的,同時音頻包和視訊包的sequence是分别計數的。

8)時戳(Timestamp):占32位,必須使用90kHZ時鐘頻率(程式中的90000)。時戳反映了該RTP封包的第一個八位組的采樣時刻。接受者使用時戳來計算延遲和延遲抖動,并進行同步控制。可以根據RTP包的時間戳來獲得資料包的時序。

9)同步信源(SSRC)辨別符:占32位,用于辨別同步信源。同步信源是指産生媒體流的信源,他通過RTP報頭中的一個32為數字SSRC辨別符來辨別,而不依賴網絡位址,接收者将根據SSRC辨別符來區分不同的信源,進行RTP封包的分組。

10)提供信源(CSRC)辨別符:每個CSRC辨別符占32位,可以有0~15個CSRC。每個CSRC辨別了包含在RTP封包有效載荷中的所有提供信源。

下方資料+更多音視訊資料免費領取,背景私信扣1

RTP協定--圖文解釋

提供信源用來辨別對一個RTP混合器産生的新包有貢獻的所有RTP包的源。是指當混合器接收到一個或多個同步信源的RTP封包後,經過混合處理産生一個新的組合RTP封包,并把混合器作為組合RTP封包的SSRC,将原來所有的SSRC都作為CSRC傳送給接收者,是接受者知道組成組合封包的各個SSRC。

RTP協定--圖文解釋

把前兩位元組 80 e0 換成二進制如下

1000 0000 1110 0000

按順序解釋如下:

10 是V;

0 是P;

0 是X;

0000 是CC;

1 是M;

110 0000 是PT;

四、RTP載荷H264碼流:紅色RTP協定頭,黃色H264碼流

RTP協定--圖文解釋

RTP頭後是RTP載荷,RTP載荷第一個位元組格式跟NALU頭一樣:

RTP協定--圖文解釋

F和NRI也跟NALU頭一樣,隻有Type有些不一樣:拓展24 – 31

0 沒有定義

1-23 NAL單元 單個 NAL 單元包.

24 STAP-A 單一時間的組合包

25 STAP-B 單一時間的組合包

26 MTAP16 多個時間的組合包

27 MTAP24 多個時間的組合包

28 FU-A 分片的單元

29 FU-B 分片的單元

30-31 沒有定義

1) 單個NAL單元包:荷載中隻包含一個NAL單元。NAL頭類型域等于原始 NAL單元(NALU)類型,即Type在範圍1到23之間。

2)組合包:本類型用于聚合多個NAL單元到單個RTP荷載中。本包有四種版本,單時間聚合包類型A(STAP-A)單時間聚合包類型B(STAP-B),多時間聚合包類型(MTAP)16位位移(MTAP16),多時間聚合包類型(MTAP)24位位移(MTAP24)。賦予STAP-A,STAP-B,MTAP16,MTAP24的NAL單元類型号(Type)分别是24 25 26 27

3)分片包:用于分片單個NAL單元到多個RTP包。現存兩個版本FU-A,FU-B,用NAL單元類型(Type)28 29辨別

常用的打包時的分包規則:如果小于MTU采用單個NAL單元包,如果大于MTU就采用FUs分片方式

五、單個NAL單元包格式

RTP協定--圖文解釋

對于NALU(NAL單元)的長度小于MTU大小的包,一般采用單一NAL單元模式

定義在此的NAL單元包必須隻包含一個。RTP序号必須符合NAL單元的解碼順序。這種情況下,NAL單元的第一位元組和RTP荷載頭第一個位元組重合。如上圖所示。

對于一個原始H264的NALU單元常由[start code] [NALU Header] [NALU Payload]三部分組成,其中start code用于辨別這是一個NALU單元的開始,必須是“00 00 00 01”或“00 00 01”,NALU頭僅一個位元組,其後都是NALU單元載荷。

打包時去除“00 00 01”或“00 00 00 01”的開始碼,把其他資料封裝成RTP包即可。

如有一個 H.264 的 NALU 是這樣的:

[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]

這是一個序列參數集 NAL 單元。 [00 00 00 01] 是四個位元組的開始碼, 67 是 NALU 頭, 42 開始的資料是 NALU 載荷.

封裝成 RTP 包将如下:

[ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ... ]

即隻要去掉 4 個位元組的開始碼就可以了.

六、組合封包格式

當NALU的長度特别小時,可以把幾個NALU單元封在一個RTP包中

RTP協定--圖文解釋

七、分片單元(FU-A)

RTP協定--圖文解釋

當NALU的長度超過MTU時,就必須對NALU單元進行分片封包,也稱為Fragmentation Units (FUs)NAL單元的一個分片由整數個連續NAL單元位元組組成。每個NAL單元位元組必須正好是該NAL單元一個分片的一部分。

作者:指 紋