如何为 Opus 编解码器使用 FEC 功能

Posted

技术标签:

【中文标题】如何为 Opus 编解码器使用 FEC 功能【英文标题】:How to use FEC feature for Opus codec 【发布时间】:2018-08-31 19:51:01 【问题描述】:

我正在尝试使用 opus 前向纠错 (FEC) 功能。 我有一项使用 OPUS_SET_INBAND_FEC(1) 进行编码的服务 和 OPUS_SET_PACKET_LOSS_PERC(20) 和 10ms 数据包并通过 UDP 发送。

不过,我不清楚解码过程。

    当一个数据包丢失时,我是否只需要使用 fec=1 调用 decode 还是需要在下一个数据包之后也使用 fec=0 调用 decode? 在启用 fec 的情况下,我如何预先知道我发送来解码的 pcm 的大小?

【问题讨论】:

【参考方案1】:

我设法让它工作。

问题中所述的编码部分是正确的:

使用编码器 OPUS_SET_INBAND_FEC(1) 和 OPUS_SET_PACKET_LOSS_PERC(X) 其中 x>0 和 x 发送持续时间至少为 10ms 的数据包(例如:480 个样本,48 kHz)

对于解码部分,当一个数据包丢失时,在下一个数据包上调用解码函数,首先使用fec=1,然后再次使用fec=0

使用 fec=1 调用 decode 时,发送的 pcm 将被完全填满。 如果您不知道 pcm 应该在解码器上使用 OPUS_GET_LAST_PACKET_DURATION(x) 的长度,其中 x 将获得最后一个数据包的持续时间。

【讨论】:

我正在尝试弄清楚如何使用带内 fec。您能否提供一个解码器部分的示例? @fsquirrel 也许这有帮助? ddanilov.me/how-to-enable-in-band-fec-for-opus-codec @nh2,这是我在弄清楚如何配置 FEC 后写的帖子。所以,是的,它可能会有所帮助! :) @fsquirrel 哈哈,太好了!

以上是关于如何为 Opus 编解码器使用 FEC 功能的主要内容,如果未能解决你的问题,请参考以下文章

实时音频编解码之十一Opus编码

实时音频编解码之十一Opus编码

实时音频编解码之十六 Opus解码

如何从 JavaScript 使用 Opus 编解码器

实时音频编解码之十六 Opus解码

为 Android 编译 Opus 编解码器所需的 Makefile