Эффект замедления при декодировании аудиопотока OPUS - PullRequest
0 голосов
/ 01 мая 2018

Я перехватываю аудиопоток программы голосового чата (она является проприетарной, с закрытым исходным кодом, и я не контролирую ее), которая кодируется с помощью OPUS Codec , и я хочу декодировать это в необработанный звук PCM ( Opus Decoder doc ).

Что я делаю, это:

  1. Создание декодера OPUS: opusDecoder = opus_decoder_create(48000, 1, &opusResult);
  2. Расшифровать поток: opusResult = opus_decode(opusDecoder, voicePacketBuffer, voicePacketLength, pcm, 9600, 0);
  3. Сохранить в файл: pcmFile.write(pcm, opusResult * sizeof(opus_int16));
  4. Считать файл с помощью Audacity ( Файл> Импорт> Необработанные данные ... )

Здесь возникает проблема: иногда он работает отлично (я слышу декодированный звук PCM без сбоев и с оригинальной скоростью) , но иногда , декодированный аудиопоток находится в « замедленное движение » (иногда немного медленнее, чем обычно, иногда намного медленнее).

Не могу понять почему, потому что я не изменяю свою программу: настройки декодирования остаются прежними. Но иногда это работает, иногда нет. Кроме того, opus_decode() всегда может декодировать данные, код ошибки не возвращается.

Я прочитал, что декодер имеет " состояние " ( opus_decoder_ctl () doc ). Я думал, может быть, время между opus_decode() звонками важно?

Можете ли вы представить какой-либо параметр, будь то явный (например, параметры, переданные функциям) или неявный (время между двумя вызовами функций), который может вызвать этот эффект?

1 Ответ

0 голосов
/ 09 мая 2018

«Замедленное» аудио почти всегда не соответствует частоте дискретизации (записывается с высокой скоростью, но воспроизводится с низкой скоростью). Например, если вы записываете звук на частоте 48 кГц, но воспроизводите его как 8 кГц.

Другая возможная причина «медленного движения» - это более одного потока, декодированного одним и тем же декодером. Но в этом случае вы также получаете искаженный медленный звук.

Что касается OPUS:

  • Он всегда декодируется в темпе, который вы указали в параметрах создания.
  • Внутри него чистая математика (без каких-либо таймеров или вещей, связанных с реальным временем), поэтому это не важно, когда вы вызываете функцию декодирования.

Поэтому некоторые советы по устранению неполадок советуют:

  • Убедитесь, что вы не создаете декодер с разной частотой дискретизации
  • Убедитесь, что при импорте необработанного файла в Audacity вы всегда импортируете его в моно 48 кГц
  • Если что-либо из вышеперечисленного не поможет - проверьте, сколько байтов вы получаете от декодера для каждого пакета в случаях нормального / медленного движения. Для обычных аудиопотоков (с одинаковым межпакетным временем) вы всегда получаете одинаковое количество необработанных аудиосэмплов.
...