WebRTC RTP 解析

2020-05-12  本文已影响0人  满衣兄

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 包括标志位:V、P、X、CC、M、PT、
sequence number、timestamp、SSRC。
2 特约信源 CC*32 每个CSRC占32位,可以有0~15个。
3 扩展报头 len*32 其中 len >= 0。
4 负载数据 len*8 其中 len >= 0,例如H264编码后的视频
数据,或OPUS编码后的音频数据。
5 填充数据 len*8 其中 len >= 0,自定义数据。

固定报头

序号 标记 比特位 名称 说明
1 V 2 版本号 目前版本值固定为2 。
2 P 1 填充标志 若值为1,则在报文尾部填充
若干大于零的额外字节。
3 X 1 扩展标志 若值为1,则在报文头后跟一个扩展报头。
4 CC 4 特约信源(CSRC)计数器 指示 CSRC 标识符的个数。
5 M 1 标记位 对于视频,标记一帧的结束;对于音频,
标记负载类型改变。
6 PT 7 负载类型 取值范围小于128,可自定义取值含义,
例如H264定义为96。
7 SEQ 16 序列号 标记数据报文序列号。
8 TS 32 时间戳(Timestamp) 标记媒体数据的采样时间。
9 SSRC 32 同步信源(SSRC)标识符 随机生成的字符串,标记一路数据来源。

特约信源(CSRC)

扩展报头(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 扩展报文类型,值固定为 0xBEDE或0x1000。
2 Length 16 扩展报文长度,值为Extensions/4
(例如Extensions=12,则Length=3)。
3 Extensions Length * 16 扩展报文定义内容,4字节对齐,
若不足4字节则在Extensions末尾填充零值补齐,
解析时根据对齐原则自动减掉补齐的零值。
单字节模式
 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 最大有效值为14,若ID为15则忽略并终止解析。
2 L 4 Data长度减一(即: L=len(Data) - 1,
例如0表示Data长度为1)。取值范围 [0,15]。
3 Data (L+1)*8 扩展消息内容。
 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               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
双字节模式
 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表示后面没有数据 。
3 Data L*8 扩展消息内容。

负载数据(Payload)

填充数据(Padding)

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               padding         | Padding size  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
序号 名称 比特位 说明
1 Padding(PD) len*8 padding,填充的自定义数据,len为自定义的长度
2 Padding Size (PZ) 8 padding size,填充的自定义数据大小,
当P设置为1后,PZ值必须大于0。
上一篇下一篇

猜你喜欢

热点阅读