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

标签 audio ffmpeg wav sdl-2 sox

有关我的问题的更多背景信息,请参阅此处: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
使用 ffmpeg -i input.wav -ar 48000 -ac 2 -acodec pcm_s16le output.wav 将我的 WAV 文件(24 位)转换为 16 位时它保留音频格式 PCM = 0x001。

使用 ffmpeg -i input.wav -ar 48000 -ac 2 -acodec pcm_s32le output.wav 时音频格式 PCM = 0xfffe。

SDL2(如在父问题中所见)仅允许文件以线性 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并尝试。如果这不起作用并且此行为超出规范,则归档 bug report .

关于audio - 如何在保持音频格式 PCM = 1(线性量化)的同时将 24 位 WAV 文件转换为 32 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048078/

相关文章:

audio - 好的音频混响源?

video - ffmpeg 在另一个视频上叠加视频

c - 使用二维数组创建和存储波形文件数据时遇到问题

tensorflow - 在tf.print中动态更改output_stream的值/文件?

ios - 打开 Siri 停止 AVAudioPlayer

android - Android-x86 4.3音频

windows - 播放振荡/振动会产生的声音

html - 如何生成用于 VideoJS 的视频预览缩略图?

c# - 将图像写入 Process.StandardInput.BaseStream 的更快方法