WebRTC RTP 解析

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的空幀作為心跳包碳柱。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者熬芜。
  • 序言:七十年代末莲镣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涎拉,更是在濱河造成了極大的恐慌瑞侮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼓拧,死亡現(xiàn)場離奇詭異半火,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)季俩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門钮糖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酌住,你說我怎么就攤上這事店归。” “怎么了酪我?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵消痛,是天一觀的道長。 經(jīng)常有香客問我都哭,道長秩伞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任欺矫,我火速辦了婚禮纱新,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘穆趴。我一直安慰自己脸爱,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布毡代。 她就那樣靜靜地躺著阅羹,像睡著了一般勺疼。 火紅的嫁衣襯著肌膚如雪教寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天执庐,我揣著相機(jī)與錄音酪耕,去河邊找鬼。 笑死轨淌,一個胖子當(dāng)著我的面吹牛迂烁,可吹牛的內(nèi)容都是我干的看尼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盟步,長吁一口氣:“原來是場噩夢啊……” “哼藏斩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起却盘,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狰域,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后黄橘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兆览,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年塞关,在試婚紗的時候發(fā)現(xiàn)自己被綠了抬探。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡帆赢,死狀恐怖小压,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椰于,我是刑警寧澤场航,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站廉羔,受9級特大地震影響溉痢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜憋他,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一孩饼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竹挡,春花似錦镀娶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至好啰,卻和暖如春轩娶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背框往。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工鳄抒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓许溅,卻偏偏與公主長得像瓤鼻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贤重,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354