我注意到,当我使用 FFMPEG 将 mod 导出为 24 位或更高位的波形时,FFMPEG 决定使用可扩展编码而不是常规 PCM 编码并使用“Lavf58.76.100”,不管是什么。我使用 exiftool 检查导出的 wav,结果如下:
---- File ----
File Type : WAV
File Type Extension : wav
MIME Type : audio/x-wav
---- RIFF ----
Encoding : Extensible
Num Channels : 2
Sample Rate : 48000
Avg Bytes Per Sec : 288000
Bits Per Sample : 24
Software : Lavf58.76.100
问题是,许多程序不理解这种可扩展的 wav 格式。有没有办法告诉 FFMPEG 改用常规 PCM?我注意到其他程序(例如低音库)可以使用常规 PCM 编码导出为 24 位 wav。
这是我正在使用的命令:
ffmpeg -y -loglevel error -f libopenmpt -i c:\temp\sometrack.IT -map_metadata -1 -c:a pcm_s24le c:\temp\sometrack.wav
编辑
当我写这个问题时,我有点沮丧并且缺乏知识。现在,一切都非常清楚了;位深度高于 16 位的 wave 文件,应具有 WAVE_FORMAT_EXTENSIBLE 标记(这是有道理的,请参阅答案)。除了 FFmpeg,我用来将 mod 文件渲染为 wave 的软件不遵守这条规则。谢谢 Tom Yan 的澄清。
(并非我的所有评论都是准确/正确的,因此如果您有兴趣,请参阅以下内容。)
从理论上讲,
PCMWAVEFORMAT
可用于比特深度高于 16 的音频。标头结构不构成任何限制,阻止其自身支持此类音频。但是,ffmpeg 没有为这种音频编写这种格式的 WAVE 标头显然有几个原因。
一方面,该格式已被 , 取代
WAVEFORMATEX
,并且根据文档:除上述要求外,没有为比特深度高于 16 的 PCM 音频定义的
wFormatTag
值。WAVE_FORMAT_EXTENSIBLE
中定义的“扩展”是否
WAVEFORMATEXTENSIBLE
可以在 is 时wFormatTag
省略WAVE_FORMAT_EXTENSIBLE
并不完全清楚。在WAVEFORMATEX
中,指出:有了这样的声明,可能没有人会/不应该假设它是被允许的。
如果您仔细阅读
WAVEFORMATEX
,WAVEFORMATEXTENSIBLE
您会注意到后者存在的真正原因(就位深度而言)是,它允许前者存储 8 的倍数容器大小,而“真实”样本大小存储在后者中定义的扩展之一。例如,对于某些(讨厌的)20 位 PCM 流,分别为 24 和 20。不过,
wav
据我所知,ffmpeg 的多路复用器不(至少不正确)支持刚才提到的古怪案例。0
(我认为,如果这样的流没有被拒绝,这两个字段的值都将被写入。)如果您确实需要 ffmpeg 以
PCMWAVEFORMAT
24 位音频的格式编写标头,您可以考虑使用以下补丁构建它:然后通过
-extensible 0
在输出文件路径/名称之前添加,您应该能够获得所谓的“常规”24 位 WAVE 文件。