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

一、核心功能

IntervalBudget?類用于基于時間窗口的帶寬預算管理。它根據設定的目標比特率(kbps)和一個固定時間窗口(500ms),計算在該時間窗口內可用的字節數(即“預算”),并支持預算的增加(隨時間累積)和使用(發送數據時消耗)。該類可用于擁塞控制、碼率調整等場景中,確保數據發送速率不超過目標速率。


二、核心算法原理

  • 預算計算
    預算基于目標比特率和時間窗口(500ms)計算:
    max_bytes_in_budget_ = (kWindowMs * target_rate_kbps_) / 8
    即:最大預算 = (500ms × 目標速率kbps) / 8(轉換為字節)

  • 預算累積(IncreaseBudget)
    根據時間差?delta_time_ms?計算應增加的預算字節數。

    • 若允許積累未使用預算(can_build_up_underuse_為true),則將剩余預算累加,但不超過最大值;

    • 否則,每個時間窗口的預算獨立,不累積。

  • 預算消耗(UseBudget)
    每發送一定字節數,就從剩余預算中扣除,但不能低于?-max_bytes_in_budget_(允許一定程度超支)。


三、關鍵數據結構

成員變量類型說明
target_rate_kbps_int目標比特率,單位kbps
max_bytes_in_budget_int64_t時間窗口內的最大預算字節數
bytes_remaining_int64_t當前剩余預算字節數,可為負(表示超支)
can_build_up_underuse_bool是否允許未使用的預算累積到下一個周期

四、核心方法詳解

1. 構造函數

IntervalBudget(int initial_target_rate_kbps, bool can_build_up_underuse): bytes_remaining_(0), can_build_up_underuse_(can_build_up_underuse) {set_target_rate_kbps(initial_target_rate_kbps);
}

2.?set_target_rate_kbps

void IntervalBudget::set_target_rate_kbps(int target_rate_kbps) {target_rate_kbps_ = target_rate_kbps;max_bytes_in_budget_ = (kWindowMs * target_rate_kbps_) / 8;bytes_remaining_ = std::min(std::max(-max_bytes_in_budget_, bytes_remaining_),max_bytes_in_budget_);
}

功能:設置目標比特率,并重新計算最大預算,同時限制當前剩余預算在合理范圍內。

3.?IncreaseBudget

void IntervalBudget::IncreaseBudget(int64_t delta_time_ms) {int64_t bytes = target_rate_kbps_ * delta_time_ms / 8;if (bytes_remaining_ < 0 || can_build_up_underuse_) {bytes_remaining_ = std::min(bytes_remaining_ + bytes, max_bytes_in_budget_);} else {bytes_remaining_ = std::min(bytes, max_bytes_in_budget_);}
}

功能:根據時間差增加預算。若允許累積或之前超支,則累加;否則重置為本周期預算。

4.?UseBudget

void IntervalBudget::UseBudget(size_t bytes) {bytes_remaining_ = std::max(bytes_remaining_ - static_cast<int>(bytes),-max_bytes_in_budget_);
}

功能:使用預算,扣除相應字節數,防止超支過多。

5.?bytes_remaining

size_t IntervalBudget::bytes_remaining() const {return rtc::saturated_cast<size_t>(std::max<int64_t>(0, bytes_remaining_));
}

功能:返回非負的剩余預算(超支時返回0)。

6.?budget_ratio

double IntervalBudget::budget_ratio() const {if (max_bytes_in_budget_ == 0)return 0.0;return static_cast<double>(bytes_remaining_) / max_bytes_in_budget_;
}

功能:返回當前預算比率(剩余預算 / 最大預算),用于判斷當前負載情況。


