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技术的研究_吴江锐》

发布了107 篇原创文章 · 获赞 84 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/CrystalShaw/article/details/104817596