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

What does "useinbandfec is a unidirectional receive-only parameter" mean in 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 的信息,如果它支持恢复,这对解码器很有用。

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

单向只接收参数含义

这意味着如果您在会话描述符 (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 FEC 标志用于检测数据包丢失(例如通过 RTP 序列号)。假设您收到数据包 N 并且丢失了 N-1 个数据包。然后,您可以通过调用 opus_decode 并将 fecFlag 设置为 true 来恢复数据包 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 不会包含在编码流中