我正在尝试用C ++实现Opus转码器,我有一些概念性的问题。 至于useinbandfec参数,我并不完全理解"单向只接收参数"的含义,如RFC7587, section 7.1中所述:
" useinbandfec"参数是单向只接收 参数。
例如,Alice正在给Bob打电话。 Alice使用Opus编解码器,useinbandfec = 1,而Bob没有使用Opus。因此,两者之间应该有一个Opus转码器。如果是这样,我该如何配置Opus编码器和解码器的设置?
至于Alice-> Bob需要opus_decode()
,应该将什么值作为第5个参数(fecFlag)发送?至于需要Opus编码器的Bob-> Alice,应该在OPUS_SET_INBAND_FEC()
中使用opus_encoder_ctl()
发送什么值?
谢谢!
答案 0 :(得分:2)
参数useinbandfec
此参数表示编码器将其他信息添加到流中以恢复丢失的数据包。它是如何工作的,当编码器编码N + 1个数据包时,它会添加一些关于数据包N的信息,如果它支持恢复,它对解码器很有用。
如果解码器不支持恢复,则此信息无用且浪费带宽。
单向仅接收参数含义
这意味着如果您在会话描述符(SDP)中指定它,那么此参数描述接收者的能力并建议发送者使用或不使用入站FEC
<强>问题:强>
<强> 1 强>
例如,Alice正在给Bob打电话。 Alice使用Opus编解码器 useinbandfec = 1,而Bob没有使用Opus。因此,应该有 两者之间的Opus转码器。如果是这样,我该如何配置 Opus编码器和解码器的设置?
在此配置中,您需要Alice和Bob之间的代码转换器。如果代码转换器支持FEC,您可能更喜欢将useinbandfec = 1包含到SDP fmtp属性中。如果编码器(Alice设备上的发送者)也在您的控制之下,您可以设置ask encoder以在以下条件中将FEC添加到流中:
<强> 2 强>
至于Alice-&gt; Bob需要opus_decode(),应该是什么值 作为第5个参数发送(fecFlag)?
opus_decode检测丢包时使用FEC标志(例如通过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 强>
至于Bob-&gt; Alice,需要Opus编码器的是什么价值 应该与opus_encoder_ctl()中的OPUS_SET_INBAND_FEC()一起发送?
OPUS_SET_INBAND_FEC最好根据从Alice SDP检索到的useinbandfec参数进行设置。另请注意,除非您未设置OPUS_SET_PACKET_LOSS_PERC
,否则FEC不会包含在编码流中