五、設計亮點

  1. 支持兩種預算模式

    • 可累積模式(can_build_up_underuse_ = true):允許未使用的預算累積到下一周期;

    • 非累積模式:每個周期預算獨立,不累積。

  2. 防溢出與飽和處理

    • 使用?std::min?/?std::max?限制預算范圍;

    • bytes_remaining()?返回非負值,避免負數引起誤解。

  3. 靈活的預算調整

    • 支持動態調整目標碼率,自動重新計算最大預算;

    • 支持負預算(超支),但限制在一定范圍內。


六、典型工作流程

  1. 初始化?IntervalBudget,設置初始目標碼率和是否允許累積;

  2. 每隔一段時間調用?IncreaseBudget(delta_time_ms)?增加預算;

  3. 發送數據時調用?UseBudget(bytes)?扣除預算;

  4. 通過?bytes_remaining()?或?budget_ratio()?查詢當前預算狀態;

  5. 可根據網絡狀態動態調用?set_target_rate_kbps()?調整目標碼率。


注釋精要

interval_budget.h

// 帶寬預算管理器,基于時間窗口(500ms)和目標碼率進行預算控制
class IntervalBudget {public:explicit IntervalBudget(int initial_target_rate_kbps);IntervalBudget(int initial_target_rate_kbps, bool can_build_up_underuse);void set_target_rate_kbps(int target_rate_kbps);  // 設置目標碼率(kbps)void IncreaseBudget(int64_t delta_time_ms);  // 增加預算,delta_time_ms 為時間差(毫秒)void UseBudget(size_t bytes);                 // 使用預算,bytes 為使用的字節數size_t bytes_remaining() const;               // 獲取當前剩余預算(非負)double budget_ratio() const;                  // 獲取預算比率(剩余預算/最大預算)int target_rate_kbps() const;                 // 獲取當前目標碼率private:int target_rate_kbps_;        // 目標碼率(kbps)int64_t max_bytes_in_budget_; // 最大預算字節數(500ms窗口)int64_t bytes_remaining_;     // 當前剩余預算字節數(可為負)bool can_build_up_underuse_;  // 是否允許未使用的預算累積
};

interval_budget.cc

void IntervalBudget::IncreaseBudget(int64_t delta_time_ms) {int64_t bytes = target_rate_kbps_ * delta_time_ms / 8; // 計算應增加的字節數if (bytes_remaining_ < 0 || can_build_up_underuse_) {// 若當前超支或允許累積,則累加預算(不超過最大值)bytes_remaining_ = std::min(bytes_remaining_ + bytes, max_bytes_in_budget_);} else {// 否則,本周期的預算不超過當前時間窗口內的最大值bytes_remaining_ = std::min(bytes, max_bytes_in_budget_);}
}

IntervalBudget類在WebRTC中負責基于時間窗口的帶寬預算管理,用于控制數據發送速率不超過設定的目標比特率。它通過500ms時間窗口將目標碼率轉換為字節預算,隨時間推移累積預算,發送數據時扣除相應字節數。該類支持兩種模式:可累積未使用預算或每周期獨立預算,為擁塞控制和碼率自適應算法提供關鍵的發送速率狀態信息,確保網絡流量平穩且避免擁塞,是pacing模塊和擁塞控制系統的重要組成部分。

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

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

相關文章

深度學習基本模塊:RNN 循環神經網絡

循環神經網絡&#xff08;RNN&#xff09;是一種專門用于處理序列數據的神經網絡架構。與處理空間數據的卷積神經網絡&#xff08;Conv2D&#xff09;不同&#xff0c;RNN通過引入循環連接使網絡具有"記憶"能力&#xff0c;能夠利用之前的信息來影響當前的輸出&#…

React18學習筆記(二) React的狀態管理工具--Redux,案例--移動端外賣平臺

文章目錄一.Redux的基礎用法1.示例:普通網頁中的Redux計步器2.Redux管理數據的流程3.配套工具和環境準備3.1.配套工具3.2.環境準備4.示例:React項目中的Redux計步器思路步驟step1:創建子模塊step2:導入子模塊step3:注入store實例step4:React組件內使用store中的數據step5:在組件…

