Remote Bitrate Estimator

Abstract

远端比特率估计器

Authors

Walter Fan

Status

v1.0

Updated

2026-08-17

概述

RemoteBitrateEstimator 是 WebRTC 接收端带宽估计的核心组件。 它通过分析接收到的 RTP 包的到达时间和大小,估算网络可用带宽, 并检测网络是否过载(Overuse)。

在 GCC(Google Congestion Control)算法中,它属于 基于延迟的估计器(Delay-based estimator), 与发送端的基于丢包估计器协同工作。

        flowchart TD
  subgraph Recv[接收端]
    RTP[RTP 包到达] --> IA["InterArrival<br/>计算包间到达时间差和发送时间差"]
    IA --> OE["OveruseEstimator<br/>Kalman 滤波估计传播延迟斜率"]
    OE --> OD["OveruseDetector<br/>Normal / Overuse / Underuse"]
    OD --> AIMD["AimdRateControl<br/>AIMD 调整估计比特率"]
    AIMD --> FB["通过 REMB / TWCC 反馈给发送端"]
  end
    

带宽使用状态

enum class BandwidthUsage {
    kBwNormal = 0,      // 正常:可以适度增加发送率
    kBwUnderusing = 1,  // 欠载:网络有余量
    kBwOverusing = 2,   // 过载:网络拥塞,必须降低发送率
    kLast
};

核心接口

class RemoteBitrateEstimator : public CallStatsObserver, public Module {
public:
    // 每收到一个 RTP 包时调用
    // 更新带宽估计和过载检测
    virtual void IncomingPacket(int64_t arrival_time_ms,
                                size_t payload_size,
                                const RTPHeader& header) = 0;

    // 移除指定 SSRC 的流数据
    virtual void RemoveStream(uint32_t ssrc) = 0;

    // 获取最新的带宽估计值
    virtual bool LatestEstimate(std::vector<uint32_t>* ssrcs,
                                uint32_t* bitrate_bps) const = 0;

    // 设置最小比特率下限
    virtual void SetMinBitrate(int min_bitrate_bps) = 0;

protected:
    static const int64_t kProcessIntervalMs = 500;   // 处理间隔
    static const int64_t kStreamTimeOutMs = 2000;     // 流超时
};

关键子模块

InterArrival

计算包组(packet group)的到达时间差和发送时间差:

send_delta    = send_time[i] - send_time[i-1]
arrival_delta = arrival_time[i] - arrival_time[i-1]
delay_delta   = arrival_delta - send_delta
  • delay_delta > 0:包在网络中排队时间增加,可能过载

  • delay_delta < 0:包在网络中排队时间减少,网络有余量

  • delay_delta 0:网络稳定

OveruseEstimator

使用 Kalman 滤波器 对 delay_delta 序列进行平滑估计, 输出传播延迟的斜率(offset),过滤掉噪声和突发抖动。

OveruseDetector

将 Kalman 滤波器的输出与自适应阈值比较:

  • offset > thresholdOveruse

  • offset < -thresholdUnderuse

  • 其他 → Normal

阈值本身也是自适应的,会根据网络状况动态调整。

AimdRateControl

根据检测结果调整估计比特率(AIMD = Additive Increase Multiplicative Decrease):

  • Overuse:比特率 *= 0.85(乘性降低,快速退让)

  • Normal/Underuse:比特率 += increment(加性增加,缓慢探测)

这与 TCP 的 AIMD 拥塞控制思想一致。

新旧版本演进

版本

机制

说明

旧版

REMB (Receiver Estimated Maximum Bitrate)

接收端估计带宽,通过 RTCP REMB 反馈给发送端

新版

TWCC (Transport-Wide Congestion Control)

接收端只反馈包到达时间,带宽估计移到发送端

现代 WebRTC 主要使用 TWCC,发送端的 SendSideBandwidthEstimation 取代了 接收端的 RemoteBitrateEstimator。但理解 RemoteBitrateEstimator 的算法原理 对掌握 GCC 仍然至关重要,因为核心算法(InterArrival → Kalman → AIMD)未变。

详见 WebRTC REMB CodeTransport-wide Congestion Control

参考资料