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

webrtc弱网-RembThrottler类源码分析及算法原理

         RembThrottler在WebRTC中承担REMB消息的智能节流控制角色。它通过双重节流机制(200ms时间窗口+3%变化阈值)来平衡带宽估计的准确性和控制信令的开销。当接收端带宽变化较小时抑制不必要的REMB发送,避免网络拥塞;当带宽显著下降或超过时间间隔时及时通知发送端调整码率。这种设计既确保了拥塞控制的实时性,又避免了因频繁发送控制消息而加重网络负担,在维持视频质量稳定性和网络效率间取得了重要平衡。

一. 核心功能

RembThrottler 是一个REMB消息节流器,主要用于:

  • 控制RTCP REMB(Receiver Estimated Maximum Bitrate)消息的发送频率

  • 防止因带宽估计频繁变化导致的过多REMB消息

  • 在带宽显著变化时及时通知发送端调整码率

二. 核心算法原理

采用时间窗口+变化阈值的双重节流机制:

  • 时间窗口:确保REMB消息发送间隔至少200ms

  • 变化阈值:只有带宽变化超过3%时才立即发送,避免微小波动

三. 关键数据结构

class RembThrottler : public RemoteBitrateObserver {private:const RembSender remb_sender_;           // REMB发送回调函数Clock* const clock_;                     // 时间时钟mutable Mutex mutex_;                    // 线程安全锁Timestamp last_remb_time_;               // 上次发送REMB的时间DataRate last_send_remb_bitrate_;        // 上次发送的REMB码率值DataRate max_remb_bitrate_;              // 最大允许的REMB码率
};

四. 核心方法详解

4.1 构造函数

RembThrottler::RembThrottler(RembSender remb_sender, Clock* clock): remb_sender_(std::move(remb_sender)),  // 保存REMB发送器clock_(clock),last_remb_time_(Timestamp::MinusInfinity()),      // 初始化为最小值last_send_remb_bitrate_(DataRate::PlusInfinity()), // 初始化为最大值max_remb_bitrate_(DataRate::PlusInfinity()) {}     // 初始化为最大值

4.2 接收码率变化处理

void RembThrottler::OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,uint32_t bitrate_bps) {DataRate receive_bitrate = DataRate::BitsPerSec(bitrate_bps);Timestamp now = clock_->CurrentTime();{MutexLock lock(&mutex_);// 节流条件:如果码率增长不超过3%且在200ms时间窗口内,则抑制发送const int64_t kSendThresholdPercent = 103;if (receive_bitrate * kSendThresholdPercent / 100 >last_send_remb_bitrate_ &&now < last_remb_time_ + kRembSendInterval) {return;  // 满足节流条件,不发送REMB}// 更新发送时间和码率last_remb_time_ = now;last_send_remb_bitrate_ = receive_bitrate;// 确保发送码率不超过最大限制receive_bitrate = std::min(last_send_remb_bitrate_, max_remb_bitrate_);}// 实际发送REMB消息remb_sender_(receive_bitrate.bps(), ssrcs);
}

4.3 设置最大期望接收码率

void RembThrottler::SetMaxDesiredReceiveBitrate(DataRate bitrate) {Timestamp now = clock_->CurrentTime();{MutexLock lock(&mutex_);max_remb_bitrate_ = bitrate;  // 更新最大码率限制// 节流检查:如果在时间窗口内且上次发送码率已满足要求,则抑制发送if (now - last_remb_time_ < kRembSendInterval &&!last_send_remb_bitrate_.IsZero() &&last_send_remb_bitrate_ <= max_remb_bitrate_) {return;}}// 发送新的REMB消息(空SSRC列表表示应用到所有流)remb_sender_(bitrate.bps(), /*ssrcs=*/{});
}

五. 设计亮点

  1. 双重节流机制:结合时间窗口和变化阈值,平衡了响应速度和网络负载

  2. 线程安全:使用互斥锁保护共享状态,确保多线程环境下的安全性

  3. 回调模式:通过RembSender函数对象实现松耦合,便于测试和扩展

  4. 资源优化:避免频繁的小幅度码率调整,减少不必要的网络开销

  5. 边界处理:合理处理初始状态和极端值情况

六. 典型工作流程

1. 接收端带宽估计模块检测到可用带宽变化
2. 调用OnReceiveBitrateChanged()传入新的带宽估计值
3. 节流器检查:- 如果距离上次发送<200ms且变化<3%,抑制发送- 否则,更新内部状态并发送REMB消息
4. 应用层可能通过SetMaxDesiredReceiveBitrate()设置最大限制
5. 节流器确保发送的REMB码率不超过应用层限制
6. 通过回调函数实际发送RTCP REMB包到发送端

这个设计在WebRTC中起到了重要的流量控制作用,既保证了带宽变化的及时反馈,又避免了因频繁发送控制消息而产生的额外网络负担。

http://www.dtcms.com/a/515376.html

相关文章:

  • 鸿蒙的声明式 UI转换为 JSView
  • 【MySQL】从零开始了解数据库开发 --- 如何理解事务隔离性
  • BugKu Web渗透之 never_give_up
  • Cangjie语言核心技术深度解析测评:迈进鸿蒙原生开发的安全新时代!
  • 长乐市住房和城乡建设局网站网站开发公司的推广费用
  • 绵阳住房和城乡建设部网站网站页面优化怎么做
  • 关于git的使用(在gitee和gitcode上部署自己的项目流程)
  • PHP 字符串操作详解
  • 3合一网站怎么做免费数据统计网站
  • 17.基础IO_3
  • Ubuntu 系统掉电导致分区损坏无法启动修复方案
  • 相机模组,模组是什么意思?
  • 申威架构ky10安装php-7.2.10.rpm详细步骤(国产麒麟系统64位)
  • STM32F407 通用定时器
  • lodash-es
  • 股票交易网站建设四会市城乡规划建设局网站
  • API技术深度解析:从基础原理到最佳实践
  • 西安今晚12点封城吗龙岩网站优化
  • 使用有限体积法求解双曲型守恒性方程(一)FV 框架
  • jenkins流水线部署springboot项目
  • YOLOv5:目标检测的实用派王者
  • 《工业之心:Blender 工业场景解构》
  • 【Linux网络】应用层自定义协议
  • unity免费改名工具-Mulligan Renamer
  • Git分支的多人协作
  • 服务外包网站成都住建局官网app
  • 【ABAP函数】+ALSM_EXCEL_TO_INTERNAL_TABLE批导长字段
  • 艺术学院网站模板wordpress二手车模板
  • docker api 常用接口
  • flutter鸿蒙:实现类似B站或抖音的弹幕功能