2017-02-05 5 views
0

См здесь для больше контекста на мой вопрос: https://gamedev.stackexchange.com/questions/136817/how-to-get-sdl2-to-play-32bit-wav-filesКак конвертировать 24bit WAV файл в 32-битном, сохраняя формат аудио PCM = 1 (линейное квантование)

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

При преобразовании моего файла WAV (24bit) до 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 (как показано в родительском вопрос) позволяет только файлы играть с Linear PCM Audio Format (1), и я не уверен, как с помощью sox или ffmpeg как конвертировать мои 24-битные файлы WAV вверх в 32-х (как SDL2 только играет 32bit и 16bit).

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

ответ

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 и попробовать. Если это не работает, и это поведение не соответствует спецификации, введите файл bug report.

+0

Я попробую вручную отредактировать шестнадцатеричный файл и посмотреть, позволяет ли это играть обычным способом. Я замечаю некоторые сообщения об ошибках в ffmpeg относительно некоторых подобных проблем с расширением формата. Особенно с этой линией (> 2 канала = false, sample_rate> 48k = false, av_get_bits_per_sample> 16 = true (возможно, мне придется изучить эту функцию/макрос)), поэтому я буду играть с ней и получить назад. Благодарим вас за это. – jake

+0

Использование Vim для редактирования шестнадцатеричного байта 20 и 21 заголовка WAV с 'fe ff' (0xfffe) до' 01 00' (0x0001) позволяет SDL2 (родительский пост) отлично воспроизводить подписанный 32-битный малоконечный звук. Не знаете, как сообщить об этом как об ошибке, но, возможно, есть причина для «расширяемого формата волны», хотя я никогда не слышал об этом. – jake

+0

Я считаю, что это SDL2. Исходная спецификация WAVE допускала только 8 и 16 бит. Более новая спецификация позволяет увеличить глубину и скорость выборки. Отчет об ошибке должен быть подан в проект SDL. – Mulvya

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