WebRTC音頻QoS方法一.1(NetEQ之音頻網絡延時DelayManager計算補充)

一、整體簡介

NetEQ計算的網絡延時,直接影響變速算法的決策。在變速算法里面啟動關鍵的作用。

網絡延時計算需要考慮兩種情況:

1、單純抖動的網絡延時計算,在UnderrunOptimizer類中實現;

2、在丟包亂序場景下的網絡延時計算。在ReorderOptimizer類中實現。

DelayManager函數綜合考慮兩種算法的最大值。確定為當前網絡延時值。

二、實現原理

1、單純抖動的網絡延時計算

使用的算法是webrtc音頻QOS方法一(NetEQ之音頻網絡延時DelayManager計算)_webrtc qos-CSDN博客文章瀏覽閱讀5k次,點贊3次,收藏23次。本文探討WebRTC中音頻延時處理技術,重點講解DelayManager模塊如何通過IAT直方圖和DelayPeakDetector算法計算目標緩沖級別,確保音頻在不同網絡條件下平穩播放。 https://blog.csdn.net/CrystalShaw/article/details/104768449這里介紹的直方圖方法。使用的是?Q30格式表示的出現概率,指定出現95%(可配值,默認值是95%)的網絡延時的最大值。

在直方圖里面,有個correction機制,可以保證直方圖里面所有元素出現概率的和是100%。當我們配置95%出現概率的時候,會從最小延時間隔向上累加到95%的最大值,作為網絡延時值。

核心函數如下:

