2017-02-05 690 views
0

这里指的更多的情况下我的问题:https://gamedev.stackexchange.com/questions/136817/how-to-get-sdl2-to-play-32bit-wav-files如何转换24bit的WAV文件为32位,同时保持音频格式PCM = 1(线性量化)

我有了一个音频格式PCM 24位WAV文件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 = 0×001。

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

SDL2(如在父问题中所见)只允许使用线性PCM音频格式(1)播放文件,但我不确定如何使用soxffmpeg如何将我的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); 
... 

粗试图将只是01 00更换2个字节从0x20和尝试。如果这样做不起作用,并且此行为超出规格,请提交bug report

+0

我会尝试手动编辑文件的十六进制并查看是否允许它通过正常方式播放。我注意到有关ffmpeg的一些错误报告,涉及格式可扩展的一些类似问题。特别是,(> 2通道= false,sample_rate> 48k = false,av_get_bits_per_sample> 16 = true(可能,我将不得不看看那个函数/宏)),所以我会玩弄它并得到背部。 感谢您关注此事。 – jake

+0

使用Vim将WAV头文件的字节20和21的十六进制从'fe ff'(0xfffe)编辑为'01 00'(0x0001)允许SDL2(父帖)完美地播放带符号的32位小端音频。 不知道如何去报告这是一个错误,但也许有一个“扩展的波形格式”的原因,虽然我从来没有听说过它。 – jake

+0

我认为这是SDL2的错。最初的WAVE规范只允许8位和16位采样。较新的规格允许更大的采样深度和速率。 Bug报告应提交给SDL项目。 – Mulvya

相关问题