c++ - Opus 中的 "useinbandfec is a unidirectional receive-only parameter"是什么意思?

标签 c++ audio codec opus

我正在尝试用 C++ 实现 Opus 转码器,但我有一些概念性问题。 至于useinbandfec这个参数,不太明白“unidirectional receive-only parameter”的意思,写在RFC7587, section 7.1 :

The "useinbandfec" parameter is a unidirectional receive-only parameter.

例如,Alice 正在调用 Bob。 Alice 使用 useinbandfec=1 的 Opus 编解码器,而 Bob 不使用 Opus。因此,两者之间应该有一个Opus转码器。如果是这样,我该如何配置 Opus 编码器和解码器的设置?

对于Alice->Bob,需要opus_decode(),第5个参数(fecFlag)应该传什么值?至于需要 Opus 编码器的 Bob->Alice,应该在 opus_encoder_ctl() 中用 OPUS_SET_INBAND_FEC() 发送什么值?

谢谢!

最佳答案

参数useinbandfec

此参数表示编码器将附加信息添加到流中以恢复丢失的数据包。它是如何工作的,当编码器对第 N+1 个数据包进行编码时,它会添加一些关于数据包 N 的信息,如果解码器支持恢复,这些信息对解码器很有用。

如果解码器不支持恢复,则此信息无用且浪费带宽。

单向只接收参数含义

这意味着如果您在 session 描述符 (SDP) 中指定它,那么此参数描述接收方的能力并建议发送方使用或不使用入站 FEC

问题:

1

For example, Alice is calling Bob. Alice uses Opus codec with useinbandfec=1, while Bob doesn't use Opus. Therefore, there should be a Opus transcoder between the two. If so, how can I configure the settings of Opus encoder and decoder?

在此配置中,您需要 Alice 和 Bob 之间的转码器。如果转码器支持 FEC,您可能更愿意将 useinbandfec=1 包含到 SDP fmtp 属性中。如果编码器(Alice 设备上的发送者)也在您的控制之下,您可以设置要求编码器在以下条件下将 FEC 添加到流中:

  • 网络丢失(可以通过 RTCP 检测到)
  • 解码它的转码器能力(可以从 SDP 参数中获知)

2

As for Alice->Bob where opus_decode() is needed, what value should be sent as the 5th parameter (fecFlag)?

opus_decode FEcflags用于检测数据包丢失(例如通过 RTP 序列号)。假设您收到数据包 N 并且丢失了 N-1 个数据包。然后你可以通过将 fecFlag 设置为 true 调用 opus_decode 来恢复数据包 N-1,然后解码数据包 N:

packets[N-1] = decode_opus(pktN, fecFlag=true)
packets[N]   = decode_opus(pktN, fecFlag=false)

3

And as for Bob->Alice where a Opus encoder is needed, what value should be sent with OPUS_SET_INBAND_FEC() in opus_encoder_ctl()?

OPUS_SET_INBAND_FEC 最好通过从 Alice SDP 检索到的 useinbandfec 参数来设置。另请注意,除非您不设置 OPUS_SET_PACKET_LOSS_PERC,否则 FEC 不会包含在编码流中。

关于c++ - Opus 中的 "useinbandfec is a unidirectional receive-only parameter"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46819965/

相关文章:

cordova - Android/Phone Gap - 如何录制 MP3

ios - 为什么VideoDataOutput的availableVideoCodecTypes为空?

c++ - 无法让 OpenGL 中的 Gouraud Shading 工作

c++ - 使用 omp_get_thread_num 索引全局 vector 是否安全?

ios - 在其他 swift 文件中调用时,AVAudioPlayer 不会播放声音

android - 无法使MediaPlayer.prepareAsync正常工作

c++ - 我可以使用 auto 或 decltype 代替尾随返回类型吗?

Python 嵌入,ImportError : cannot import name _remove_dead_weakref

IMX6 板的音频问题(max98357a 编解码器)

hadoop - HDFS 中的文本文件未正确压缩