webrtc弱網-QualityScaler 源碼分析與算法原理

一. 核心功能

QualityScaler 是 WebRTC 中用于動態調整視頻編碼質量的模塊,主要功能包括:

  1. QP 監控:持續監測編碼器輸出的量化參數(QP)

  2. 丟幀率分析:跟蹤媒體優化和編碼器導致的丟幀情況

  3. 自適應決策:根據 QP 和丟幀率觸發分辨率/幀率調整

  4. 異步任務調度:通過延遲任務實現周期性質量檢測

  5. 平滑處理:使用指數平滑算法減少 QP 波動影響

二. 核心算法原理

  1. 雙閾值決策機制

    • 當 QP > 高閾值時:觸發降級(降低分辨率/幀率)

    • 當 QP ≤ 低閾值時:觸發升級(提高分辨率/幀率)

  2. 丟幀率保護:當總丟幀率 ≥ 60% 時強制降級

  3. 指數平滑濾波

    class QpSmoother {rtc::ExpFilter smoother_;  // 指數平滑濾波器void Add(float sample) { smoother_.Apply(time_delta, sample); }
    }
  4. 動態采樣周期調整

    • 初始快速檢測(快速啟動階段)

    • 根據歷史結果動態調整檢測間隔

    • 公式: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_;   // 最后采樣時間
};

四. 核心方法詳解

  1. 質量檢測入口

    void StartNextCheckQpTask() {pending_qp_task_ = std::make_unique<CheckQpTask>(this);pending_qp_task_->StartDelayedTask();  // 啟動延遲檢測任務
    }
  2. 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;
    }
  3. 平滑處理實現

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

五. 設計亮點

  1. 動態任務調度

    • 使用?CheckQpTask?實現自循環檢測

    • 根據歷史結果動態調整檢測頻率

    • 快速啟動模式(fast_rampup_)加速初始檢測

  2. 雙通道平滑濾波

    qp_smoother_high_.reset(new QpSmoother(config_.alpha_high));  // 高閾值通道
    qp_smoother_low_.reset(new QpSmoother(config_.alpha_low));    // 低閾值通道

    使用不同的平滑系數分別處理高低閾值

  3. 字段試驗支持

    QualityScalerSettings settings(field_trials);  // 從字段試驗獲取參數
    sampling_period_ms_ = settings.SamplingPeriodMs().value_or(kMeasureMs);

    允許通過字段試驗動態配置算法參數

  4. 丟幀分類統計

    void ReportDroppedFrameByMediaOpt();  // 媒體優化導致的丟幀
    void ReportDroppedFrameByEncoder();   // 編碼器導致的丟幀

六. 典型工作流程

注釋精要

  1. 關鍵參數

    // 默認檢測周期(ms)
    static const int kMeasureMs = 2000; // 丟幀率閾值(%)
    static const int kFramedropPercentThreshold = 60;// 最小決策幀數(2秒數據)
    static const size_t kMinFramesNeededToScale = 2 * 30;
  2. 核心類說明

    // QP平滑處理器:使用指數平滑算法消除瞬時波動
    class QpSmoother {// α值決定平滑強度:α越大,新值權重越高explicit QpSmoother(float alpha); 
    };// 異步檢測任務:實現周期性的質量評估
    class CheckQpTask {void StartDelayedTask();  // 啟動延遲檢測
    };
  3. 自適應觸發邏輯

    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分析和動態的任務調度,實現了視頻質量的自適應調整,在帶寬波動環境下保持視頻流暢性和清晰度的平衡。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94227.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven 快照(SNAPSHOT)

Maven 快照(SNAPSHOT) 引言 Maven 快照(SNAPSHOT)是 Maven 中的一個重要概念,主要用于版本管理。它允許開發者在構建過程中使用尚未發布的版本。本文將詳細介紹 Maven 快照的原理、用途以及如何在項目中配置和使用快照。 Maven 快照原理 Maven 快照是版本號的一部分,…

2025-0803學習記錄20——畢業論文快速整理成小論文

