Как извлечь поток Vorbis из файла WAVE?

Я хотел бы переместить поток Vorbis в контейнер ogg, но ffmpeg, похоже, не распознает поток.

Даже если MPlayer дает этот вывод при воспроизведении:

Открытие аудио декодера: [acm] Win32/ACM декодеры
Загрузка DLL кодека: 'vorbis.acm'
Загруженный DLL-драйвер vorbis.acm на 10000000
Предупреждение! Отчеты кодеков ACM srcsize=0
АУДИО: 44100 Гц, 2 канала, s16le, 128,0 кбит /9,07% (соотношение: 16000->176400)
Выбранный аудиокодек: [vorbisacm] afm: acm (OggVorbis ACM)

FFmpeg:

ffmpeg -i Source.wav -acodec copy Target.ogg
Input #0, wav, from 'Source.wav':
  Duration: 00:02:15.17, bitrate: 128 kb/s
    Stream #0.0: Audio: qg[0][0] / 0x6771, 44100 Hz, 2 channels, 128 kb/s
[ogg @ 00000000003096C0] Unsupported codec id in stream 0
Output #0, ogg, to 'Target.ogg':
  Metadata:
    encoder         : Lavf53.6.0
    Stream #0.0: Audio: qg[0][0] / 0x6771, 44100 Hz, 2 channels, 128 kb/s
Stream mapping:
  Stream #0.0 -> #0.0
Could not write header for output file #0 (incorrect codec parameters ?)

Конечно, это не обязательно должно быть сделано через ffmpeg, любой работоспособный метод подойдет...


Я сократил один из файлов до 512 КБ: sample.wav
(Изменились два поля размера куска в заголовке волны, чтобы учесть это, встроенный поток обрезается "без уведомления")

2 ответа

Решение

Контейнер WAV - это просто заголовок файла. Он не поддерживает фреймы переменной длины, требуемые Vorbis. "OggVorbis ACM" на самом деле является Vorbis в контейнере Ogg (для обеспечения кадрирования), так что его можно использовать в устаревшей звуковой платформе Windows ACM, которая не поддерживает требуемое кадрирование. Это также позволяет использовать его в файлах WAV, хотя это не имеет особого смысла, поскольку вместо этого можно просто сохранить файл.ogg.

ffmpeg не реализует и не распознает этот нестандартный WAV-кодек "OggVorbis ACM". Вы можете использовать программу, которая распознает это, например Audacity, или вы можете просто удалить WAV-заголовок, чтобы извлечь Ogg Vorbis, который находится внутри.

Допустимые потоки Ogg начинаются с OggS, который отмечает начало каждой страницы Ogg в файле. В предоставленном вами файле 66 байтов до первого OggS, По крайней мере, в Mac/Linux/Unix вы можете удалить первые 66 байт с помощью команды:

tail -c +67 sample.wav > sample.ogg

В вашем файле встроенный Ogg фактически содержит два потока, что, по-видимому, является попыткой дополнить его до фиксированной скорости передачи данных. Второй поток имеет неизвестный кодек и, похоже, сбивает с толку некоторых игроков. Например, Firefox воспроизводит первый поток (игнорируя второй), но Chrome останавливается, когда он встречает второй поток. У него также есть другие нарушения спецификаций, в том числе отсутствие eos (конец потока) (возможно, из-за того, что вы не опубликовали полный файл).

Если вы извлекаете первый поток битов (vorbis), он, кажется, работает правильно. Вот некоторые инструменты, которые должны быть в состоянии извлечь первый поток битов:

  • oggsplit (работает с файлами wav или ogg)
  • oggSplit из Ogg Video Tools (работает с файлом ogg)
  • oggz-rip (однако эта программа не любит ваш файл, вероятно, из-за других нарушений спецификаций)

Может быть, лучше просто прочитать файл WAV с помощью программы, такой как Audacity, и перекодировать его, чтобы убедиться, что он не содержит никаких других странностей.

Я столкнулся с той же проблемой, с той лишь разницей, что мне нужно было обрабатывать большое количество WAV-файлов Ogg Vorbis. Audacity не может открыть многие из них (в настоящее время Audacity не поддерживает WAV-файлы Ogg Vorbis с кодеком ID 6771), не говоря уже о том, что он не может рекурсивно пакетно обрабатывать файлы (его функция Apply Chain ограничена файлами в одном каталоге).

В итоге я написал скрипт ogg_wav, чтобы конвертировать Ogg Vorbis WAV в более удобный формат. Скрипт имеет множество опций и обработку ошибок. Он может конвертировать Ogg Vorbis WAV в несжатый WAV (-c опция) или извлечение первичного потока OGG (-e опция, по умолчанию, если опции не предоставлены), между прочим. Он пропускает файлы без потоков Ogg. С -d Опция удалит оригинальный WAV-файл.

Вот как это работает в простейшем случае: он проверяет, есть ли у файла поток Ogg с ogginfo, проверяет, есть ли у нас необходимые разрешения на запись, затем ищет первую метку "OggS" и использует moggsplit, чтобы попытаться извлечь поток (и) Ogg, и если их больше одного, предполагается, что самый большой воспроизводимый поток Ogg - это тот, который мы хотим. Скрипт может обрабатывать и более сложные случаи и имеет много опций ogg_wav -h чтобы увидеть их всех.

Вот несколько примеров, как его использовать. Во-первых, необходимо установить скрипт: скачать ogg_wav (для этого требуется оболочка Bash, а я тестировал его только в Linux), сделать его исполняемым (с помощью chmod +x) и положить его на /usr/local/bin/,

Чтобы преобразовать Ogg Vorbis WAV в OGG (можно указать более 1 файла или использовать глобблирование оболочки, например *.wav):

ogg_wav ogg-vorbis.wav

Приведенная выше команда создаст ogg-vorbis.ogg путем извлечения наибольшего воспроизводимого потока OGG из файла WAV.

Для большого количества файлов лучше использовать GNU параллельно. Это команда для рекурсивного преобразования Ogg Vorbis WAV в несжатый WAV (удалить -d вариант, если вы хотите сохранить резервную копию оригинальных файлов WAV, изменив расширение.wav на.bak):

find DIRECTORY -type f -iname '*.wav' | parallel ogg_wav -cd '{}'

Скрипт пропускает файлы WAV без потока Ogg, поэтому его можно использовать, даже если вы распаковали WAV и Ogg Vorbis WAV в одной папке.

Другие вопросы по тегам