webrtc弱网-QualityRampUpExperimentHelper类源码分析与算法原理
一、核心功能
QualityRampUpExperimentHelper
用于管理 质量提升实验(Quality Rampup Experiment),核心目标是在带宽充足时自动提升视频质量(如分辨率)。主要功能包括:
实验条件检测:监测带宽、编码器码率、QP值等关键指标
动态质量提升:满足条件时触发
OnQualityRampUp
回调状态管理:跟踪 CPU/分辨率适配历史
实验参数配置:支持运行时更新像素数/最大码率参数
二、核心算法原理
质量提升触发逻辑(PerformQualityRampupExperiment
):
带宽检测:当前带宽 > 实验阈值 (
BwHigh
)编码状态验证:
编码器目标码率 == 最大码率
QP值持续低位 (
QpFastFilterLow
)
历史适配检查:
发生过 QP 分辨率降级(
qp_resolution_adaptations_ > 0
)未发生 CPU 降级 (
!cpu_adapted_
)
三、关键数据结构
成员变量 | 类型 | 说明 |
---|---|---|
quality_rampup_experiment_ | QualityRampupExperiment | 存储实验参数和状态 |
cpu_adapted_ | bool | 标记是否发生过 CPU 降级 |
qp_resolution_adaptations_ | int | QP 分辨率降级次数 |
experiment_listener_ | QualityRampUpExperimentListener* | 质量提升回调接口 |
clock_ | Clock* | 时间管理 |
四、核心方法详解
(1) 工厂方法 CreateIfEnabled
// 仅在实验启用时创建实例 std::unique_ptr<QualityRampUpExperimentHelper> CreateIfEnabled(QualityRampUpExperimentListener* listener, Clock* clock) {QualityRampupExperiment experiment = QualityRampupExperiment::ParseSettings();return experiment.Enabled() ? std::make_unique<QualityRampUpExperimentHelper>(listener, clock, experiment) : nullptr; }
(2) 实验配置 ConfigureQualityRampupExperiment
void ConfigureQualityRampupExperiment(bool reset,absl::optional<uint32_t> pixels,absl::optional<DataRate> max_bitrate) {if (reset) quality_rampup_experiment_.Reset(); // 重置实验状态if (pixels && max_bitrate)quality_rampup_experiment_.SetMaxBitrate(*pixels, max_bitrate->kbps()); }
(3) 核心逻辑 PerformQualityRampupExperiment
void PerformQualityRampupExperiment(rtc::scoped_refptr<QualityScalerResource> quality_scaler_resource,DataRate bandwidth,DataRate encoder_target_bitrate,absl::optional<DataRate> max_bitrate) {// 检查前置条件if (!quality_scaler_resource->is_started() || !max_bitrate) return;const int64_t now_ms = clock_->TimeInMilliseconds();bool try_quality_rampup = false;// 条件1: 带宽充足if (quality_rampup_experiment_.BwHigh(now_ms, bandwidth.kbps())) {// 条件2: 码率最大且QP低位if (encoder_target_bitrate == *max_bitrate &&quality_scaler_resource->QpFastFilterLow()) {try_quality_rampup = true;}}// 条件3: 有QP降级历史且无CPU降级if (try_quality_rampup && qp_resolution_adaptations_ > 0 && !cpu_adapted_) {experiment_listener_->OnQualityRampUp(); // 触发质量提升} }
五、设计亮点
条件解耦设计:
带宽检测 (
BwHigh
) 封装在独立模块QP 检测委托给
QualityScalerResource
降级历史通过 setter 注入
运行时动态配置:
ConfigureQualityRampupExperiment(true, 1280*720, DataRate::kbps(2000));
安全触发机制:
必须存在 QP 降级记录才触发提升(防误触发)
排除 CPU 降级场景(保证系统稳定性)
零开销禁用:
工厂方法在实验关闭时返回
nullptr
避免不必要的资源占用
六、典型工作流程
关键交互:
视频引擎在分辨率变化时调用
ConfigureQualityRampupExperiment
适配模块在降级时更新
cpu_adapted_/
qp_resolution_adaptations_
带宽估计模块定期触发
PerformQualityRampupExperiment
满足条件时通知监听器执行质量提升操作