2017-10-18 103 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演示,並檢查它的工作原理 –

相關問題