我正在尝试从音频创建波形视频。我的目标是制作一个看起来像这样的视频
对于我的测试,我有一个播放短片声音的 mp3。有 4 个 1/4 音符小节和 4 个 1/8 音符小节以 120bpm 播放。我在想出正确的预处理和过滤组合以生成看起来像图像的视频时遇到了一些麻烦。颜色不必精确,我更关心节拍的形状。我使用 showwaves 和 showspectrum 尝试了几种不同的方法。我无法完全理解为什么在使用 showwaves 时节拍过得如此之快,但使用 showspectrum 会生成一个视频,我可以在其中看到每个节拍。
秀波
ffmpeg -i beat_test.mp3 -filter_complex "[0:a]showwaves=s=1280x100:mode=cline:rate=25:scale=sqrt,format=yuv420p[v]" -map "[v]" -map 0:a output_wav.mp4
Run Code Online (Sandbox Code Playgroud)
此链接将下载该命令的输出。
显示频谱
ffmpeg -i beat_test.mp3 -filter_complex "[0:a]showspectrum=s=1280x100:mode=combined:color=intensity:saturation=5:slide=1:scale=cbrt,format=yuv420p[v]" -map "[v]" -an -map 0:a output_spec.mp4
Run Code Online (Sandbox Code Playgroud)
此链接将下载该命令的输出。
我发布了简单的示例,因为我不想通过添加我尝试过的所有变体来混淆问题。
在实践中,我想我可以摆脱 showspectrum 的输出,但我想了解我在哪里/如何错误地思考这个问题。感谢您的任何建议。
这是源音频文件的链接。
什么showwaves是实时显示波形,显示窗口为1/帧率,即如果视频输出为25 fps,则每帧显示40 ms的音频波形。没有“历史”或“记忆”,因此您无法(直接)获得滚动输出,就像您的参考视频显示的那样。
解决方法是使用showwavespic滤波器以足够高的水平分辨率生成显示整个波形的单帧。然后将该图片滚动覆盖在所需的背景上,滚动速度与音频一样长。
基本命令模板是:
ffmpeg -loop 1 -i bg.png -loop 1 -i wavespic.png -i audio.mp3
-filter_complex "[0][1]overlay=W-w*t/mp3dur:y=SOMEFIXEDVALUE" -shortest waves.mp4
Run Code Online (Sandbox Code Playgroud)
mp3dur 以上应替换为音频文件的持续时间。