ffmpeg 能检测音频文件的实际比特率吗?

ffmpeg 能检测音频文件的实际比特率吗?

ffmpeg 能否告诉我音频文件是否经过了放大?我看到在这篇文章中,他们使用了频谱分析仪检查音频文件的实际比特率。ffmpeg 能否确定实际比特率并适当地编码文件?所谓适当,是指以适合文件所含音频质量的正确比特率进行编码?

答案1

您链接的页面内容非常不准确。信号的实际比特率可能确实与编码的信息量不同,但频谱的截止值是不是与比特率直接相关。

瞧,我可以选择用 MP3 编码器以 192 kBit/s 的速度对具有全频谱分辨率的原始原始文件进行编码,使用过滤器或编码器设置截止 16 kHz 的最高频率,并且您会 - 基于该文章 - 认为它只有 128 kBit/s。

换句话说,某些高频的缺失并不一定意味着低比特率编码被另一轮任意比特率的编码所掩盖。它只表明确实有高频缺失,可以被认为是一种低沉的声音。

FFmpeg 确实有一个频谱分析仪内置,但缺少轴上的刻度,因此可能没有那么有用斯佩克


为了给您一个演示,我在 Audacity 中生成了一个文件,其中包含 30 秒的 20、18、16 和 14 kHz 的正弦波,幅度为 0.8,叠加到单声道 16 位 PCM WAV 文件中。

然后我使用 LAME 将它们以不同的比特率编码为 MP3:

for b in 320 192 128 96 64 32; do lame -b "$b" test.wav "test-$b.mp3"; done

从消息中我们可以看出,LAME 确实对 64 kBit/s 文件使用 16-17 kHz 的低通滤波器,而不是“默认”的 20 kHz。对于 32 kBit/s,它将切换到 8 kHz 滤波器。

让我们将它们放入 Spek 等频谱仪中,看看会发生什么。正如预期的那样,即使对于 96 kBit/s,您也可以获得完整的频谱 - 参见 20 kHz 处出现的红线。当然,您还可以获得频率倍数的谐波,这是 MP3 压缩的结果。

96千比特/秒

对于 64 kBit/s,您可以看到 16 kHz 滤波器开始启动,这导致 16 kHz 正弦波出现红线 - 但仍然有高于该频率的频率,因为低通滤波器没有衰减其截止点以上的频率。

64千比特/秒

最后,对于 32 kBit/s,您可以看到 8 kHz 滤波器的作用。在这里,确实,高于该频率的频率衰减得足够多,因此不可见。但是,尽管有该滤波器,您仍然可以在文件中听到一些声音。

32千比特/秒

因此,我们看到,高频的缺失暗示使用了滤波器,但截止频率不能用于确定文件编码的比特率。

想要证据吗?让我们生成一个以 320 kBit/s 截断为 8 kHz 的文件:

$ lame --lowpass 8000 -b 320k test.wav test-fake.mp3
LAME 3.99.5 64bits (http://lame.sf.net)
Resampling:  input 44.1 kHz  output 22.05 kHz
Using polyphase lowpass filter, transition band:  7913 Hz -  8180 Hz
Encoding test.wav to test-fake.mp3

在这里您可以看到截止值,但您还会注意到,由于比特率高,混叠(噪音)的数量显著减少:

当你收听这些文件时,假测试文件听起来比具有相同频谱的 32 kBit/s 文件“干净”得多。

答案2

至于您问的 ffmpeg 是否可以检测音频文件的比特率,答案是肯定的。

以下是 mp3 文件的 ffmpeg 输出示例:

Duration: 00:04:12.73, start: 0.025056, bitrate: 332 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 320 kb/s

此外,ffmpeg 还可以让您轻松地使用预定义的比特率进行编码(https://www.ffmpeg.org/ffmpeg.html

我必须说,我不确定你关于检测升级的问题,但我敢打赌它不能。但是,通过查看文件的详细信息,凭直觉,你也许能够看到升级的“代码异味”。

希望这可以帮助!

相关内容