本科畢業論文寫好啦&#xff0c;但是C導要我整理成一篇約8000字的小論文&#xff0c;準備投稿。畢業論文到投稿的小論文&#xff0c;這其實是從“全景展示”到“聚焦精煉”的過程。目前我已經有完整的大論文&#xff08;約6萬字&#xff09;&#xff0c;材料是充足的&#xff0…

VUE2 學習筆記16 插槽、Vuex

插槽在編寫組件時&#xff0c;可能存在這種情況&#xff0c;頁面需要顯示不同的內容&#xff0c;但是頁面結構是類似的&#xff0c;在這種情況下&#xff0c;雖然也可以使用傳參來進行&#xff0c;但傳參時&#xff0c;還需要編寫props等邏輯&#xff0c;略顯重復&#xff0c;而…

IntelliJ IDEA開發編輯器摸魚看股票數據

在IDEA的插件市場中心搜索stock&#xff0c;檢索結果里面的插件&#xff0c;點擊安裝即可安裝后的效果

Linux Deepin深度操作系統應用商店加載失敗,安裝星火應用商店

Linux Deepin國產操作系統優點 Deepin&#xff08;原名Linux Deepin&#xff09;是一款由中國團隊開發的Linux發行版&#xff0c;基于Debian stable分支&#xff0c;以美觀易用的界面和本土化體驗著稱。以下是其核心優點總結&#xff1a; 1. 極致美觀的界面設計 Deepin Deskt…

postgresql創建只讀用戶并授權

postgresql創建只讀用戶并授權 CREATE USER yk WITH ENCRYPTED PASSWORD <your_password>;GRANT USAGE ON SCHEMA public to yk; GRANT SELECT ON ALL TABLES IN SCHEMA public TO yk;根據以上創建的用戶&#xff0c;出現一個問題&#xff0c;對新建的表沒有查詢權限&am…

pytest vs unittest: 區別與優缺點比較

主要區別特性pytestunittest起源第三方庫Python標準庫語法風格更簡潔的Pythonic語法基于Java風格的JUnit測試發現自動發現測試需要繼承TestCase類斷言方式使用Python原生assert使用各種assert方法(assertEqual等)夾具系統強大的fixture系統簡單的setUp/tearDown方法參數化測試內…

Boost.Asio學習(5):c++的協程

協程是什么&#xff1f;協程就是可以“暫停”和“繼續”的函數&#xff0c;像在函數里打個斷點&#xff0c;然后以后可以從斷點繼續運行&#xff0c;而不是重新開始。線程 vs 協程&#xff1a;類比想象你在寫小說&#xff1a;線程&#xff1a;你開了 3 個作者&#xff08;線程&…

Linux 中,命令查看系統版本和內核信息

在 Linux 中&#xff0c;可以通過以下命令查看系統版本和內核信息&#xff1a;1. 查看內核版本uname -a或精簡顯示&#xff1a;uname -r # 只顯示內核版本示例輸出&#xff1a;Linux ubuntu 5.4.0-135-generic #152-Ubuntu SMP Tue Nov 15 08:12:21 UTC 2022 x86_64 x86_64 x8…

數據結構總綱以及單向鏈表詳解:

以下是基于筆記更詳細的知識梳理&#xff0c;從概念到細節逐層拆解&#xff0c;幫你吃透數據結構核心要點&#xff1a; 數據結構部分的重點內容&#xff1a;一、數據結構基礎框架 &#xff08;一&#xff09;邏輯結構&#xff08;關注元素間“邏輯關系”&#xff09; 筆記里提到…

模型學習系列之參數

背景 “GLM-4.5擁有 3550 億總參數量&#xff0c;其中 320 億活躍參數&#xff1b;GLM-4.5-Air 采用更緊湊的設計&#xff0c;擁有 1060 億總參數量&#xff0c;其中 120 億活躍參數。” 定義與關系 總參數量&#xff1a;模型中所有可訓練參數的總和&#xff08;包括嵌入層、注…

