webrtc-neteq音频抖动处理

博客围绕音频处理展开,介绍了音频包打包情况,如20ms打包间隔下1s产生50个包,每个包160采样点。还阐述了网络延迟计算方式,包括最近延迟计算、延迟概率分布统计及推测延迟得出;说明了抖动缓冲区大小计算步骤;最后提及播放策略控制(最简单模式)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

音频包每个的打包间隔一样,
假设打包间隔为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根据网络延迟,取不同的值。网络越好用越小的间隔进行平滑,网络越差使用越大的间隔尽心平滑

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

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

抖动>延迟: 加速播放
抖动<延迟: 减速播放
抖动=延迟: 正常播放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值