webrtc代码走读七(rtp包格式)
一、rtp包头格式
V:版本号,必须为2
P:填充位
X:扩展位,标志是否存在扩展
CC:CSRC个数
M:Mark标志位,标志是否是一帧的结束,音频帧几乎每个包都是一个完整的帧,所以M一般情况都等于1,视频包因为一帧比较大,会被分为几个包发送,最后一个包标志需要Mark一下。
PT:负载类型,不同的负载类型对应不同的编解码类型(音频根据采样率和通道不同都要对应不同的负载类型),FEC类型等。
sequence number:包序号,发送端指定一个起始序号(如果不指定则随机一个),然后每个包的序号依次递增;如果存在RTX,重发是此序号是rtx的序号,详情请看RTPSender::SendPadData的实现
timestamp:时间戳,如果一个视频帧被分为几个包,则这个帧对应的几个包的时间戳是一样的;发送端可以指定一个起始时间戳timestamp_offset_(如果不指定则随机一个),然后每个帧的时间戳等于起始时间戳加上采集时间戳timestamp_offset_ + capture_timestamp,详情可以看RTPSender::SendOutgoingData的实现
SSRC:同步源的唯一标识,每一个源(音频或者视频,文件)都必须要有一个唯一的标识码,用于区分不同的流
CSRC:贡献源,列举此SSRC的资源是由多少个其他的资源(其他资源的SSRC)混合而来的。例如MCU混音之后就需要修改这个;最多只能表示15源
如果存在RTP扩展则标志位X必须置为1,除了标准扩展外,WebRTC还有自己的扩展,所以服务端如果使用标准rtp解析库需要添加一下WebRTC的RTP扩展。扩展相关的文件有rtp_header_extensions.h和rtp_utility.cc。
RTP扩展头定义如下:
webrtc支持的扩展类型(就是上图中的ID值)如下:
二、协议介绍
还没有理清各个扩展类型,如下三个扩展类型,找到对应的RFC协议,其余感觉是私有定义的。
- kRtpExtensionTransmissionTimeOffset
含义:一个包相对于采集时间的偏移的滴答数
协议:https://tools.ietf.org/html/rfc5450
代码实现函数:RTPSender::SendToNetwork
- kRtpExtensionAudioLevel的rfc协议
含义:一帧音频数据的分贝值
协议:https://tools.ietf.org/html/rfc6465
代码实现函数:RTPSenderAudio::SendAudio
- kRtpExtensionTransportSequenceNumber的rfc协议
含义:扩展序号,不管是第一次发送还是重发的包,此需要都会递增
https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
代码实现函数: RTPSender::UpdateTransportSequenceNumber
- kRtpExtensionAbsoluteSendTime
含义:一个包的绝对发送时间。
参数:RTPSender::SendToNetwork
- kRtpExtensionVideoRotation
含义:帧视频帧的方向。
参数:
- kRtpExtensionPlayoutDelay
含义:已经播放时长
参数:
- kRtpExtensionVideoContentType
含义:视频源是否是屏幕资源。
参数:
- kRtpExtensionVideoTiming
含义:记录视频编码开始,编码结束,打包完成,平滑发送等时间戳,不过这几个时间戳都是相对时间。
参数:
如下三个未知。
- kRtpExtensionRtpStreamId
- kRtpExtensionRepairedRtpStreamId
- kRtpExtensionMid
三、wireshark抓包示例
四、视频净荷格式
请参见:
264 RTP打包格式:https://blog.****.net/CrystalShaw/article/details/81538207
Vp8 RTP打包格式:https://blog.****.net/CrystalShaw/article/details/81289617