WebRTC NetEQ

2022-10-25  本文已影响0人  hanpfei

NetEq 是音频的抖动缓冲区和丢包隐藏器。抖动缓冲区是一种自适应抖动缓冲器,即根据网络条件不断优化缓冲延迟。它的主要目标是确保从网络传入的音频数据包,以较少的音频伪影(对数据包的原始内容的更改)下平稳播放,同时保持尽可能低的延迟。

API

在较高的层面上看,NetEq API 有两个主要的函数:InsertPacketGetAudio

InsertPacket

InsertPacket 将来自于网络的 RTP 数据包传递给 NetEq,其中将发生以下情况:

  1. 如果对于播放来说,它来的太晚,则数据包将被丢弃(例如,如果它被重新排序,乱序到达)。否则它被放进数据包缓冲区保存起来,直到被播放出来。如果缓冲区满了,则丢弃所有已有的数据包(这应该很少发生)。

  2. 分析数据包之间的到达时间间隔,并更新统计数据,以用于推导新的目标播放延迟。到达间隔时间以 GetAudio ‘ticks’ 的数量来衡量,因此可以照顾到发送方和接收方之间的时钟漂移。

GetAudio

GetAudio 从 NetEq 拉取 10 ms 的音频数据来播放。一个大大简化的决策逻辑如下:

  1. 如果 sync buffer 中有 10 ms 的音频数据,就返回它们。

  2. 如果下一个数据包(基于 RTP 时间辍)在 packet buffer 中可用,则解码它并把结果添加到 sync buffer。

    1. 将当前延迟估计(过滤的缓冲区水位)与目标延迟进行对比,如果缓冲区水位太高或太低,则在时间上伸缩(加速或减速)sync buffer 的内容。
    2. 从 sync buffer 返回 10 ms 的音频数据。
  3. 如果上一次解码的数据包是一个不连续传输(DTX)数据包,则产生舒适噪声。

  4. 如果由于下一个数据包还没有到达或已经丢失而没有数据包可用于解码,则通过推断 sync buffer 中剩余的音频数据或通过请求解码器生成,来生成丢包隐藏。

总之,输出是以下操作之一的结果:

统计数据

有大量的函数可用于查询 NetEq 的内部状态,关于音频输出类型,和诸如数据包已经在缓冲区中等待的时长这样的延迟指标之类的统计数据。

测试和工具

其它职责

双音多频信令(DTMF):接收电话事件并产生双音波形。

前向纠错(RED 或编解码器带内 FEC):分割插入的数据包并对有效负载进行优先级排序。

NACK (negative acknowledgement,否定确认):跟踪丢失的数据包,并为 NACK 生成数据包的列表。

音频/视频同步:NetEq 可以被指示增加延迟以保持音频和视频同步。

原文

上一篇下一篇

猜你喜欢

热点阅读