Как конвертировать 24-битный файл WAV в 32-битный, сохраняя аудиоформат PCM = 1 (линейное квантование)

Обратитесь сюда для получения дополнительной информации о моем вопросе: https://gamedev.stackexchange.com/questions/136817/how-to-get-sdl2-to-play-32bit-wav-files

У меня есть 24-битный файл WAV с аудиоформатом PCM 1, см. Здесь: http://soundfile.sapp.org/doc/WaveFormat/ на AudioFormat

При преобразовании моего файла WAV (24 бит) в 16 бит с использованием: ffmpeg -i input.wav -ar 48000 -ac 2 -acodec pcm_s16le output.wav он сохраняет аудиоформат PCM = 0x001.

При использовании ffmpeg -i input.wav -ar 48000 -ac 2 -acodec pcm_s32le output.wav аудиоформат PCM = 0xfffe.

SDL2 (как видно из родительского вопроса) позволяет воспроизводить файлы только с линейным аудиоформатом PCM (1), и я не уверен, как с помощью sox или ffmpeg конвертировать мои 24-битные файлы WAV вверх в 32-битные (поскольку SDL2 воспроизводит только 32-битные и 16-битные файлы). ).

Возможно ли то, о чем я прошу? Мы будем очень благодарны за дополнительную информацию о файлах WAV и о том, почему ffmpeg изменяет номер заголовка.


person jake    schedule 05.02.2017    source источник


Ответы (1)


FFmpeg использует следующий код для установки тега кодека

...
waveformatextensible = (par->channels > 2 && par->channel_layout) ||
                       par->channels == 1 && par->channel_layout && par->channel_layout != AV_CH_LAYOUT_MONO ||
                       par->channels == 2 && par->channel_layout && par->channel_layout != AV_CH_LAYOUT_STEREO ||
                       par->sample_rate > 48000 ||
                       par->codec_id == AV_CODEC_ID_EAC3 ||
                       av_get_bits_per_sample(par->codec_id) > 16;

if (waveformatextensible)
    avio_wl16(pb, 0xfffe);
...

Грубой попыткой было бы просто заменить 2 байта в 0x20 на 01 00 и попробовать. Если это не сработает и такое поведение не соответствует требованиям, отправьте отчет об ошибке.

person Gyan    schedule 05.02.2017
comment
Я попробую вручную отредактировать шестнадцатеричный файл файла и посмотреть, позволяет ли это воспроизводить его обычными средствами. Я заметил несколько отчетов об ошибках в ffmpeg, касающихся некоторых аналогичных проблем с расширяемым форматом. В частности, с этой строкой (›2 канала = false, sample_rate› 48k = false, av_get_bits_per_sample ›16 = true (возможно, мне придется изучить эту функцию / макрос)), поэтому я поиграю с ней и получу назад. Спасибо, что изучили это. - person jake; 05.02.2017
comment
Использование Vim для редактирования шестнадцатеричного числа байтов 20 и 21 заголовка WAV с fe ff (0xfffe) на 01 00 (0x0001) позволяет SDL2 (родительский пост) идеально воспроизводить подписанный 32-битный прямой порядок байтов. Не знаю, как сообщить об этом как об ошибке, но, возможно, есть причина для расширяемого формата волны, хотя я никогда о нем не слышал. - person jake; 05.02.2017
comment
Я считаю, что здесь виноват SDL2. Исходная спецификация WAVE допускала только 8- и 16-битные выборки. Более новая спецификация позволяет увеличить глубину и частоту дискретизации. Отчет об ошибке должен быть отправлен вместе с проектом SDL. - person Gyan; 05.02.2017
comment
Я разместил здесь сообщение: forum.libsdl.org/viewtopic.php? p = 52656 # 52656, прося дополнительных советов по этому поводу, но да, я буду сообщать об ошибке или делать запрос на вытягивание (чтобы исправить это, можно добавить еще одну константу и переключить регистр, как мне кажется, не так сложно) . - person jake; 05.02.2017
comment
Обратите внимание, что в исходном сообщении разработчика игры эта ошибка была недавно исправлена ​​в SDL2, вероятно, недоступна в менеджерах пакетов, но она действительно была исправлена ​​вчера. - person jake; 18.02.2017