1.计算当前帧是提前还是延后到
先计算当前帧持续时长
再从定时器获取本地时长,定时器10ms tick一次
得到iat_packets,也就是延迟包数,iat_packets =0,就是提前到了,iat_pakets =1就是正常时间到,iat_packets>1就是延迟到了
然后计算延迟时间,并记录2s以内的总延迟
2.更新统计直方图
这个里面有个容量为100的数组,index是2s内总延迟的包数,数组记录的是延迟包数出现过的概率(通过遗忘因子和历史数据调整过的概率,数据量越大,遗忘因子递增,数据趋于平稳)
通过上面的数组拿到能满足97%概率的延迟包数,定为当前的最佳抖动延迟target_level,并限制一下最大值和最小值
3.将target_level传递到buffer_level_filter
4.根据当前缓冲区大小和缓冲区伸缩变化值,计算filtered_current_level_
5.计算延迟的上下限
6.根据前一次的决策和filtered_current_level_指定当前dsp决策,是应该加速还是减速
参考
《WebRTC语音引擎中NetEQ技术的研究_吴江锐》