无丢包的自适应抖动缓冲

Posted

技术标签:

【中文标题】无丢包的自适应抖动缓冲【英文标题】:adaptive jitter buffer without packet loss 【发布时间】:2014-11-22 15:29:00 【问题描述】:

我关心的是自适应抖动缓冲器的设计,它随着抖动计算的增加和减少而增加和减少容量。

我认为没有理由对延迟或容量进行任何调整,除非存在缓冲区欠载,然后可能会出现超过容量的传入数据包突发(假设缓冲区容量首先等于缓冲区深度/延迟)。例如,如果我正在接收 20ms 的数据包,我可能会实现一个 100ms 深的缓冲区,因此可以容纳 5 个数据包。如果数据包之间经过 160 毫秒,那么我可能预计会同时看到多达 8 个数据包。此时我有两个选择:

    根据溢出规则丢弃三个数据包 不丢弃任何数据包并增加缓冲区容量和延迟

假设选择 2 并且网络状况改善并且数据包传送再次变得正常(抖动值下降)。怎么办?同样,我认为我有两个选择:

    什么都不做,忍受增加的延迟 减少延迟(和容量)

使用自适应缓冲区,我认为我应该做出选择 4,但这似乎不对,因为它要求我人为/任意丢弃在遇到选择 2 时专门保存的音频数据包首先是更大的抖动。

在我看来,正确的做法是最初选择 #1 以保持延迟,同时丢弃因抖动增加而延迟交付的数据包(如有必要)。

类似的情况可能是,我没有在 160 毫秒的间隙后获得 8 个数据包的突发,而是仅获得 5 个(也许刚刚丢失了 3 个数据包)。在这种情况下,增加缓冲区容量并没有什么好处,但确实有助于减少以后发生溢出的可能性。但是如果溢出的想法是要避免的(从网络端),那么我首先会简单地使缓冲区容量比配置的“深度/延迟”大一些。换句话说,如果溢出不是由于本地应用程序未能及时从缓冲区中取出数据包引起的,那么溢出只有两个原因:要么发送方撒谎并且以比约定的更快的速率发送数据包(或从未来发送数据包),或者,数据包突发之间的间隙超出了我的缓冲区深度。

显然,“自适应”缓冲区的全部意义在于识别后一种情况、增加缓冲区容量并避免丢弃任何数据包。但这给我带来了正确的问题:当网络抖动清除时,我如何“适应”回到理想设置,同时仍然执行相同的“不丢弃数据包”理念?

想法?

【问题讨论】:

检查星号项目中实现的抖动缓冲区:voip-info.org/wiki/view/Asterisk+new+jitterbuffer。它是自适应的。 【参考方案1】:

使用压扩。 当抖动清除时,您合并数据包并“加速”缓冲区。 Merge offcourse 需要适当的处理,但想法是从 ajb 弹出 2 个 20ms 数据包并创建一个 30ms 数据包。你一直这样做,直到你的缓冲水平正常。

与欠载类似,除了引入延迟之外,数据包还可以“拉伸”。

【讨论】:

根据定义,欠载意味着缓冲区中没有数据包。那么哪些数据包会被拉伸?我不确定你的建议是否有意义。一旦遇到欠载,我已经在音频播放中出现了差距。扩展欠载后可能突然涌入的数据包似乎更有可能导致不必要的溢出。 不要等待发生欠载。当你的缓冲区达到某个低水位线时,开始拉伸。 我不同意你的建议。如果缓冲区中仍有数据包,则没有理由仅仅因为几个数据包延迟而开始扭曲播放和增加延迟。如果这些数据包最终到达,仍然及时在正确的时隙中播放,那么音频播放必须再次失真,以减少人为引入的延迟。在这种情况下,播放系统引入了 2 个非常不必要的失真,因此此时不需要自适应算法。 对于自适应 jb,我想根据抖动增加和减少延迟。当存在高抖动或欠载时,我会增加延迟。理想情况下,当我引入延迟时,我不希望出现间隙。因此,可以使用先前解码的帧生成人工帧,或者可以扩展当前帧。一旦我增加了延迟,帧就会以正常速率弹出。现在,如果缓冲区在一段时间后已满,则加速而不是丢弃数据包是更好的主意。如果网络非常突发,则 ajb 应识别这种情况并保持较高的延迟和缓冲区大小。

以上是关于无丢包的自适应抖动缓冲的主要内容,如果未能解决你的问题,请参考以下文章

论文阅读|《基于加权Q学习算法的自适应车间调度策略》

echarts的自适应问题(窗口自适应,侧边栏自适应,el-tab中的自适应)

适用于常见问题的自适应卡内的自适应卡

VoIP资料

ios怎么实现uiview的自适应高度

怎么实现地图的自适应缩放