一、整體簡介
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、在丟包亂序場景下的網絡延時計算
核心思想是計算網絡亂序和網絡丟包帶來的音頻質量損失代價函數,計算最小代價值作為網絡延時值。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
對應源碼的核心函數是:
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_參數控制權重)
然后輪詢所有亂序延時情況,在??重排序容忍度??和??丟包率??之間找到最優平衡點。作為當前的網絡延時值。