VoIP之Jitter Buffer(抖动缓冲器)
Jitter Buffer(抖动缓冲器)是一种VoIP领域用于处理网络传输中数据包抖动和延迟的技术,通过合理的配置和优化,该机制可以确保通话中语音的连续性和清晰度,提高用户的通话体验。
一、Jitter Buffer的产生背景
在SIP/VoIP通话中,通常使用UDP方式传输RTP语音包,理想情况下,接收端每隔(20ms或40ms)就会收到一个语音包,但网络存在信号强弱、网络拥塞、路由选择等而引发抖动和延迟问题,而UDP又是不可靠的传输方式,因此接收端收到的语音包会存在乱序、延时、抖动等问题。如果终端收到一个语音包就立刻解码播放时,用户听到的声音会有卡顿、不清晰等异常情况。为了解决上述问题,jitter Buffer机制诞生了。
二、 Jitter Buffer的机制原理
-
将接收到的RTP包按照RTP包的序列号顺序插入到一个接收队列中,更新Jitter-Buffer的相关计算指标(如包间隔,延迟时间等)
-
读取模块根据当前系统时间和jitter-Buffer相关计算指标计算得出一个预期时间戳,返回队列中比该时间戳小的RTP数据
-
解码模块解码RTP数据并进行播放,由于Jitter Buffer对RTP包进行了缓存、排序,解决了延迟、乱序问题,因此声音播放起来持续稳定
-
如果RTP数据包的延迟超过允许的阈值,Jitter Buffer视其为过期数据,直接丢弃
-
网络延迟较小时,数据包能够相对实时播放;当网络延迟较大时,Jitter Buffer会等待一段时间缓存数据,以平滑处理延迟和抖动
三、Jitter Buffer的作用
-
平滑处理网络传输中的抖动、延迟和乱序问题
-
确保语音通话的连续性和清晰度
四、参数配置
Jitter Buffer模块一般会支持多个参数设置,如下:
- 初始缓冲数据个数或时长(ms)
- 模式
静态:缓冲区大小固定
动态:缓冲区大小根据接收情况动态调整
注:
一般选用动态模式
较大的缓冲区应对网络抖动能力强,但会增加延迟
较小的缓冲区可以减少延迟,但应对网络抖动能力低
-
算法
计算抖动、延迟等指标时,会用到一些算法(如方差计算等)
五、关键说明
- 实现逻辑较复杂,实际应用开发中通常使用开源库(如oRTP、WebRTC等)中的Jitter Buffer模块实现
- 不仅用于音频通话,同样适用于视频等其它以UDP/RTP方式时行媒体传输的场景
- 在SIP/VoIP领域的媒体传输中是必不可少的模块,是弱网对抗中的一项关键技术
- 合适的参数配置可以显著提高语音通话的质量和用户体验
- 能够消除一定程度的网络抖动、延迟等情况,但无法处理延迟过大的情况,不同的开源实现处理能力不同
- 无法应对丢包问题,丢包问题需要额外机制处理,比如丢包重传或FEC(前向纠错)等