音频包每个的打包间隔一样,
假设打包间隔为20ms, 则1s产生50个包 (1000/20 )
假设8k采样率,每个包就有160采样点 (80000/ 50 = 160)
一. 网络延迟计算方式:
-
计算最近延迟
每次从队列中获取数据后,增加采样点计数,
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;
}
-
统计延迟值到0-64,上的概率分布. (概率密度函数)
- 增加当前计算出来的delay级别上的概率值,减少其他等级的概率值。 保证所有的(0-64)概率和为1 ,
- 从0开始累加到值大于95%(个人感觉跟正态分布的3西格玛有关),这时候得出的数值,记录为推测的延迟。
-
一段时间内频繁出现延迟峰值,则加大网络延时,否则使用上一步计算的95%值
二. 抖动缓冲区大小计算:
-
计算现在还有多少个包没有播放
newSize = bufferQueue.size + decodebuffer.size(等待播放的)。
2.滑动平均一下
jitterbuffersize = jitterbuffersize\*f + (1-f) \* newSize
3 更新f参数
f根据网络延迟,取不同的值。网络越好用越小的间隔进行平滑,网络越差使用越大的间隔尽心平滑
三. 播放策略控制(只考虑最简单模式)
比较网络延迟和抖动缓冲区大小。
抖动>延迟: 加速播放
抖动<延迟: 减速播放
抖动=延迟: 正常播放