如果我想制作自己的音频可视化工具,例如让某个图像随着音频的节拍扩展和收缩,我该怎么做?有没有办法在 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=1
并reset=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:音乐没有单身的音频频率。你听到的音频由不同的频率组成,我们称之为光谱。它看起来像这样,您可以看到特定频率随时间变化的强度:
ffmpeg 的astats
过滤器只能输出时域信息,而不能输出频域信息(如上图所示)。如果你想用 ffmpeg 生成频谱,你可以用showspectrum
筛选尽管。