RTP扩展头

386 阅读3分钟

RTP header中的“X”位如果置“1”, 则表示该header含有扩展信息. 扩展信息回存放在正常header尾部位置.

  • profile : 占2个字节

  • profile值为0xBE、0xDE, 说明扩展项的ID和len占1个字节, 即ID占4位 length占4位

  • profile值为0x10、0x0X(“X”表示任意数, 一般为“0”, 即0x00), 说明扩展项的ID和len占2个字节, 即ID占8位 length占8位

  • length : 表示后面跟着的扩展头信息有几个字节

  • 扩展头长度以4字节为单位

  • 例如: length = 3, 说明扩展头长度占12字节

不同字节长度的扩展头结构

  • profile值为0xBE、0xDE, header占一个字节, 这里说的header就是header exrension中的每一个扩展项的header

  • profile值为0x10、0x0X, header占两个字节, header解释同上

profile值为0xBE、0xDE的扩展头

  • profile值为 : 0xBE、0xDE 说明每一个扩展项的header占一个字节

  • length = 3 : 说明总的长度为12字节(3 * 4)

  • 每一个扩展项的length+1 表示后面data的真实长度, 例如L=0 , 表示data长度为(0+1)个字节

  • length=3, 即长度为12个字节, 但是3个扩展项总的数据只有10个字节, 所以末尾两个字节填充 0

profile值为0x10、0x0X的扩展头

  • profile值为 : 0x10、0x0X 说明每一个扩展项的header占两个字节

  • length = 3 : 说明总的长度为12字节(3 * 4)

  • 每一个扩展项的length表示后面data的真实长度, 例如L=0 , 表示data长度为0个字节, 这里与header为一个字节的扩展头是有区别的

  • 数据长度不足, 仍然用0在末尾填充

WebRTC用到的扩展头

  • 扩展头的详细信息 : src/api/rtp_parameters.h 中的Rtp Extension结构

  • 具体实现逻辑 : src/api/rtp_parameter.cc

  • 每个扩展项的具体含义 : src/modules/rtp_rtcp/source/rtp_header_extensions.cc

完整的RTP头

  • P : 表示是否有填充位信息

  • 如果有,说明不是32位对齐的, 存在空位用0填充

  • 填充长度要到最后一个字节:Padding Size 获取, 如果读取到Padding Size = 5, 表示填充长度为5个字节, 而且其中包括Padding Size本身

  • X : 表示是否有扩展头

  • 上图中的黄色区域为扩展信息的位置

  • 每一项扩展信息都会存放在header extension中

  • profile的值直接跟header extension中每一项扩展的header长度相关

  • length表示header extension的长度, 以4字节为一个单位

  • CC : Contributing source(SCRC)的个数

  • M : 表示该包为一帧数据分包之后的最后一个包

  • PT : 表示负载数据的类型: video/audio

  • Seq Number : 包的序列号, 在一定数值范围内循环线性递增

  • timestamp : 包的时间戳, 同一帧数据拆分的包的时间戳都相同

  • SSRC : 该包负载的数据源的标识