webrtc弱网-BandwidthQualityScaler 源码分析与算法原理
一、核心功能
BandwidthQualityScaler
是 WebRTC 中用于动态调整视频编码分辨率的组件,通过监控编码比特率与预设分辨率比特率限制的匹配程度,自动触发视频质量的上调或下调。其核心功能是:
比特率监控:实时统计编码视频流的比特率
分辨率适配:根据当前分辨率对应的比特率限制阈值
动态调整:在带宽不足或过剩时触发分辨率调整
异步决策:通过定时任务定期执行检查
二、核心算法原理
比特率统计:
使用
RateStatistics
滑动窗口(默认 5s)计算平均比特率公式:bitrate = scale_/ active_window_size*accumulated_count_
分辨率-比特率映射:
通过
ResolutionBitrateLimits
结构定义不同分辨率(像素数)的比特率上下限:min_start_bitrate_bps
:分辨率启动所需最低比特率max_bitrate_bps
:分辨率支持的最高比特率
双阈值决策:
三、关键数据结构
ResolutionBitrateLimits(定义于 video_encoder.h):
struct ResolutionBitrateLimits {int frame_size_pixels; // 分辨率(宽*高)int min_start_bitrate_bps;// 最小启动比特率int min_bitrate_bps; // 持续传输最小比特率int max_bitrate_bps; // 最大支持比特率 };
核心类成员:
RateStatistics encoded_bitrate_; // 比特率统计器 absl::optional<int> last_frame_size_pixels_; // 最近帧分辨率 std::vector<VideoEncoder::ResolutionBitrateLimits> resolution_bitrate_limits_;
四、核心方法详解
1. 初始化 (BandwidthQualityScaler()
)
// 初始化参数从字段试验获取,无配置则用默认值 kBitrateStateUpdateInterval(TimeDelta::Seconds(BandwidthQualityScalerSettings::ParseFromFieldTrials().BitrateStateUpdateInterval().value_or(kDefaultBitrateStateUpdateIntervalSeconds))
2. 比特率检查 (CheckBitrate()
)
CheckBitrateResult BandwidthQualityScaler::CheckBitrate() {// 步骤1:检查数据完备性if (!last_frame_size_pixels_ || !last_time_sent_in_ms_) return kInsufficientSamples;// 步骤2:获取当前比特率(bps)absl::optional<int64_t> current_bitrate_bps = encoded_bitrate_.Rate(last_time_sent_in_ms_.value());// 步骤3:查找当前分辨率对应的比特率限制auto suitable_bitrate_limit = GetSinglecastBitrateLimitForResolutionWhenQpIsUntrusted(...);// 步骤4:阈值判定(关键算法)if (current_bitrate_bps > suitable_bitrate_limit->max_bitrate_bps * 0.95f)return kLowBitRate; // 需要降分辨率else if (current_bitrate_bps < suitable_bitrate_limit->min_start_bitrate_bps * 0.8f)return kHighBitRate; // 可升分辨率return kNormalBitrate; }
3. 定时任务 (StartCheckForBitrate()
)
void BandwidthQualityScaler::StartCheckForBitrate() {// 使用WeakPtr保证异步安全TaskQueueBase::Current()->PostDelayedTask([this_weak_ptr = weak_ptr_factory_.GetWeakPtr()] {if (!this_weak_ptr) return; // 对象已销毁则终止switch (CheckBitrate()) {case kHighBitRate: handler_->OnReportUsageBandwidthHigh(); break;case kLowBitRate: handler_->OnReportUsageBandwidthLow(); break;}StartCheckForBitrate(); // 递归调用实现周期检查},kBitrateStateUpdateInterval // 默认5s间隔); }
4. 数据上报 (ReportEncodeInfo()
)
void ReportEncodeInfo(int frame_size_bytes, int64_t time_sent_in_ms,uint32_t width, uint32_t height) {last_frame_size_pixels_ = width * height; // 存储分辨率encoded_bitrate_.Update(frame_size_bytes, time_sent_in_ms); // 更新统计 }
五、设计亮点
容忍因子机制:
kHigherMaxBitrateTolerationFactor=0.95
:避免在阈值边界抖动kLowerMinBitrateTolerationFactor=0.8
:防止过早触发升级
弱指针安全模型:
[this_weak_ptr = weak_ptr_factory_.GetWeakPtr()] {if (!this_weak_ptr) return; // 自动处理对象销毁
确保异步任务不会访问已销毁对象
动态配置接口:
void SetResolutionBitrateLimits(...);
允许运行时更新分辨率-比特率映射表
默认策略回退:
if (resolution_bitrate_limits.empty()) {resolution_bitrate_limits_ = GetDefault...(); }
保证无自定义配置时的基础功能
六、典型工作流程
七、注释精要
// 带宽质量调节器核心实现 void BandwidthQualityScaler::ReportEncodeInfo(int frame_size_bytes,int64_t time_sent_in_ms,uint32_t encoded_width,uint32_t encoded_height) {// 保存最近帧信息用于后续决策last_time_sent_in_ms_ = time_sent_in_ms;last_frame_size_pixels_ = encoded_width * encoded_height; // 计算像素面积encoded_bitrate_.Update(frame_size_bytes, time_sent_in_ms); // 更新比特率统计 }BandwidthQualityScaler::CheckBitrateResult BandwidthQualityScaler::CheckBitrate() {// 检查数据有效性if (!last_frame_size_pixels_ || !last_time_sent_in_ms_) return kInsufficientSamples;// 获取当前平均比特率(单位:bps)absl::optional<int64_t> current_bitrate_bps = encoded_bitrate_.Rate(last_time_sent_in_ms_.value());// 查找当前分辨率对应的比特率限制auto limit = GetSinglecastBitrateLimitForResolutionWhenQpIsUntrusted(last_frame_size_pixels_, resolution_bitrate_limits_);// 双阈值决策逻辑if (current_bitrate_bps > limit->max_bitrate_bps * 0.95f)return kLowBitRate; // 实际含义:带宽不足以维持当前分辨率else if (current_bitrate_bps < limit->min_start_bitrate_bps * 0.8f)return kHighBitRate; // 实际含义:带宽有富余可提升分辨率return kNormalBitrate; }
该模块通过智能的比特率-分辨率映射和双阈值缓冲机制,在保证视频质量的前提下,实现了带宽不足时的优雅降级和带宽充足时的质量提升,是 WebRTC 自适应视频流传输的核心组件之一。