如何在保持音频格式 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),我不确定如何使用 sox
或 ffmpeg
将我的 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.
有关我的问题的更多上下文,请参阅此处: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),我不确定如何使用 sox
或 ffmpeg
将我的 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.