34.Socket編程(UDP)(上)

點分十進制字符串IP 轉 32位網絡序列IP 分析&#xff1a;1&#xff09;IP轉成4字節 2&#xff09;4字節轉成網絡序列 思路&#xff1a; "192.168.1.1" 進行字符串劃分&#xff0c;以 "." 為分割符&#xff0c;分割出"192"&#xff0c;&qu…

Redis的持久化工具包—RDB AOF

文章目錄 前言 一、RDB 持久化&#xff08;快照持久化&#xff09; 1. 定義 2. RDB 觸發機制 &#xff08;1&#xff09;手動觸發 &#xff08;2&#xff09;自動觸發 3. RDB 持久化流程 4. RDB 核心配置 5. RDB 優缺點 二、AOF 持久化&#xff08;日志持久化&#xff09; 1. 定…

【Web安全】XXL-JOB框架SRC高頻漏洞分析總結

文章目錄前言一、核心漏洞分類與技術細節二、漏洞關聯利用與攻擊路徑三、版本演進與修復策略四、安全運維建議五、典型漏洞復現環境搭建六、總結前言 XXL-JOB是國內主流的開源分布式任務調度框架&#xff0c;由徐雪里開發維護&#xff0c;以輕量易用、高可用、適配分布式場景等…

Capacitor 打包后接口訪問不到的排查經歷

我最近在用 Quasar Capacitor 6 做一個 Android App&#xff0c;前端用的是 Vue3 Quasar&#xff0c;打包交給 Capacitor 去跑在手機的 WebView 里&#xff0c;后端是 FastAPI 提供接口。開發模式下一切順利&#xff0c;瀏覽器里訪問接口沒有任何問題&#xff0c;我甚至覺得打…

【正點原子】Linux應用編程入門~概念及環境介紹

應用編程概念 應用編程&#xff08;也可稱為系統編程&#xff09;與驅動編程、裸機編程有何不同&#xff1f;系統調用&#xff1b;何為庫函數&#xff1b;應用程序的 main()函數&#xff1b;應用程序開發環境的介紹&#xff1b;系統調用 定義系統調用&#xff08;system call&a…

一、HTML 完全指南:從零開始構建網頁

文章目錄前言一、 HTML 結構認識 HTML 標簽HTML 文件基本結構標簽層次結構快速生成代碼框架二、 HTML 常見標簽詳解2.1 注釋標簽2.2 標題標簽 (h1 - h6)2.3 段落標簽 (p)2.4 換行標簽 (br)2.5 格式化標簽2.6 圖片標簽 (img)2.7 超鏈接標簽 (a)2.8 表格標簽基本使用合并單元格2.…

基于POI-TL實現動態Word模板的數據填充:【散點圖】特殊處理方案

基于POI-TL實現動態Word模板的數據填充:散點圖特殊處理方案 在使用POI-TL進行Word模板動態數據填充時,圖表生成是一個常見需求。最近在項目中使用POI-TL處理散點圖時遇到了一個特殊問題,經過研究后找到了解決方案,特此記錄分享。 問題背景 POI-TL作為一款優秀的Java Wor…

使用node-Express框架寫一個學校宿舍管理系統練習項目-前后端分離

今天繼續分享一個新的練習項目&#xff0c;是使用node做為后端語言&#xff0c;來寫的一個前后端分離項目&#xff1a;學校宿舍管理系統。我們如果想掌握一門編程語言&#xff0c;就是需要大量的練習。所以當我們學習到了一些知識&#xff0c;自己想一下 可以拿學到的知識&…

Kafka 運維實戰基本操作含命令與最佳實踐

1. 基礎概覽與工具入口 Kafka 發行包的所有 CLI 工具均在 bin/ 目錄下。任何工具不帶參數運行都會顯示所有可用選項。本文命令默認&#xff1a;--bootstrap-server localhost:9092&#xff1b;生產請替換為你的控制面或內網 VIP。 2. 主題管理&#xff08;創建 / 修改 / 刪除 /…

