一. 核心功能
QualityScaler 是 WebRTC 中用于動態調整視頻編碼質量的模塊,主要功能包括:
QP 監控:持續監測編碼器輸出的量化參數(QP)
丟幀率分析:跟蹤媒體優化和編碼器導致的丟幀情況
自適應決策:根據 QP 和丟幀率觸發分辨率/幀率調整
異步任務調度:通過延遲任務實現周期性質量檢測
平滑處理:使用指數平滑算法減少 QP 波動影響
二. 核心算法原理
雙閾值決策機制:
當 QP > 高閾值時:觸發降級(降低分辨率/幀率)
當 QP ≤ 低閾值時:觸發升級(提高分辨率/幀率)
丟幀率保護:當總丟幀率 ≥ 60% 時強制降級
指數平滑濾波:
class QpSmoother {rtc::ExpFilter smoother_; // 指數平滑濾波器void Add(float sample) { smoother_.Apply(time_delta, sample); } }
動態采樣周期調整:
初始快速檢測(快速啟動階段)
根據歷史結果動態調整檢測間隔
公式:
delay = sampling_period_ms_ * scale_factor_
三. 關鍵數據結構
// QP 閾值結構體 struct QpThresholds {int low; // 低閾值(升級邊界)int high; // 高閾值(降級邊界) };// 質量檢測結果 enum class CheckQpResult {kInsufficientSamples, // 樣本不足kNormalQp, // QP正常kHighQp, // QP過高(需降級)kLowQp // QP過低(需升級) };// 平滑濾波器 class QpSmoother {rtc::ExpFilter smoother_; // 指數平滑實現int64_t last_sample_ms_; // 最后采樣時間 };
四. 核心方法詳解
質量檢測入口:
void StartNextCheckQpTask() {pending_qp_task_ = std::make_unique<CheckQpTask>(this);pending_qp_task_->StartDelayedTask(); // 啟動延遲檢測任務 }
QP檢測邏輯:
CheckQpResult CheckQp() const {// 1. 檢查樣本數量是否足夠(默認至少60幀)if (frames < min_frames_needed_) return kInsufficientSamples;// 2. 檢查丟幀率是否超標(≥60%)if (drop_rate >= kFramedropPercentThreshold) return kHighQp;// 3. 檢查QP是否超過閾值if (*avg_qp_high > thresholds_.high) return kHighQp;if (*avg_qp_low <= thresholds_.low) return kLowQp;return kNormalQp; }
平滑處理實現:
void QpSmoother::Add(float sample, int64_t time_sent_us) {int64_t now_ms = time_sent_us / 1000;// 應用指數平滑:新值 = α*當前值 + (1-α)*歷史值smoother_.Apply(now_ms - last_sample_ms_, sample);last_sample_ms_ = now_ms; }
五. 設計亮點
動態任務調度:
使用?
CheckQpTask
?實現自循環檢測根據歷史結果動態調整檢測頻率
快速啟動模式(fast_rampup_)加速初始檢測
雙通道平滑濾波:
qp_smoother_high_.reset(new QpSmoother(config_.alpha_high)); // 高閾值通道 qp_smoother_low_.reset(new QpSmoother(config_.alpha_low)); // 低閾值通道
使用不同的平滑系數分別處理高低閾值
字段試驗支持:
QualityScalerSettings settings(field_trials); // 從字段試驗獲取參數 sampling_period_ms_ = settings.SamplingPeriodMs().value_or(kMeasureMs);
允許通過字段試驗動態配置算法參數
丟幀分類統計:
void ReportDroppedFrameByMediaOpt(); // 媒體優化導致的丟幀 void ReportDroppedFrameByEncoder(); // 編碼器導致的丟幀
六. 典型工作流程
注釋精要
關鍵參數:
// 默認檢測周期(ms) static const int kMeasureMs = 2000; // 丟幀率閾值(%) static const int kFramedropPercentThreshold = 60;// 最小決策幀數(2秒數據) static const size_t kMinFramesNeededToScale = 2 * 30;
核心類說明:
// QP平滑處理器:使用指數平滑算法消除瞬時波動 class QpSmoother {// α值決定平滑強度:α越大,新值權重越高explicit QpSmoother(float alpha); };// 異步檢測任務:實現周期性的質量評估 class CheckQpTask {void StartDelayedTask(); // 啟動延遲檢測 };
自適應觸發邏輯:
void QualityScaler::CheckQp() {// 優先檢查丟幀率:超過60%立即降級if (*drop_rate >= 60) return kHighQp; // 雙通道平滑QP檢測if (high_smoothed_qp > high_thresh) return kHighQp;if (low_smoothed_qp <= low_thresh) return kLowQp; }
該模塊通過智能的QP分析和動態的任務調度,實現了視頻質量的自適應調整,在帶寬波動環境下保持視頻流暢性和清晰度的平衡。