1 为什么需要padding
- 启动网络探测时,需要实际发送数据,PacedSender模块请求发送Padding
- 网络状态突变时会启动网络探测
- 实际编码带宽低于预测带宽,PacedSender执行发送时检测到发送数据量低于本次基于带宽预估分配的数据量,不足的部分发送padding
- 每500ms发送一个心跳包,padding_size = 1
2 Padding的生成
核心业务逻辑在RTPSender::GeneratePadding(), 这里有两种模式: RTX模式、普通模式,区别:WebRTC的NACK和RTX简述
两种模式下的区别
- RTX: 如果启用RTX, WebRTC会从历史发送的packet中取一包数据,把类型改为padding,直到请求的padding_size用尽,并且使用RTX通道专用的序列号序列
- 普通模式:生成新的RTP Padding包,长度范围: 50 - 224字节,超过224分段发,通常224字节满额发送,原因如下
if (audio_configured_) { // Allow smaller padding packets for audio. padding_bytes_in_packet = rtc::SafeClamp<size_t>( bytes_left, kMinAudioPaddingLength, rtc::SafeMin(max_payload_size, kMaxPaddingLength)); } else { // Always send full padding packets. This is accounted for by the // RtpPacketSender, which will make sure we don't send too much padding even // if a single packet is larger than requested. // We do this to avoid frequently sending small packets on higher bitrates. padding_bytes_in_packet = rtc::SafeMin(max_payload_size, kMaxPaddingLength); }
bool RtpPacket::SetPadding(size_t padding_bytes)接口会设置padding标志和padding中的长度信息
3 解析padding包
- 为了方便理解,这里通过padding包的构成不同,简单将之分为两类:纯padding包、部分padding同时带有音视频数据RTP包
- RTP头中的padding标志了本RTP包中一定包含了Padding数据,同时也可能包含了真实的负载数据
- RTP音视频负载长度payload_size_ = 总长度 - RTP头及扩展长度 - Padding长度
- payload_size_> 0为有效数据包, payload_size_== 0为纯padding包