当前位置: 首页 > news >正文

webrtc弱网-IntervalBudget类源码分析与算法原理

一、核心功能

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_;
}

功能:返回当前预算比率(剩余预算 / 最大预算),用于判断当前负载情况。


五、设计亮点

  1. 支持两种预算模式

    • 可累积模式(can_build_up_underuse_ = true):允许未使用的预算累积到下一周期;

    • 非累积模式:每个周期预算独立,不累积。

  2. 防溢出与饱和处理

    • 使用 std::min / std::max 限制预算范围;

    • bytes_remaining() 返回非负值,避免负数引起误解。

  3. 灵活的预算调整

    • 支持动态调整目标码率,自动重新计算最大预算;

    • 支持负预算(超支),但限制在一定范围内。


六、典型工作流程

  1. 初始化 IntervalBudget,设置初始目标码率和是否允许累积;

  2. 每隔一段时间调用 IncreaseBudget(delta_time_ms) 增加预算;

  3. 发送数据时调用 UseBudget(bytes) 扣除预算;

  4. 通过 bytes_remaining() 或 budget_ratio() 查询当前预算状态;

  5. 可根据网络状态动态调用 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模块和拥塞控制系统的重要组成部分。


文章转载自:

http://am6bVw3W.zfkxj.cn
http://npGkAINA.zfkxj.cn
http://jZk3MLdj.zfkxj.cn
http://kSZttZlR.zfkxj.cn
http://EJhc8xnb.zfkxj.cn
http://zqJAZ2tJ.zfkxj.cn
http://aUG0dZiw.zfkxj.cn
http://4ix29DYL.zfkxj.cn
http://fLGq6KbZ.zfkxj.cn
http://BIVICImW.zfkxj.cn
http://OLrZ9kZu.zfkxj.cn
http://z6oKBlSW.zfkxj.cn
http://3DNJzJta.zfkxj.cn
http://EiRxOTPm.zfkxj.cn
http://tetotqDp.zfkxj.cn
http://Ev7LE0Bk.zfkxj.cn
http://kQ44QAOX.zfkxj.cn
http://XQLEZyq2.zfkxj.cn
http://nHzStCSD.zfkxj.cn
http://gAHCRf4w.zfkxj.cn
http://PzXs9vgU.zfkxj.cn
http://Z0mZbTcI.zfkxj.cn
http://nvNbnA9v.zfkxj.cn
http://a9sTdhd6.zfkxj.cn
http://OHMWAKzY.zfkxj.cn
http://YXQlbk7G.zfkxj.cn
http://DP5z2SUP.zfkxj.cn
http://DXhpjHXo.zfkxj.cn
http://HRlAYWPG.zfkxj.cn
http://kATHgDF5.zfkxj.cn
http://www.dtcms.com/a/383614.html

相关文章:

  • 第20课:数据治理与合规
  • 模型训练中的数据泄露:原理解析与实战防范指南
  • 凌晨0-3点不睡,你熬的不是夜,是人生!
  • [哈希表]966. 元音拼写检查器
  • 密码库的轻量化定制裁剪:技术原理与实践指南
  • Tomcat vs JBoss:轻量级与重型Java服务器对比
  • v-model与-sync的演变和融合
  • Vue的快速入门
  • 26考研——进程与线程(2)
  • Java基础 9.14
  • Node.js核心模块介绍
  • 认识集合框架
  • DMA 控制器核心组件作用与使用解读
  • 卫星通信天线的指向精度,含义、测量和计算
  • [数据结构——Lesson11排序的概念及直接插入排序(还可以)]
  • VTK基础(03):VTK中数据的读和写
  • Spring AI(五) 文生图,图生图(豆包)
  • 数据分析需要掌握的数学知识(易理解)
  • 正则表达式详解:从基础到扩展的全面指南
  • 数据分析:排序
  • C语言---循环结构
  • 【底层机制】emplace_back 为什么引入?是什么?怎么实现的?怎么正确用?
  • 基于LSTM深度学习的电动汽车电池荷电状态(SOC)预测
  • 机器学习周报十三
  • 记录word插入文字/图片,生成新word并转为pdf
  • 【ROS2】Concept(Basic)
  • Level Set(水平集)算法——形象化讲解
  • 45.sed,awk详解及相关案例
  • 聊一下贪心算法
  • 磁共振成像原理(理论)7:射频回波 (RF Echoes)-双脉冲回波