如何在保持音频格式 PCM = 1(线性量化)的同时将 24 位 WAV 文件转换为 32 位

How to Convert a 24bit WAV file to 32bit while keeping Audio Format PCM = 1 (linear quantization)

有关我的问题的更多上下文,请参阅此处:https://gamedev.stackexchange.com/questions/136817/how-to-get-sdl2-to-play-32bit-wav-files

我有一个音频格式 PCM 为 1 的 24 位 WAV 文件,请参阅此处: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(如 parent 问题中所示)仅允许文件以线性 PCM 音频格式播放 (1),我不确定如何使用 soxffmpeg将我的 24 位 WAV 文件向上转换为 32 位(因为 SDL2 只能播放 32 位和 16 位)。

我问的可能吗?非常感谢有关 WAV 文件的更多信息以及 ffmpeg 更改 header 数字的原因。

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);
...

粗略的尝试是将 0x20 处的 2 个字节替换为 01 00 并尝试。如果这不起作用并且此行为是 out-of-spec,则提交 bug report.