一、rtp包头格式
V:版本号,必须为2
P:填充位
X:扩展位,标志是否存在扩展
CC:CSRC个数
M:Mark标志位,标志是否是一帧的结束,音频帧几乎每个包都是一个完整的帧,所以M一般情况都等于1,视频包因为一帧比较大,会被分为几个包发送,最后一个包标志需要Mark一下。
sequence number:包序号,发送端指定一个起始序号(如果不指定则随机一个),然后每个包的序号依次递增;如果存在RTX,重发是此序号是rtx的序号。
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_header_extensions.cc。
一、rtp扩展头定义
RTPExtensionType
二、协议介绍
还没有理清各个扩展类型,如下三个扩展类型,找到对应的RFC协议,其余感觉是私有定义的。
kRtpExtensionTransmissionTimeOffset
含义:一个包相对于采集时间的偏移的滴答数
协议:RFC 5450 - Transmission Time Offsets in RTP Streams
- kRtpExtensionAudioLevel的rfc协议
含义:一帧音频数据的分贝值
协议:https://tools.ietf.org/html/rfc6465
代码实现函数:RTPSenderAudio::SendAudio
- kRtpExtensionTransportSequenceNumber的rfc协议】
- 含义:扩展序号,不管是第一次发送还是重发的包,此需要都会递增
draft-holmer-rmcat-transport-wide-cc-extensions-01
代码实现函数: RTPSender::UpdateTransportSequenceNumber
- kRtpExtensionAbsoluteSendTime
- 含义:一个包的绝对发送时间。
参数:RTPSender::SendToNetwork
视频帧方向:
- kRtpExtensionPlayoutDelay
- 含义:已经播放时长
RtpExtensionVideoContentType
含义:视频源是否是屏幕资源。
- kRtpExtensionVideoTiming
含义:记录视频编码开始,编码结束,打包完成,平滑发送等时间戳,不过这几个时间戳都是相对时间。
三、视频净荷格式
264 RTP打包格式:
webrtc 代码走读三(h264 rtp打包)_EveryDayOneHour的博客-CSDN博客