void UnderrunOptimizer::Update(int relative_delay_ms) {std::optional<int> histogram_update;if (resample_interval_ms_) {if (!resample_stopwatch_) {resample_stopwatch_ = tick_timer_->GetNewStopwatch();}if (static_cast<int>(resample_stopwatch_->ElapsedMs()) >*resample_interval_ms_) {histogram_update = max_delay_in_interval_ms_;resample_stopwatch_ = tick_timer_->GetNewStopwatch();max_delay_in_interval_ms_ = 0;}max_delay_in_interval_ms_ =std::max(max_delay_in_interval_ms_, relative_delay_ms);} else {histogram_update = relative_delay_ms;}if (!histogram_update) {return;}const int index = *histogram_update / kBucketSizeMs;if (index < histogram_.NumBuckets()) {// 入桶延時值histogram_.Add(index);}//計算滿足histogram_quantile_概率的最大值int bucket_index = histogram_.Quantile(histogram_quantile_);//根據桶索引計算對應延時值optimal_delay_ms_ = (1 + bucket_index) * kBucketSizeMs;
}

2、在丟包亂序場景下的網絡延時計算

核心思想是計算網絡亂序和網絡丟包帶來的音頻質量損失代價函數,計算最小代價值作為網絡延時值。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??Cost=Delay Cost+Loss Cost

對應源碼的核心函數是:

1、延時成本DelayCost公式:

DelayCost = (i * kBucketSizeMs - base_delay_ms) << 30

表示當前延遲與基礎延遲的差值(以20ms為粒度),通過Q30定點數放大以避免浮點誤差。i是直方圖中的延遲桶索引,base_delay_ms是當前網絡的基礎延遲。

2、丟包成本LostCost公式:

LostCost =?100 * ms_per_loss_percent_ * loss_probability;

將丟包概率(loss_probability)轉換為每1%丟包對應的延遲成本(ms_per_loss_percent_參數控制權重)

然后輪詢所有亂序延時情況,在??重排序容忍度??和??丟包率??之間找到最優平衡點。作為當前的網絡延時值。

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

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

相關文章

實時操作系統FreeRTOS移植到STM32VGT6

一、前言 下載平臺:STM32F407VGT6 代碼使用平臺:VSCode 編譯器:arm-none-aebi-gcc 程序下載工具:STlink 批處理工具:make 移植的FreeRTOS版本:V11.2.0 其實此方法并不局限在arm-none-aebi-gcc中&#xff0c;此方法對于Keil5也是可以使用的&#xff0c; 只不過復制的一些文件不同…

從線到機:AI 與多模態交互如何重塑 B 端與 App 界面設計

當下&#xff0c;界面設計已經不再是單純的“畫屏幕”。AI 的快速發展讓我們不得不重新審視&#xff1a;交互和視覺究竟會走向什么樣的未來&#xff1f;無論是移動端 App&#xff0c;還是復雜的 B 端產品&#xff0c;設計的核心都在于讓界面更懂用戶。本文嘗試從三個角度切入&a…

【智能化解決方案】大模型智能推薦選型系統方案設計

大模型智能推薦選型系統方案設計0 背景1 問題分析與定義2 模型假設與簡化3 核心模型構建3.1 決策變量與參數定義3.2 目標函數3.3 約束條件4 模型求解與驗證4.1 求解策略4.2 驗證方法4.3 模型迭代優化5 方案實施與系統設計5.1 系統架構設計5.2 工作流程5.3 關鍵算法實現5.4 時序…

【Java基礎】HashMap、HashTable與HashSet:區別、聯系與實踐指南

Java中HashMap、HashTable與HashSet的深度解析&#xff1a;區別、聯系與實踐指南 引言 在Java集合框架中&#xff0c;HashMap、HashTable與HashSet是最常用的哈希型數據結構。它們因高效的查找、插入與刪除性能&#xff08;平均時間復雜度O(1)&#xff09;&#xff0c;廣泛應用…

互聯網大廠Java面試實戰:核心技術棧與場景化提問解析(含Spring Boot、微服務、測試框架等)

互聯網大廠Java面試實戰&#xff1a;核心技術棧與場景化提問解析 本文通過模擬面試官與求職者謝飛機的對話&#xff0c;深入探討互聯網大廠Java開發的核心技術棧面試問題&#xff0c;涵蓋Java SE、Spring生態、微服務、大數據等多個領域&#xff0c;結合音視頻、電商、AIGC等業…

人工智能-python-深度學習-參數初始化與損失函數

文章目錄參數初始化與損失函數一、參數初始化1. 固定值初始化1.1 全零初始化1.2 全1初始化1.3 任意常數初始化2. 隨機初始化2.1 均勻分布初始化2.2 正態分布初始化3. Xavier初始化4. He初始化5. 總結二、損失函數1. 線性回歸損失函數1.1 MAE&#xff08;Mean Absolute Error&am…

Android Glide常見問題解決方案:從圖片加載到內存優化

全面總結Glide使用中的典型問題與解決方案&#xff0c;助力提升應用性能與用戶體驗作為Android開發中最流行的圖片加載庫之一&#xff0c;Glide以其簡單易用的API和強大的功能深受開發者喜愛。然而&#xff0c;在實際使用過程中&#xff0c;我們往往會遇到各種問題&#xff0c;…

linux系統ollama監聽0.0.0.0:11434示例

docker應用如dify訪問本地主機部署的ollama&#xff0c;base_url不管配"http://localhost:11434"&#xff0c;還是"http://host_ip:11434"都會報錯。這是因為1&#xff09;docker容器訪問http://localhost:11434&#xff0c;其實訪問的是docker容器自身的服…

Java微服務AI集成指南:LangChain4j vs SpringAI

今天想再完善一下做的微服務項目&#xff0c;想著再接入一個人工客服&#xff0c;于是學習了一下langchan4j的內容&#xff0c;未完一、技術定位辨析&#xff1a;LangChain4j vs Spring AI vs OpenAIOpenAI&#xff1a;AI模型提供商 提供大語言模型API&#xff08;如GPT-4o&…

華為光學設計面試題

16. 題目&#xff1a;設計一個用于機器視覺檢測的光學系統時&#xff0c;如何保證在高速運動下成像的清晰度和穩定性&#xff1f;(出處&#xff1a;華為智能制造光學檢測項目組招聘面試題)17. 題目&#xff1a;請說明在光學系統設計中&#xff0c;如何權衡景深和分辨率的關系&a…

vue3和react的異同點

這是一個前端領域非常核心的話題。Vue 3 和 React 都是極其優秀的現代前端框架&#xff0c;它們在理念和實現上既有相似之處&#xff0c;也有顯著區別。 下面我將從多個維度詳細對比它們的異同點。核心哲學與設計理念特性Vue 3React設計理念漸進式框架與 “救世主”聲明式 UI 庫…

assetbuddle hash 比對

1.測試 &#xff1a;當在預設上的數據有修改時&#xff0c;生成的ab也會有修改&#xff0c;具體到某個ab的.manifest里會有相應的變化&#xff0c;AssetFileHash 會修改 如圖所示&#xff1a; ManifestFileVersion: 0 CRC: 2818930197 Hashes: AssetFileHash: serializedVersio…

Spring Boot `@Configuration` 與 `@Component` 筆記

Spring Boot Configuration 與 Component 筆記 1?? 基本概念注解作用是否有代理適用場景Component標記普通組件&#xff0c;將類交給 Spring 容器管理? 沒有 CGLIB 代理普通 Bean&#xff0c;工具類、過濾器、監聽器等Configuration標記配置類&#xff0c;用來聲明 Bean? 有…

二、JVM 入門——(三)棧

棧的定義 棧也是一塊區域&#xff0c;用來存放數據的。棧也叫棧內存&#xff0c;主管Java程序的運行。 棧是私有的&#xff0c;是在線程創建時創建&#xff0c;所以它的生命期是跟隨線程的生命期&#xff0c;線程結束棧內存也就釋放。 因此對于棧來說不存在垃圾回收問題&…

深度學習入門第一課——神經網絡實現手寫數字識別

昨天我們講了深度學習的大致框架&#xff0c;下面我們用深度學習網絡來實現一個小項目——手寫數字識別。完整代碼import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor…

Vue中的scoped屬性

理解&#xff1a; 在 .vue 文件中&#xff0c;scoped 是 <style> 標簽的一個屬性&#xff0c;作用是讓樣式只作用于當前組件&#xff0c;避免樣式污染其他組件 scoped 讓樣式只在自己的組件內生效&#xff0c;不會影響到其他組件的同名元素 舉例 沒有 scoped 的情況&…

S2B2B系統哪個好,商淘云、數商云、金蝶云蒼穹供應鏈批發哪個比較靠譜

在數字化商業浪潮洶涌的當下&#xff0c;S2B2B系統已成為眾多企業優化供應鏈、提升運營效率、拓展業務版圖的關鍵利器。從大型企業的復雜產業鏈協同&#xff0c;到中小企業對上下游資源的整合與把控&#xff0c;S2B2B系統的身影無處不在。但面對市場上層出不窮的各類S2B2B系統&…

利用3臺機器搭建Kubernetes集群

文章目錄1 機器準備修改主機名(可選)配置IP地址和主機名映射關閉防火墻關閉swap2 安裝docker修改并更新軟件源安裝docker設置路由轉發規則&#xff0c;并使配置生效安裝 kubelet&#xff0c;kubeadm&#xff0c;kubectl3 初始化集群4 集群初始化5 work節點加入6 部署網絡插件本…

C6.3:發射結交流電阻

當一個小交流電壓加在發射結上&#xff0c;會產生發射極交流電流&#xff0c;該交流電流的大小取決于Q點位置&#xff0c;而曲線是彎曲的&#xff0c;所以Q點在曲線上的位置越高&#xff0c;發射極交流電流的峰值越大。發射極總電流是直流分量和交流分量疊加而成&#xff0c;即…

python中生成器

生成器是根據算法生成數據的一種機制&#xff0c;每次調用生成器只生成一個值&#xff0c;可以節省大量內存生成器推導式gg ( i * 2 for i in range(5))print(gg)print(next(gg)) # 0 print(next(gg)) # 2 print(next(gg)) # 4 print(next(gg)) # 6 print(next(gg)) # 8yield…