一、核心功能
IntervalBudget 类用于基于时间窗口的带宽预算管理。它根据设定的目标比特率(kbps)和一个固定时间窗口(500ms),计算在该时间窗口内可用的字节数(即“预算”),并支持预算的增加(随时间累积)和使用(发送数据时消耗)。该类可用于拥塞控制、码率调整等场景中,确保数据发送速率不超过目标速率。
二、核心算法原理
- 预算计算: 
 预算基于目标比特率和时间窗口(500ms)计算:
 - max_bytes_in_budget_ = (kWindowMs * target_rate_kbps_) / 8
 即:最大预算 = (500ms × 目标速率kbps) / 8(转换为字节)
- 预算累积(IncreaseBudget): 
 根据时间差- delta_time_ms计算应增加的预算字节数。- 若允许积累未使用预算( - can_build_up_underuse_为true),则将剩余预算累加,但不超过最大值;
- 否则,每个时间窗口的预算独立,不累积。 
 
- 预算消耗(UseBudget): 
 每发送一定字节数,就从剩余预算中扣除,但不能低于- -max_bytes_in_budget_(允许一定程度超支)。
三、关键数据结构
| 成员变量 | 类型 | 说明 | 
|---|---|---|
| target_rate_kbps_ | int | 目标比特率,单位kbps | 
| max_bytes_in_budget_ | int64_t | 时间窗口内的最大预算字节数 | 
| bytes_remaining_ | int64_t | 当前剩余预算字节数,可为负(表示超支) | 
| can_build_up_underuse_ | bool | 是否允许未使用的预算累积到下一个周期 | 
四、核心方法详解
1. 构造函数
IntervalBudget(int initial_target_rate_kbps, bool can_build_up_underuse)
    : bytes_remaining_(0), can_build_up_underuse_(can_build_up_underuse) {
  set_target_rate_kbps(initial_target_rate_kbps);
}
2. set_target_rate_kbps
void IntervalBudget::set_target_rate_kbps(int target_rate_kbps) {
  target_rate_kbps_ = target_rate_kbps;
  max_bytes_in_budget_ = (kWindowMs * target_rate_kbps_) / 8;
  bytes_remaining_ = std::min(std::max(-max_bytes_in_budget_, bytes_remaining_),
                              max_bytes_in_budget_);
}
功能:设置目标比特率,并重新计算最大预算,同时限制当前剩余预算在合理范围内。
3. IncreaseBudget
void IntervalBudget::IncreaseBudget(int64_t delta_time_ms) {
  int64_t bytes = target_rate_kbps_ * delta_time_ms / 8;
  if (bytes_remaining_ < 0 || can_build_up_underuse_) {
    bytes_remaining_ = std::min(bytes_remaining_ + bytes, max_bytes_in_budget_);
  } else {
    bytes_remaining_ = std::min(bytes, max_bytes_in_budget_);
  }
}
功能:根据时间差增加预算。若允许累积或之前超支,则累加;否则重置为本周期预算。
4. UseBudget
void IntervalBudget::UseBudget(size_t bytes) {
  bytes_remaining_ = std::max(bytes_remaining_ - static_cast<int>(bytes),
                              -max_bytes_in_budget_);
}
功能:使用预算,扣除相应字节数,防止超支过多。
5. bytes_remaining
size_t IntervalBudget::bytes_remaining() const {
  return rtc::saturated_cast<size_t>(std::max<int64_t>(0, bytes_remaining_));
}
功能:返回非负的剩余预算(超支时返回0)。
6. budget_ratio
double IntervalBudget::budget_ratio() const {
  if (max_bytes_in_budget_ == 0)
    return 0.0;
  return static_cast<double>(bytes_remaining_) / max_bytes_in_budget_;
}
功能:返回当前预算比率(剩余预算 / 最大预算),用于判断当前负载情况。
五、设计亮点
- 支持两种预算模式: - 可累积模式( - can_build_up_underuse_ = true):允许未使用的预算累积到下一周期;
- 非累积模式:每个周期预算独立,不累积。 
 
- 防溢出与饱和处理: - 使用 - std::min/- std::max限制预算范围;
- bytes_remaining()返回非负值,避免负数引起误解。
 
- 灵活的预算调整: - 支持动态调整目标码率,自动重新计算最大预算; 
- 支持负预算(超支),但限制在一定范围内。 
 
六、典型工作流程
- 初始化 - IntervalBudget,设置初始目标码率和是否允许累积;
- 每隔一段时间调用 - IncreaseBudget(delta_time_ms)增加预算;
- 发送数据时调用 - UseBudget(bytes)扣除预算;
- 通过 - bytes_remaining()或- budget_ratio()查询当前预算状态;
- 可根据网络状态动态调用 - set_target_rate_kbps()调整目标码率。
注释精要
interval_budget.h
// 带宽预算管理器,基于时间窗口(500ms)和目标码率进行预算控制
class IntervalBudget {
 public:
  explicit IntervalBudget(int initial_target_rate_kbps);
  IntervalBudget(int initial_target_rate_kbps, bool can_build_up_underuse);
  
  void set_target_rate_kbps(int target_rate_kbps);  // 设置目标码率(kbps)
  void IncreaseBudget(int64_t delta_time_ms);  // 增加预算,delta_time_ms 为时间差(毫秒)
  void UseBudget(size_t bytes);                 // 使用预算,bytes 为使用的字节数
  size_t bytes_remaining() const;               // 获取当前剩余预算(非负)
  double budget_ratio() const;                  // 获取预算比率(剩余预算/最大预算)
  int target_rate_kbps() const;                 // 获取当前目标码率
 private:
  int target_rate_kbps_;        // 目标码率(kbps)
  int64_t max_bytes_in_budget_; // 最大预算字节数(500ms窗口)
  int64_t bytes_remaining_;     // 当前剩余预算字节数(可为负)
  bool can_build_up_underuse_;  // 是否允许未使用的预算累积
};
interval_budget.cc
void IntervalBudget::IncreaseBudget(int64_t delta_time_ms) {
  int64_t bytes = target_rate_kbps_ * delta_time_ms / 8; // 计算应增加的字节数
  if (bytes_remaining_ < 0 || can_build_up_underuse_) {
    // 若当前超支或允许累积,则累加预算(不超过最大值)
    bytes_remaining_ = std::min(bytes_remaining_ + bytes, max_bytes_in_budget_);
  } else {
    // 否则,本周期的预算不超过当前时间窗口内的最大值
    bytes_remaining_ = std::min(bytes, max_bytes_in_budget_);
  }
}
IntervalBudget类在WebRTC中负责基于时间窗口的带宽预算管理,用于控制数据发送速率不超过设定的目标比特率。它通过500ms时间窗口将目标码率转换为字节预算,随时间推移累积预算,发送数据时扣除相应字节数。该类支持两种模式:可累积未使用预算或每周期独立预算,为拥塞控制和码率自适应算法提供关键的发送速率状态信息,确保网络流量平稳且避免拥塞,是pacing模块和拥塞控制系统的重要组成部分。