貪心算法應用:航班起降問題詳解

Java中的貪心算法應用&#xff1a;航班起降問題詳解 貪心算法是一種在每一步選擇中都采取當前狀態下最優的選擇&#xff0c;從而希望導致全局最優解的算法策略。在航班起降問題中&#xff0c;貪心算法可以有效地解決機場跑道調度問題&#xff0c;即如何安排航班的起降順序以最大…

uniapp scroll-view 設置scrollTop無效

當我們使用 scroll-view的scroll-top的時候 默認想讓它回到頂部&#xff0c;當我們設置值為0的時候會不生效&#xff0c;在實際運用過程中&#xff0c;發現設置了scroll-top無效&#xff0c;滾動條位置并沒有發生變化&#xff0c;是因為微信小程序的官方框架處于性能考慮&#…

網絡與通信

1.TCP協議與UDP協議TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;和 UDP&#xff08;User Datagram Protocol&#xff0c;用戶數據報協議&#xff09;是 TCP/IP 協議族中兩種核心的傳輸層協議&#xff0c;它們在數據傳輸方式、可靠性、適…

Node.js中package.json詳解

1. name&#xff08;名稱&#xff09; 如果你計劃發布你的包&#xff0c;package.json 中最重要的字段是 name 和 version&#xff0c;因為它們是必需的。name 和 version 共同組成一個假定完全唯一的標識符。包的更改應伴隨版本號的更新。如果你不打算發布包&#xff0c;那么…

代碼隨想錄第14天| 翻轉、對稱與深度

226.翻轉二叉樹 &#xff08;優先掌握遞歸&#xff09; 題目鏈接/文章講解/視頻講解&#xff1a;翻轉二叉樹 交換的是指針&#xff0c;而不是數值&#xff0c;如果用數值做交換&#xff0c;需要交換的節點下面無法很好的操作。 使用遞歸來實現&#xff0c;但要提前清除是什么順…

DNS-Windows上使用DNS

DNS-Windows上使用DNS一、查看與修改DNS配置1.1、查看當前DNS服務器設置1.2、臨時修改 DNS 服務器&#xff08;命令行&#xff09;二、DNS緩存相關操作2.1、查看DNS緩存內容2.2、 刷新 DNS 緩存&#xff08;清除過期記錄&#xff09;三、測試域名解析&#xff08;nslookup 工具…

3dsMax 2026 .NET Core 8 轉型下的Maxscript腳本開發:動態編譯模塊的重構策略與兼容性升級路徑

3ds Max 長期以來一直提供出色的 .NET 集成,使 Maxscript 能夠無縫利用任何 .NET 庫的強大功能。部分開發者在工具中廣泛使用了 .NET 功能。 之前,3ds Max 依賴于 .NET Framework 4.8 并且最近更新到了 4.8.1,用于 2025 版本的發布。然而,隨著 3ds Max 2026 的推出,Autod…

golang 做webrtc開發核心

在Golang中進行WebRTC開發&#xff0c;核心在于理解WebRTC協議的工作原理以及如何利用Go生態中的庫來實現關鍵功能。以下是Golang WebRTC開發的核心要點&#xff1a; WebRTC基礎概念 了解ICE&#xff08;Interactive Connectivity Establishment&#xff09;協議用于NAT穿越掌握…

RabbitMQ 異步化抗洪實戰

說明&#xff1a;本文僅展示架構思路與安全片段&#xff0c;所有敏感字段已用占位符&#xff1b;不含可直接復刻的生產細節。數據與接口均為演示/虛擬。0. 背景與目標長耗時/不確定接口&#xff08;如對接第三方機器人平臺&#xff09;的同步阻塞&#xff0c;容易造成請求堆積與…