webrtc-neteq音频抖动处理

音频包每个的打包间隔一样,
假设打包间隔为20ms, 则1s产生50个包 (1000/20 )
假设8k采样率,每个包就有160采样点 (80000/ 50 = 160)

一. 网络延迟计算方式:

  1. 计算最近延迟

    每次从队列中获取数据后,增加采样点计数,
    bufferQueue.pop(){
    mSampleNUm += 160;

    }

    每次向队列写数据的时候计算延迟,并清空mSampleNUm=0
    bufferQueue.push(seqNum,packet){
    delay= mSampleNUm / 160 ; 这个表示延迟了几个包

     //这样计算出延迟了多少个间隔
     // <=0 乱序
     // =1  正常  (lastSeq +1下一次来的包就应该是seqNum)
     // >1. 延迟到达。延迟了几个大包间隔(20ms)
     delay + (lastSeq +1 - seqNum)
     
     mSampleNUm =0;
    

    }

  2. 统计延迟值到0-64,上的概率分布. (概率密度函数)

    1. 增加当前计算出来的delay级别上的概率值,减少其他等级的概率值。 保证所有的(0-64)概率和为1 ,
    2. 从0开始累加到值大于95%(个人感觉跟正态分布的3西格玛有关),这时候得出的数值,记录为推测的延迟。
  3. 一段时间内频繁出现延迟峰值,则加大网络延时,否则使用上一步计算的95%值

二. 抖动缓冲区大小计算:

  1. 计算现在还有多少个包没有播放

    newSize = bufferQueue.size + decodebuffer.size(等待播放的)。

2.滑动平均一下

  jitterbuffersize = jitterbuffersize\*f + (1-f) \* newSize    

3 更新f参数

  f根据网络延迟,取不同的值。网络越好用越小的间隔进行平滑,网络越差使用越大的间隔尽心平滑

三. 播放策略控制(只考虑最简单模式)

比较网络延迟和抖动缓冲区大小。 

抖动>延迟: 加速播放
抖动<延迟: 减速播放
抖动=延迟: 正常播放

猜你喜欢

转载自blog.csdn.net/qq_16135205/article/details/89949092