如何在 ffmpeg 中将值限制为音频频率?

如何在 ffmpeg 中将值限制为音频频率?

如果我想制作自己的音频可视化工具,例如让某个图像随着音频的节拍扩展和收缩,我该怎么做?有没有办法在 ffmpeg 中获取音频频率并将其限制为其他值?谢谢。

答案1

您需要的是样本响度的指示。对于数字信号,可以通过 RMS 级别测量。您可以使用astats筛选在 ffmpeg 中使用元数据注入来获取每个样本的 RMS 级别:

ffmpeg -i input.m4a -filter:a "astats=metadata=1:reset=1,ametadata=mode=print:key=lavfi.astats.Overall.RMS_level:file=stats.txt" -f null -

在这里,metadata=1reset=1启用元数据的输出,以及ametadata过滤器会打​​印这些值(mode=print)。输出被写入stats.txt,但未执行任何实际编码(-f null -)。日志如下所示:

frame:0    pts:0       pts_time:0      
lavfi.astats.Overall.RMS_level=-77.999541
frame:1    pts:1536    pts_time:0.032  
lavfi.astats.Overall.RMS_level=-68.693275
frame:2    pts:3072    pts_time:0.064  
lavfi.astats.Overall.RMS_level=-62.974396
frame:3    pts:4608    pts_time:0.096  
lavfi.astats.Overall.RMS_level=-61.259331
frame:4    pts:6144    pts_time:0.128  

您可以根据按键过滤线条lavfi.astats.Overall.RMS_level并使用这些 dB 值进行可视化:

grep "lavfi.astats.Overall.RMS_level=" stats.txt | sed 's/lavfi.astats.Overall.RMS_level=//g' > stats_clean.txt

最小值为负无穷,最大值为 0 – 因此您必须自己适当地重新调整这些值。您可能需要根据某些移动平均过滤器过滤这些值才能获得正确的可视化效果。

PS:音乐没有单身的音频频率。你听到的音频由不同的频率组成,我们称之为光谱。它看起来像这样,您可以看到特定频率随时间变化的强度:

作者:Aquegg - 自己的作品,公共领域,https://commons.wikimedia.org/w/index.php?curid=5544473

ffmpeg 的astats过滤器只能输出时域信息,而不能输出频域信息(如上图所示)。如果你想用 ffmpeg 生成频谱,你可以用showspectrum筛选尽管。

相关内容