ffmpeg:处理 24 位 wav 文件时 s32 是什么意思

ffmpeg:处理 24 位 wav 文件时 s32 是什么意思

我有一个 24 位 48 KHz 的 wav 文件,但是当我通过 ffmpeg 提供它时,流看起来像这样:

Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s32 (24 bit), 2304 kb/s

因此,它清楚地表示pcm_24le,据我理解,这意味着 pcm 签名的 24 位小端序,但随后它还表示s3224 bit紧接着。这是什么意思?文件是否同时是 24 位和 32 位,或者 s32 在这种情况下是否意味着完全不同的东西。

我在处理 dts 流时也遇到过类似的情况。如果我有一个包含正常 dts 音频流的 mkv 文件,它会被识别为 dts 5.1,但是当我使用 ffmpeg 通过使用 -c copy 命令从文件中删除一些流时,它在新的 mkv 文件中突然变成了 dts s32 5.1。

那么,s32 除了有符号 32 位之外还能表示其他什么吗?

答案1

这看起来像是一个报告错误。

类似的错误报告是 24 位 FLAC 显示为每样本 32 位 #23,该问题本应在2018年得到修复。有评论说“ffmpeg打印的信息总是32位”。

类似的错误报告,但最近于 2022 年发布 在日志 #9 中包含每个样本的位数,其中还提到:

看起来这可能是由于 ffprobe 中不同字段的差异造成的。sample_fmt 是一种内部表示,对于实际为 24 位的文件,它将显示 32p,但我们想要的正确值实际上是 bits_per_raw_sample

答案2

pcm_s24le(24 位音频数据)和 s32(32 位样本容器)之间的差异经常发生,因为许多系统和文件格式本身不支持 24 位整数。在这种情况下,24 位音频数据通常存储在 32 位容器中。

在文件中scipy.io.wavfile.read可以发现,当24位音频数据以32位整数PCM格式存储时,它保留了其24位精度。

WAV 格式 分钟 最大限度 NumPy 数据类型
32 位整数 PCM -2147483648 +2147483647 int32
24 位整数 PCM -2147483648 +2147483392 int32

相关内容