2017-10-18 100 views
0

我想在C++中实现Opus代码转换器,并且我有一些概念性问题。 对于useinbandfec参数,我不太明白的“单向只接收参数”的意思,写在RFC7587, section 7.1在Opus中,“useinbandfec是一个单向只接收参数”是什么意思?

的“useinbandfec”参数是一个单向只接收 参数。

例如,Alice正在给Bob打电话。 Alice使用Opus编解码器,其中useinbandfec = 1,而Bob不使用Opus。因此,两者之间应该有Opus代码转换器。如果是这样,我如何配置Opus编码器和解码器的设置?

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

谢谢!

回答

2

参数useinbandfec

此参数意味着编码器把附加信息流,以恢复丢失的数据包。它是如何工作的,当编码器对第N + 1个数据包进行编码时,它会在其中添加一些有关数据包N的信息,如果它支持恢复,则对解码器有用。

如果解码器不支持恢复,那么这个信息是无用的,浪费带宽。

单向只接收意思

参数这意味着,如果你在会话描述符(SDP)指定它那么这个参数描述了接收器的能力,并建议寄件人使用或不使用入站FEC

问题:

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

在这种配置中,您需要Alice和Bob之间的代码转换器。如果代码转换器支持FEC,则可能更愿意将useinbandfec = 1包括到SDP fmtp属性中。如果编码器(爱丽丝设备上发送者)也是你的控制之下,你可以将要求编码器,FEC添加到流中的下列condtions:

  • 损失网络(可通过RTCP被检测)
  • 转码能力对其进行解码(可以从SDP参数已知的)

至于Alice->鲍勃其中需要opus_decode(),什么值建议立即进行删除d为 作为第五个参数发送(fecFlag)?

opus_decode FEC标志用于检测丢包(例如,通过RTP序列号)。让我们假设你收到包N和N-1包丢失。然后,你可以通过调用opus_decode与fecFlag恢复分组N-1设置为true并且然后解码分组N:

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

至于Bob->爱丽丝其中的Opus编码器是需要什么值 应与opus_encoder_ctl()中的OPUS_SET_INBAND_FEC()一起发送?

OPUS_SET_INBAND_FEC最好从Alice SDP检索的useinbandfec参数中设置。另请注意,FEC不包括在编码流中,除非您未设置OPUS_SET_PACKET_LOSS_PERC

+0

如果启用了FEC,则根据[opus_demo.c](https://),问题2中的fecFlag是否应该是相反的方式。 github.com/gcp/opus/blob/master/src/opus_demo.c#L777)?当解码pktN-1时,我们通过785行,当解码pktN时,我们通过781行? – Rex

+0

opus_demo代码很麻烦。我认为将FEC添加到后续数据包中的说法很好地证明了您需要数据包N FEC数据恢复数据包N-1:https://tools.ietf.org/html/rfc6716#section-2.1.7 但是,如果您不相信你可以添加一些打印OPUS演示,并检查它的工作原理 –

相关问题