"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 不会包含在编码流中
我正在尝试用 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 不会包含在编码流中