使用 FFmpeg 转换音频时,有-ar
和-ac
选项分别控制采样率和通道数。它还提供-ab
控制比特率的选项,但没有控制比特深度的选项。
自从…
[比特率] = [通道数] * [采样率] * [位深度]
...这是否意味着 ffmpeg 根据其他 3 个参数计算位深度?
另一篇帖子表示位深度由格式选项控制。这让我很困惑,因为如果用户设置了所有 4 个参数,上述等式可能不再成立。
有人能解释一下 FFmpeg 中的位深度和比特率如何工作吗?
答案1
至于可能性设置位深度:这取决于您的源文件和输出格式。
例如,取pcm_s16le
和pcm_s24le
- 两者都将渲染 PCM 文件,但分别具有 16 位/ 24 位的位深度。(您可以使用 找到此信息ffmpeg -h encoder=<YOUR_ENCODER>
。)
如果您的格式可以采用多种位深度(例如libmp3lame
),FFmpeg 将默认通过查看源文件来指定使用的值:因此,如果您采用-c:a libmp3lame
并且输入文件的位深度为 16 位,则 FFmpeg 将使用 16 位。如果您有一个 32 位文件并想在只能容纳 16 位的编解码器中对其进行编码,那么 FFmpeg 将为您对其进行采样。
但你也可以自己指定使用-sample_fmt
。
至于你的比特率公式:FFmpeg 与几乎所有其他工具一样,将音频通道数、位深度和采样率视为固定值(这意味着它们不会在文件内改变),而比特率是与编码质量相关的变量。然而,这仅适用于有损编解码器;这就是为什么重新编码 WAV 文件 200 次不会产生任何影响,而使用相当不错的 MP3 编码器重新编码同一文件 20 次已经会导致难以忍受的结果。
有损编解码器会将质量添加到您的方程式中:例如,在 MP3 中, 的值320k
将实现非常好的质量,因为编码器不必丢弃太多信息即可保持在指定值内。如果您使用-b:a 64k
,编码器将不得不丢弃许多信息才能达到指定的比特率。编码器将尽可能降低比特率以实现以下比特率:非常简单,因此只有可以删除的理论信息示例:
- 如果将 8-16kHz 的所有频率组合成一个半复数正弦波可以使编码器达到比特率,那么它就会这样做。
- 如果删除所有低于 -32dB 的信号就能达到目的,那么就这么做。
有关哪些信息会被删除的真实解释,我建议你先阅读维基百科关于音频数据压缩的文章。