RTP包头扩展

RTP Header

RTP协议中,RTP Header(报头)包括固定报头(Fixed Header)与报头扩展(Header extension,可选)。

RTP Fixed Header结构如下,其中前12字节是每个RTP包必须包含的。


RTP Header Extension

如果RTP Fixed Header中,X字段为1,说明后面跟着RTP Header Extension。RTP Header Extension结构如下:

  • defined by profile:决定使用哪种Header Extension:one-byte或者two-byte header
  • length:表示Header Extension的长度:length x 4字节

One-Byte Header

对于One-Byte Header,"defined by profile"字段为固定的0xBEDE。接着后面的结构如下:

  • ID:4-bit长度的ID表示本地标识符
  • len:表示extension data长度,范围:0~15,为0表示长度为1字节,15表示16字节

 

首先是0xBEDE固定字段开头,接着length长度为3,说明后面跟着3x4字节长度的header extension 。对于第一个header extension:L=0,表示data长度为1字节。对于第二个header extension:L=1,表示data长度为2字节。由于按4字节对齐,所以接着是值为0的填充数据。最后一个header extension:L=3,表示data长度为4字节。 Defined by profile字段为0xBEDE,表示One-Byte Header,Extension length为1,表示Header Extension长度为1x4字节,对于Header Extension:ID为3,Lengh为2。

  • 构造相关代码位于RtpPacket::AllocateRawExtension
  • 解析相关代码位于RtpPacket::ParseBuffer

Two-Byte Header 

首先"defined by profile"字段为0x1000,length为3,后面跟着3x4字节长度扩展,对于第一个header extension:L=0,数据长度为0,对于第二个header extension:L=1,data长度为1,接着是填充数据,对于第三个header extension:L=4,后面跟着4字节长度数据。

由于WebRTC中默认都是One-Byte Header,所以就不抓包分析了,具体构造解析代码跟One-Byte Header位于同一地方。

常见RTP Header Extension

在WebRTC中定义了很多RTP Header Extension,最常见的要数用于带宽估计的Transport-CC扩展, 记录一个传输层的序列号:TransportSequenceNumber,默认每个RTP包都带有此扩展。

当然还有记录音量的AudioLevel扩展,记录发送时间的AbsoluteSendTime扩展等等。

enum RTPExtensionType : int {

  kRtpExtensionNone,

  kRtpExtensionTransmissionTimeOffset,

  kRtpExtensionAudioLevel,

  kRtpExtensionInbandComfortNoise,

  kRtpExtensionAbsoluteSendTime,

  kRtpExtensionAbsoluteCaptureTime,

  kRtpExtensionVideoRotation,

  kRtpExtensionTransportSequenceNumber,

  kRtpExtensionTransportSequenceNumber02,

  kRtpExtensionPlayoutDelay,

  kRtpExtensionVideoContentType,

  kRtpExtensionVideoLayersAllocation,

  kRtpExtensionVideoTiming,

  kRtpExtensionRtpStreamId,

  kRtpExtensionRepairedRtpStreamId,

  kRtpExtensionMid,

  kRtpExtensionGenericFrameDescriptor00,

  kRtpExtensionGenericFrameDescriptor = kRtpExtensionGenericFrameDescriptor00,

  kRtpExtensionGenericFrameDescriptor02,

  kRtpExtensionColorSpace,

  kRtpExtensionVideoFrameTrackingId,

  kRtpExtensionNumberOfExtensions

};

对于RFC中定义的RTP Header Extension,SDP格式如下:

1

a=extmap:<value> urn:ietf:params:rtp-hdrext:<extensionattributes>

对于WebRTC中自定义的RTP Header Extension,SDP格式如下:

1

a=extmap:<value> <URI>

猜你喜欢

转载自blog.csdn.net/Doubao93/article/details/122032526
RTP