2016-08-27 1 views
0

Я захватываю живой аудиопоток Opus, и независимо от того, что я выбираю для частоты дискретизации звука, я получаю выходной сигнал 48 кГц.ffmpeg не соблюдает частоту дискретизации в выходе opus

Это моя командная строка

./ffmpeg -f ALSA -ar 16000 -i sysdefault: CARD = CoDeC -f ALSA -ar 16000 -i sysdefault: CARD = CODEC_1 -filter_complex присоединиться к = Входы = 2: channel_layout = stereo: map = 0.1-FR \ | 1.0-FL, asetpts = expr = N/SR/TB -ar 16000 -ab 64k -c: opus -vbr off -compression_level 5 output.ogg

И это то, что FFmpeg отвечает:

Выход # 0, ogg, to 'output.ogg: Метаданные: encoder: Lavf57.48.100 Поток # 0: 0: Аудио: opus (libopus), 16000 Гц, стерео, s16, задержка 104, дополнение 0 , 64 кб/с (по умолчанию) Metadata: кодировщик: Lavc57.54.100 libopus

Однако, оказывается, что FFmpeg солгал, потому что при повторном анализе файла, я получаю:

Вход # 0, ogg, from 'output.ogg': Продолжительность: 00: 00: 03.21, start: 0.000000, bitrate: 89 kb/s поток # 0: 0: Аудио: опус, 48000 Гц, стерео, s16, задержка 156, утеплитель 0 Metadata: ЭНКОДЕРА: Lavc57.54.100 libopus

Я попытался так много перестановок частоты дискретизации, что упрощает вплоть до одного аудиовхода и т. д. и т. д. - всегда с тем же результатом.

Любые идеи?

ответ

4

Этот вопрос должен быть задан и отвечать на вопрос Super User, поскольку речь идет о программном обеспечении вместо программирования. Но, поскольку я знаю ответ, я все равно отправлю его.

FFmpeg будет кодировать Opus с установленной частотой дискретизации. Вы можете проверить это в исходном коде libopusenc.c (here и here).

Но FFmpeg будет декодировать Opus на частоте 48 кГц, даже если он был закодирован с более низкой частотой дискретизации. Вы можете проверить это в libopusdec.c (here и here).

Это действительно рекомендуется спецификацией Ogg Opus (IETF RFC 7845). Раздел 5.1, пункт 5 говорит:

Ogg Opus игрок должен выбрать частоту воспроизведения в соответствии со следующей процедурой:

  1. Если оборудование поддерживает воспроизведение 48 кГц, декодирование с частотой 48 кГц.
  2. В противном случае, если самая высокая доступная частота дискретизации оборудования является поддерживаемой скоростью, декодируйте с этой частотой дискретизации.
  3. В противном случае, если самая высокая доступная частота дискретизации оборудования составляет менее 48 кГц, декодируется на следующей более высокой скорости, поддерживаемой Opus, выше максимальной доступной аппаратной скорости и повторной выборки.
  4. В противном случае декодирование при 48 кГц и повторная выборка.

С FFmpeg и большинство воспроизведения аппаратной поддержки 48 кГц, 48 кГц используется для декодирования Opus в FFmpeg. Исходная частота выборки хранится в пакете OpusHead контейнера Ogg, поэтому вы можете получить его с помощью анализатора или другого проигрывателя, если хотите, но FFmpeg игнорирует его и просто декодирует на частоте 48 кГц.

+0

спасибо за это. Следует также отметить, что VLC также сообщает файл как 48Khz - и размер файла слишком велик, чтобы быть 16 кГц, поэтому я довольно уверен, что он содержит 48000 выборок в секунду данных ... Я расшифровал файл в WAV, а затем использовать opusenc, чтобы сжать его до 16Khz, и это было намного меньше .... – Adam

Смежные вопросы