[創業之路-535]:軟件需要原型驗證、產品需要原型驗證、商業模式也需要原型驗證

原型驗證在軟件、產品開發以及商業模式探索中均扮演著至關重要的角色&#xff0c;它通過低成本、快速迭代的方式&#xff0c;幫助團隊驗證核心假設、降低風險并優化方案。以下是針對這三個領域的具體分析&#xff1a;一、軟件原型驗證&#xff1a;從概念到可交互的模型核心目的…

sublime text2配置

sublime text2配置背景配置其他背景 之前下載了就把它當記事本在使用。但是&#xff0c;在使用過程中&#xff0c;有些場景很痛苦。如果說找一個字符串中的某一部分&#xff0c;雖然它通過了這個功能&#xff0c;但是不夠明顯&#xff0c;看瞎了。。。 配置 下面是我改的一些選…

本地通信的選擇:為什么組播比廣播更適合多進程協作?

零、深入解析Linux本地通信機制,對比廣播與組播的核心差異 本地組播能讓多進程收到消息,而本地廣播不行,核心原因在于兩者的設計目標、網絡協議處理邏輯以及內核轉發機制存在本質差異。具體可以從以下幾個角度理解: 1. 通信模式與目標地址的本質區別 組播(Multicast):…

7-Django項目實戰[user]-發送郵件激活賬號

1.前期準備&#xff08;以QQ郵箱為例&#xff09; 登錄QQ郵箱 獲取授權碼 2.settings.py文件配置 1&#xff09;緩存配置 # 配置緩存 CACHES {# 郵件激活隨機數"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION&q…

社群團購市場選擇與開源技術賦能下的下沉市場開拓策略研究——以開源AI智能名片、鏈動2+1模式與S2B2C商城小程序為例

摘要&#xff1a;在社群團購行業面臨流量成本攀升與同質化競爭的背景下&#xff0c;下沉市場因其龐大用戶基數與未被充分滿足的消費需求&#xff0c;成為創業者突破增長瓶頸的關鍵賽道。本文以拼多多成功開拓小城鎮與農村市場的案例為切入點&#xff0c;結合開源AI智能名片、鏈…

Ollama前端:open-webui

github&#xff1a;https://github.com/open-webui/open-webui 官網&#xff1a;&#x1f3e1; Home | Open WebUI 1、docker安裝&#xff08;GPU&#xff09;&#xff1a; docker run -d -p 3000:8080 --gpusall -v ollama:/root/.ollama -v open-webui:/app/backend/data …

LeetCode513:找樹最左下角的值(bfs+dfs)

文章目錄一、 題目描述解法一&#xff1a;層序遍歷 (BFS) - 最直觀的解法核心思路代碼實現優缺點分析解法二&#xff1a;遞歸 (DFS) - 更深度的思考核心思路代碼實現優缺點分析四、 總結與對比LeetCode 513 - 尋找樹的最后一行的最左側的值&#xff0c;【難度&#xff1a;中等&…

把“評論”菜單從WordPress后臺移除的3種方法

在WordPress后臺移除“評論”菜單&#xff0c;可以通過以下幾種方法實現。以下是詳細步驟&#xff1a; 方法1&#xff1a;通過代碼移除(推薦) 將以下代碼添加到主題的functions.php文件中(或使用CodeSnippets插件)&#xff1a; // 移除后臺左側菜單的“評論” add_action(ad…

大語言模型 LLM 通過 Excel 知識庫 增強日志分析,根因分析能力的技術方案(4):只要過一遍LLM的簡約版本

文章大綱 只要過一遍LLM的簡約版本 1 設計原理(一句話) 2 極簡數據流 3 最小依賴實現(本地 SQLite + OpenAI 兼容端點) 3.1 一次性準備:Excel → SQLite 3.2 關鍵詞提取 + 查表(正則 / SQL) 3.3 單次 LLM 調用 4 運行結果示例 5 性能 & Token 對比 6 可擴展點 7 參考…