Что означает параметр useinbandfec в Opus для однонаправленного приема?

Я пытаюсь реализовать транскодер Opus на C++, и у меня есть несколько концептуальных вопросов. Что касается параметра useinbandfec, я не совсем понимаю значение однонаправленного параметра только для приема, как написано в RFC7587, раздел 7.1:

Параметр useinbandfec является однонаправленным параметром только для приема.

Например, Алиса звонит Бобу. Алиса использует кодек Opus с useinbandfec=1, а Боб не использует Opus. Следовательно, между ними должен быть транскодер Opus. Если да, то как я могу настроить параметры кодировщика и декодера Opus?

Что касается Алисы->Боба, где нужно opus_decode(), какое значение нужно передать в качестве 5-го параметра (fecFlag)? А что касается Боба-›Алисы, где нужен кодер Opus, какое значение нужно отправить с OPUS_SET_INBAND_FEC() в opus_encoder_ctl()?

Благодарю вас!


person Rex    schedule 18.10.2017    source источник


Ответы (1)


Параметр useinbandfec

Этот параметр означает, что кодировщик помещает в поток дополнительную информацию для восстановления потерянных пакетов. Как это работает, когда кодировщик кодирует пакет с номером N+1, он добавляет туда некоторую информацию о пакете N, которая полезна для декодера, если он поддерживает восстановление.

Если декодер не поддерживает восстановление, то эта информация бесполезна и расходует пропускную способность.

Значение параметра "только однонаправленный прием"

Это означает, что если вы укажете его в дескрипторе сеанса (SDP), то эти параметры описывают возможности получателя и советуют отправителю использовать или не использовать входящий FEC.

Вопросы:

1

Например, Алиса звонит Бобу. Алиса использует кодек Opus с useinbandfec=1, а Боб не использует Opus. Следовательно, между ними должен быть транскодер Opus. Если да, то как я могу настроить параметры кодировщика и декодера Opus?

В этой конфигурации вам нужен транскодер между Алисой и Бобом. Если транскодер поддерживает FEC, вы можете включить useinbandfec=1 в атрибут fmtp SDP. Если кодировщик (отправитель на устройстве Алисы) также находится под вашим контролем, вы МОЖЕТЕ установить запрос кодировщика на добавление FEC в поток при следующих условиях:

  • Потери в сети (могут быть обнаружены RTCP)
  • Способность транскодера декодировать его (может быть известна из параметра SDP)

2

Что касается Алисы->Боба, где требуется opus_decode(), какое значение должно быть отправлено в качестве 5-го параметра (fecFlag)?

Флаг opus_decode FEC используется при обнаружении потери пакетов (например, по порядковому номеру RTP). Предположим, что вы получили пакет N, а пакет N-1 потерян. Затем вы можете восстановить пакет N-1, вызвав opus_decode с параметром fecFlag, установленным в true, а затем декодировать пакет N:

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

3

А что касается Боба->Алисы, где нужен кодировщик Opus, какое значение следует отправить с помощью OPUS_SET_INBAND_FEC() в opus_encoder_ctl()?

OPUS_SET_INBAND_FEC лучше устанавливать из параметра useinbandfec, полученного от Алисы SDP. Также имейте в виду, что FEC не включается в закодированный поток, если вы не установите OPUS_SET_PACKET_LOSS_PERC

person Dmitry Poroh    schedule 18.10.2017
comment
Если FEC включен, не должен ли fecFlag в вопросе 2 быть наоборот, согласно opus_demo.c? При декодировании pktN-1 проходим по строке 785, а при декодировании pktN проходим по строке 781? - person Rex; 18.11.2017
comment
Код opus_demo довольно запутанный. Я думаю, что утверждение о том, что FEC добавляется к последующему пакету, является хорошим доказательством того, что вам нужны данные FEC пакета N для восстановления пакета N-1: tools.ietf.org/html/rfc6716#section-2.1.7 Но если вы не верите, вы можете добавить немного печати в демо-версию OPUS и проверить, как это работает. - person Dmitry Poroh; 18.11.2017