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

2026
H.B.

Я хотел бы переместить поток 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
(для учета этого в двух полях размера чанка в заголовке волны изменен встроенный поток «без уведомления»)

3
Действительно ли он воспроизводится правильно в MPlayer? Я не думаю, что файлы * .wav поддерживают потоки vorbis - они должны быть просто необработанными данными PCM. Darth Android 11 лет назад 0
@DarthAndroid: Они поддерживают необработанные данные и кодировку, см. [Википедия] (http://en.wikipedia.org/wiki/Waveform_Audio_File_Format). H.B. 11 лет назад 0
@HB Можете ли вы предоставить пример файла ввода? LordNeckbeard 11 лет назад 0
@LordNeckbeard: Я сделал более короткий образец из одного из файлов, если вы все еще заинтересованы ... H.B. 11 лет назад 0

2 ответа на вопрос

3
mark4o

Контейнер 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, и перекодировать его, чтобы убедиться, что он не содержит никаких других странностей.

Я уже пытался удалить заголовок волны, однако `MPlayer` больше не будет его воспроизводить, и у других игроков тоже будут проблемы. Также по какой-то причине `OggS` также можно найти в других местах в потоке, см., Например, смещение 2f196 образца, хотя я не знаю много о спецификации ogg vorbis ... H.B. 11 лет назад 0
`OggS` должен быть в начале каждой страницы Ogg. Я расширил свой ответ для решения проблемы, которую вы видите. mark4o 11 лет назад 0
Перекодирование - это именно то, чего я пытаюсь избежать, чтобы не потерять качество. Спасибо за ваше время, я посмотрю на этот подход ... H.B. 11 лет назад 0
Решение @HB mark4o не перекодирует IIRC и, по крайней мере, позволяет ffmpeg правильно декодировать семпл. LordNeckbeard 11 лет назад 0
@LordNeckbeard: я знаю, я просто ссылался на последний абзац: * «Может быть, лучше просто прочитать файл WAV с помощью программы, такой как Audacity, и перекодировать его» * H.B. 11 лет назад 0
К сожалению, есть еще некоторые проблемы, связанные с длиной носителя. Странно, что исходные файлы работают очень хорошо, и когда поток извлекается, мои проигрыватели не могут сказать, сколько еще времени, или они выдают ошибку в конце файла ... H.B. 11 лет назад 0
@HB В своем ответе я заменил уродливый перк-хак на некоторые инструменты, которые должны быть в состоянии сделать лучше. mark4o 11 лет назад 0
@ mark4o: Снова попробовал, и в итоге использовал `moggsplit`, который работал довольно хорошо, еще раз спасибо. H.B. 11 лет назад 0
@ mark4o: Между прочим, `tail -c + 67` не обязательно корректен, поскольку байты в волновом блоке должны быть четными, поэтому в конце может быть нулевой байт, который необходимо учитывать. H.B. 11 лет назад 0
0
Lissanro Rayen

I have encountered the same problem, with only difference that I needed to process large number of Ogg Vorbis WAV files. Audacity could not open many of them (currently Audacity lacks support for Ogg Vorbis WAV files with codec ID 6771), not to mention it cannot batch process files recursively (its Apply Chain feature limited to files in single directory).

I ended up writing ogg_wav script to convert Ogg Vorbis WAV to more usable format. The script have many options and error handling. It can convert Ogg Vorbis WAV to uncompressed WAV (-c option), or extract primary OGG stream (-e option, the default if no options provided), among other things. It skips files without Ogg streams. With -d option it will delete original .wav file.

This is how it works in simplest case: it checks if file have Ogg stream with ogginfo, checks if we have necessary write permissions, then looks for first "OggS" mark and uses moggsplit to try to extract Ogg stream(s), and if there is more than one, it assumes that the largest playable Ogg stream is the one we want. The script can handle some more complicated cases too and has many options, run ogg_wav -h to see them all.

Here are some examples how to use it. First, it is necessary to install the script: download ogg_wav (it requieres Bash shell and I tested it only in Linux), make it executable (with chmod +x) and put it to /usr/local/bin/.

To convert Ogg Vorbis WAV to OGG (it is possible to specify more than 1 file or use shell globbing like *.wav):

ogg_wav ogg-vorbis.wav 

The command above will create ogg-vorbis.ogg by extracting largest playable OGG stream from the WAV file.

For large number of files it is better to use GNU parallel. This is the command to convert Ogg Vorbis WAV to uncomressed WAV recursively (remove -d option if you would like to keep backup of original WAV files by changing .wav extension to .bak):

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

The script will skip WAV files with no Ogg stream inside so it can be used even you have uncompressed WAV and Ogg Vorbis WAV in the same folder.

Похожие вопросы