RTP 報文定義
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| Contributing source (CSRC) identifiers |
| .... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| header eXtension profile id | length in 32bits |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Extensions |
| .... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| Payload |
| .... : padding... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| padding | Padding size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
可將RTP報文分為以下幾個部分:
序號 | 名稱 | 比特位 | 必選 | 說明 |
---|---|---|---|---|
1 | 固定報頭 | 12*8 | 是 | 包括標(biāo)志位:V、P蝶棋、X、CC忽妒、M玩裙、PT、 sequence number段直、timestamp吃溅、SSRC。 |
2 | 特約信源 | CC*32 | 否 | 每個CSRC占32位鸯檬,可以有0~15個决侈。 |
3 | 擴(kuò)展報文 | len*32 | 否 | 其中 len >= 0。 |
4 | 負(fù)載數(shù)據(jù) | len*8 | 否 | 其中 len >= 0喧务,例如H264編碼后的視頻 數(shù)據(jù)赖歌,或OPUS編碼后的音頻數(shù)據(jù)。 |
5 | 填充數(shù)據(jù) | len*8 | 否 | 其中 len >= 0功茴,自定義數(shù)據(jù)庐冯。 |
固定報頭
序號 | 標(biāo)記 | 比特位 | 名稱 | 說明 |
---|---|---|---|---|
1 | V | 2 | 版本號 | 目前版本值固定為2 。 |
2 | P | 1 | 填充標(biāo)志 | 若值為1坎穿,則在報文尾部填充 若干大于零的額外字節(jié)展父。 |
3 | X | 1 | 擴(kuò)展標(biāo)志 | 若值為1,則在報文頭后跟一個擴(kuò)展報文玲昧。 |
4 | CC | 4 | 特約信源(CSRC)計數(shù)器 | 指示 CSRC 標(biāo)識符的個數(shù)犯祠。 |
5 | M | 1 | 標(biāo)記位 | 對于視頻,標(biāo)記一幀的結(jié)束酌呆;對于音頻衡载, 標(biāo)記負(fù)載類型改變。 |
6 | PT | 7 | 負(fù)載類型 | 取值范圍小于128隙袁,可自定義取值含義痰娱, 例如H264定義為96弃榨。 |
7 | SEQ | 16 | 序列號 | 標(biāo)記數(shù)據(jù)報文序列號。 |
8 | TS | 32 | 時間戳(Timestamp) | 標(biāo)記媒體數(shù)據(jù)的采樣時間梨睁。 |
9 | SSRC | 32 | 同步信源(SSRC)標(biāo)識符 | 隨機(jī)生成的數(shù)字鲸睛,標(biāo)記一路數(shù)據(jù)來源。 |
- 固定報頭大小為12字節(jié)坡贺,所以一幀合法的RTP報文最少包含12個字節(jié)的數(shù)據(jù)官辈。
- 序列號:標(biāo)識發(fā)送的RTP報文的序列號,每發(fā)送一個報文遍坟,序列號增1拳亿。UDP發(fā)送數(shù)據(jù)時,可用來檢測丟包愿伴、亂序等問題肺魁。序列號的初始值隨機(jī),且音頻包和視頻包分別記數(shù)隔节。
- 時間戳:視頻時間戳單位為 90kHz 時鐘頻率鹅经,例如視頻采樣時間為MS=1589341659000毫秒,則時間戳為TS=MS*90怎诫。對于8kHz采樣的音頻信號瘾晃,若每隔20ms發(fā)送一個數(shù)據(jù)包,則一個數(shù)據(jù)包中包含有160個樣本(0.02×8000=160)幻妓,因此每發(fā)送一個RTP包蹦误,時間戳的值就增加160。
特約信源(CSRC)
- 場景描述:在一個4人音視頻會議中涌哲,每個發(fā)送端發(fā)送一路數(shù)據(jù)胖缤,則此時有SSRC1尚镰、SSRC2阀圾、SSRC3、SSRC4作為數(shù)據(jù)源狗唉;若媒體服務(wù)器對音頻進(jìn)行混音后轉(zhuǎn)發(fā)初烘,則媒體服務(wù)器將SSRC1、SSRC2分俯、SSRC3肾筐、SSRC4填入CSRC字段,標(biāo)識該路混音數(shù)據(jù)由四個來源貢獻(xiàn)缸剪;同時媒體服務(wù)器新生成一個隨機(jī)數(shù)作為該路流的SSRC吗铐。
- 通過上述場景描述可發(fā)現(xiàn),特約信源往土里說其實就是標(biāo)記流來源的標(biāo)識(可簡單理解為用戶ID)杏节,最終來源為發(fā)送端生成的隨機(jī)數(shù)唬渗,和SSRC本質(zhì)上是同一個東西典阵。
擴(kuò)展報文(Extensions)
RTP header extension, RFC 3550.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| defined by profile | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| header extension |
| .... |
序號 | 名稱 | 比特位 | 說明 |
---|---|---|---|
1 | Profile | 16 | 擴(kuò)展報文類型,值固定為 0xBEDE或0x1000镊逝。 |
2 | Length | 16 | 擴(kuò)展報文長度壮啊,值為Extensions/4 (例如Extensions=12,則Length=3)撑蒜。 |
3 | Extensions | Length * 16 | 擴(kuò)展報文定義內(nèi)容歹啼,4字節(jié)對齊, 若不足4字節(jié)則在Extensions末尾填充零值補(bǔ)齊座菠, 解析時根據(jù)對齊原則自動減掉補(bǔ)齊的零值狸眼。 |
- 當(dāng)擴(kuò)展標(biāo)志(X)值為1時,在RTP固定報頭后跟有一個擴(kuò)展報頭辈灼。
- 若報文中包含CSRC份企,則擴(kuò)展報頭跟在CSRC之后。
單字節(jié)模式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0xBE | 0xDE | length=3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ID | L=0 | data | ID | L=1 | data...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...data | 0 (pad) | 0 (pad) | ID | L=3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
序號 | 名稱 | 比特位 | 說明 |
---|---|---|---|
1 | ID | 4 | 取值范圍[1,14]最大有效值為14巡莹,若ID為15則忽略并終止解析司志。 |
2 | L | 4 | Data長度減一(即: L=len(Data) - 1, 例如0表示Data長度為1)降宅。取值范圍 [0,15]骂远。 |
3 | Data | (L+1)*8 | 擴(kuò)展消息內(nèi)容。 |
- 單字節(jié)模式起始值固定為0xBEDE
- 因為第一版的 rfc5285 定義時間是圣比德節(jié)腰根,所以用了BEDE的名字作為標(biāo)記(the first version of this specification was written on the day of the Venerable Bede)激才。
- 例如,WebRTC中的AbsoluteSendTime定義如下(一個包的絕對發(fā)送時間):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ID | len=2 | absolute send time |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
雙字節(jié)模式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0x10 | 0x00 | length=3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ID | L=0 | ID | L=1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data | 0 (pad) | ID | L=4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
序號 | 名稱 | 比特位 | 說明 |
---|---|---|---|
1 | ID | 8 | |
2 | L | 8 | Data長度 L >= 0额嘿,0表示后面沒有數(shù)據(jù) 瘸恼。 |
3 | Data | L*8 | 擴(kuò)展消息內(nèi)容。 |
- 雙字節(jié)模式起始值固定為0x1000
負(fù)載數(shù)據(jù)(Payload)
- 用來承載音視頻編碼后的媒體數(shù)據(jù)册养。
- 負(fù)載數(shù)據(jù)大小通常小于1400东帅,以避免整個RTP報文超過UDP最大MTU(1500)導(dǎo)致網(wǎng)絡(luò)丟包的問題。
- 負(fù)載數(shù)據(jù)大星蚶埂:Payload = Size - Head - CSRC - Extensions - Padding(即:負(fù)載數(shù)據(jù)大小 = RTP報文總大小 - 固定報頭大小 - CSRC大小 - 擴(kuò)展報文大小 - 填充數(shù)據(jù)大锌勘铡)。
填充數(shù)據(jù)(Padding)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| padding | Padding size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
序號 | 名稱 | 比特位 | 說明 |
---|---|---|---|
1 | Padding(PD) | len*8 | padding坎炼,填充的自定義數(shù)據(jù),len為自定義的長度 |
2 | Padding Size (PZ) | 8 | padding size愧膀,填充的自定義數(shù)據(jù)大小, 當(dāng)P設(shè)置為1后谣光,PZ值必須大于0檩淋。 |
- 填充數(shù)據(jù)由PD和PZ兩部分構(gòu)成,PZ = PD字節(jié)數(shù) + PZ字節(jié)數(shù)(即:PZ = len(PD) + 1)萄金。
- 填充的數(shù)據(jù)內(nèi)容自定義蟀悦,例如在WebRTC中每隔500毫秒發(fā)送一幀PZ為1的空幀作為心跳包碳柱。