3

Я хотел бы переместить поток 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 ответа2

3

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

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

Допустимые потоки Ogg начинаются с OggS , который отмечает начало каждой страницы Ogg в файле. В предоставленном вами файле перед первым OggS есть 66 байт. По крайней мере, в 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, и перекодировать его, чтобы убедиться, что он не содержит никаких других странностей.

0

Я столкнулся с той же проблемой, с той лишь разницей, что мне нужно было обрабатывать большое количество 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 в одной папке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .