WebRTC m79中的RTP padding

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(
            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包

  1. 为了方便理解,这里通过padding包的构成不同,简单将之分为两类:纯padding包、部分padding同时带有音视频数据RTP包
  2. RTP头中的padding标志了本RTP包中一定包含了Padding数据,同时也可能包含了真实的负载数据
  3. RTP音视频负载长度payload_size_ = 总长度 - RTP头及扩展长度 - Padding长度
  4. payload_size_> 0为有效数据包, payload_size_== 0为纯padding包

 

你可能感兴趣的:(webrtc)