转载请标明出处:https://blog.csdn.net/qq_29621351
1. 前言
WebRTC语音传输中保证传输质量的主要措施分为丢包重传 (NACK) 和前向纠错 (FEC),其中NACK主要是接收端在检测到数据包RTP序列号不连续的时候,发送重传请求,发送端接收到重传请求后重新向接收端发送丢失的数据。FEC主要通过后一个数据包携带前一个数据包的冗余包,这样当前一个数据包丢失时,可以用后一个数据包的冗余数据恢复前一个数据包,降低丢包率的同时,也增大了数据传输的带宽。
2. 原理
WebRTC中音频前向纠错与视频前向纠错的方式不同,音频前向纠错遵循RFC2198标准,视频前向纠错遵循RFC5109标准。两者有差异的原因是音频传输所占据的带宽比较小,即使增加1倍的带宽冗余,也不会造成太大的影响,而视频的一帧比较大,通常需要几个RTP数据包才能完全发送,因此不能像音频一样具有较大的冗余力度。
WebRTC内置的opus音频编码器内置了前向纠错功能,可以在初始化编码器的时候通过接口设置开启,反馈的丢包率没有大但设置开启后在接收端于特定阈值时,opus也不会启用内置的FEC。具体的阈值详见我之前文章的测试结果 编解码器:Opus编码器内置FEC功能测试,如果使用了opus编码,那么就没必要再使用外置的FEC,因为两者的实现方式是一样的。外置的音频前向纠错主要是为了没有内置FEC功能的音频编解码器。
在网络中发送连续的语音包时,假设给每个语音包编号1,2,3,......
如图1所示,语音包按照序号递增的顺序由发送端发出并经过网络传输到达接收端