ffmpeg 能否告诉我音频文件是否已被放大?我在这篇文章中看到,他们使用频谱分析仪来检查音频文件的真实比特率。ffmpeg 可以确定真正的比特率并适当地编码文件吗?通过适当的方式,我的意思是为文件包含的音频质量以正确的比特率进行编码?
您链接到的页面的内容非常不准确。信号的实际比特率可能确实与其中编码的信息量不同,但频谱的截止与比特率没有直接关系。
看,我可以选择使用 MP3 编码器以 192 kBit/s 的全光谱分辨率对原始原始文件进行编码,使用滤波器或编码器设置切断 16 kHz 的最高频率,并且您会——基于那篇文章——认为它只有 128 kBit/s。
换句话说,某些高频的缺失并不一定意味着低比特率编码被另一轮具有任意比特率的编码所掩盖。它只表明确实缺少高频,可以感知为低沉的声音。
FFmpeg 确实有一个内置的频谱分析仪,但它在轴上没有刻度,因此不如Spek有用。
为了给大家演示,我在 Audacity 中生成了一个文件,其中包含 20、18、16 和 14 kHz 的 30 秒正弦波,幅度为 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
Run Code Online (Sandbox Code Playgroud)
我们可以从消息中看到,LAME 确实对 16–17 kHz 的 64 kBit/s 文件使用了低通滤波器,而不是“默认”20 kHz。对于 32 kBit/s,它将切换到 8 kHz 滤波器。
让我们将它们放入光谱仪(如 Spek)中,看看会发生什么。正如预期的那样,即使对于 96 kBit/s,您也可以获得完整的频谱——请参见出现在 20 kHz 处的红线。当然,由于 MP3 压缩,您还可以得到倍频的谐波。
对于 64 kBit/s,您可以看到 16 kHz 滤波器开始工作,这导致 16 kHz 正弦波出现红线——但仍有高于该值的频率,因为低通滤波器不会衰减高于其正弦波的频率截止点。
最后,对于 32 kBit/s,您可以看到 8 kHz 滤波器的运行情况。在这里,确实,上面的频率衰减得足够多,所以它们不可见。但是,尽管有过滤器,您还是可以听到文件中的某些内容。
所以,我们看到的是,没有高频暗示正在使用过滤器,但截止频率不能用于确定文件编码的比特率。
要证据吗?让我们生成一个以 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
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到截止,但您还会注意到由于高比特率,混叠(噪声)量显着减少:
当您聆听文件时,假测试文件听起来比具有相同频谱的 32 kBit/s 文件“干净”得多。