浅谈 WebRTC NetEQ

本文深入探讨 WebRTC 的 NetEQ 模块,核心是抖动消除和丢包补偿算法。NetEQ 是一种动态抖动缓冲区和错误隐藏算法,旨在提供高质量低延迟的语音通信。介绍了网络延时统计、抖动延迟统计、丢包补偿策略,以及 MCU 和 DSP 模块的功能。同时,提到了关键的进包和出包处理流程,以及设计 Jitter Buffer 的注意事项。
摘要由CSDN通过智能技术生成

WebRTC Native 代码里面有很多值得学习的宝藏,其中一个就是 WebRTC 的 NetEQ 模块。根据 WebRTC 术语表 对 NetEQ 的解释:

A dynamic jitter buffer and error concealment algorithm used for concealing the negative effects of network jitter and packet loss. Keeps latency as low as possible while maintaining the highest voice quality.

一种动态抖动缓冲区和错误隐藏(丢包补偿)算法,用于去除网络抖动和数据包丢失的负面影响。在保持最高语音质量的同时,保持尽可能低的延迟。

NetEQ 其实就是音视频处理中的 Jitter Buffer 模块,在 WebRTC 的语音引擎中使用。这个模块很重要,会影响播放时的体验,同时也相当复杂。

本文源码参考 WebRTC Native M78 版本。

抖动消除

同码率下:抖动(J) = 平均到达间隔(接近发送间隔) - 单次到达间隔

  • J > 0:正抖动,数据包提前到达,包堆积,接收端溢出
  • J < 0 :负抖动,数据包延迟或丢包

由于网络包的到达有快有慢,导致间隔不一致,这样听感就不顺畅。而抖动消除就是使不统一的延迟变为统一的延迟,所有数据包在网络传输的延迟之和与抖动缓冲区处理后的延迟之和相等。
 

通过处理,A、B、C、D 的播放间隔一致,播放端就听感就会感受到延迟,但不会有卡顿。

常见的抖动缓冲控制算法有两种:

  • 静态抖动缓冲控制算法:缓冲区大小固定,容易实现,网络抖动大时,丢包率高,抖动小时,延迟大。
  • 自适应抖动缓冲控制算法:计算目前最大抖动,调整缓冲区大小,实现复杂,网络抖动大时,丢包率低,抖动小时,延迟小。

好的算法自然是追求低丢包率和低延迟。

丢包补偿

丢包补偿(PLC,Packet Loss Concealment)顾名思义,就是在丢包发生时,做的应对措施。主要分为发送端的接受端的丢包补偿。

发送端

  • 主动重传:通过信令,让发送端重新补发。
  • 被动通道编码:在组包时做一些特殊处理,丢包时可以作依据。
    • 前向差错纠正(FEC,Forward error correction):根据丢包前面的包信息来进行处理。
      • 媒体相关:双发,数据包中第二个包一般用较低码率和音质编码的包。
      • 媒体无关:每 n 个数据包生成一个(多个)新的校验包,校验包能还原出这 n 个包的信息。
    • 交织:对数据包分割重排,减少单次丢包的数据量大小。

接收端

  • 插入:用固定的包进行补偿
    • 静音包
    • 噪音包
    • 重复包
  • 插值:模式匹配及插值技术生成相似的包,算法不会理解数据包具体内容,而只是从数据特征上进行处理
  • 重构:根据编码参数和压缩参数生成包,与插值不同,算法使用更多数据包的信息,效果更好

整体架构

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值