webrtc音頻QOS方法一(NetEQ之音頻緩存延時BufferLevelFilter計算)

一、整體思路

上一篇《NetEQ之音頻延時DelayManager計算》介紹瞭如何計算音頻報文的網絡延時,給系統需要緩存多長時間的音頻數據,提供了數據支撐。webrtc會根據當前系統已經緩存包數和網絡延時情況,決定給音頻解碼器發送播放方式,進行平滑處理。下面來介紹計算系統已經緩存包數的方法。

二、實現原理

1)計算公式

系統已經緩存包數有三塊組成:1、RTP數據包緩存;2、音頻解碼後PCM數據緩存包數(解碼後數據尚未進行音頻渲染);3、對音頻數據進行stretched包數。獲取這三塊數據後,使用如下公式計算系統音頻緩存包數。

                        filtered current level = f * filtered current level + ( 1 - f ) * buffer size packets

  1. filtered_current_level:平滑後系統緩存包數。單位是報文個數。
  2. filtered_current_level:當前系統緩存包數。單位是報文個數。
  3. f:遺忘因子。根據《NetEQ之音頻延時DelayManager計算》計算的網絡延時動態調整。

2)代碼實現

  • BufferLevelFilter::Update

        filtered_current_level_變量計算的核心函數。這裏可以看出filtered_current_level還需要根據time_stretched_samples參數進行微調。因爲之前對音頻數據進行快進或者快退,播放時間不完全等於緩存時間。

       time_stretched_samples表示加速或減速播放後數據長度的伸縮變化。若爲加速,time_stretched_samples爲正值,filtered_current_level減小;若爲減速,time_stretched_samples爲負值,filtered_current_level變大。這體現了抖動消除技術的核心思想,即通過加速減速來實現自適應抖動緩衝區的物理設計。並且次處的filtered_current_level不會長期持續減速或者減速,確保音頻質量的舒適度。

 

  • BufferLevelFilter::SetTargetBufferLevel

        使用《NetEQ之音頻延時DelayManager計算》計算的網絡延時target_buffer_level,動態調整遺忘因子係數。

 

  • DecisionLogic::GetDecision

       計算系統當前實際音頻緩存包數,可以看出這裏計算了RTP報文、PCM數據、stretched三大塊

  • DecisionLogicNormal::ExpectedPacketAvailable

         最後,根據網絡延時、系統緩存包數及上一幀的處理方式,決定當前解碼器的處理方式。

三、附錄

NetEqImpl類裏面使用SyncBuffer類,整理該類結構定義如下,便於後續代碼走讀。

四、參考

《WebRTC語音引擎中NetEQ技術的研究_吳江銳》

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章