使用FFMPEG从音频生成波形视频

使用FFMPEG从音频生成波形视频,ffmpeg,Ffmpeg,我正在尝试从音频创建波形视频。我的目标是制作一个类似这样的视频 为了我的测试,我有一个mp3,它可以播放一个短的剪辑声音。以120bpm的速度播放4小节的1/4音符和4小节的1/8音符。我在如何正确组合预处理和过滤以生成与图像相似的视频方面遇到了一些问题。颜色不一定要精确,我更关心节拍的形状。我使用showwaves和showspectrum尝试了几种不同的方法。我无法完全理解为什么使用showwaves时,节拍过得如此之快,但使用showspectrum生成的视频可以让我看到每个节拍 Sho

我正在尝试从音频创建波形视频。我的目标是制作一个类似这样的视频

为了我的测试,我有一个mp3,它可以播放一个短的剪辑声音。以120bpm的速度播放4小节的1/4音符和4小节的1/8音符。我在如何正确组合预处理和过滤以生成与图像相似的视频方面遇到了一些问题。颜色不一定要精确,我更关心节拍的形状。我使用showwaves和showspectrum尝试了几种不同的方法。我无法完全理解为什么使用showwaves时,节拍过得如此之快,但使用showspectrum生成的视频可以让我看到每个节拍

ShowWaves

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
这将下载该命令的输出

ShowSpectrum

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
这将下载该命令的输出

我发布了这些简单的例子,因为我不想通过添加我尝试过的所有变体来混淆这个问题

在实践中,我想我可以不受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

mp3dur
以上内容应替换为音频文件的持续时间。

感谢您的回复。我创建了wavespic和背景图像。然后我运行了ffmpeg,提供了这个过滤器:“[0][1]overlay=W-W*t/16:y=0”让我看看是否理解正确。它应该对第二个输入应用覆盖过滤器。主宽度设置为叠加宽度乘以时间除以音频长度。我试图定位覆盖,使其从屏幕中央开始,但添加“x”参数似乎可以将其固定到位。在我的命令中,
W-W*t/mp3dur
是x表达式。从中间开始:
W/2-W*t/mp3dur
我在它周围玩,想出了这个滚动条设计:
color=c=black:s=2x360[bar];[1] [bar]overlay=x='main_w*t/MP3_DURATION-overlay_w/2':y=0[1];[grid][Spectroc1]叠加=x=0:y=0[Spectroc2];[0][spectroc2]overlay=x='max(最小值(主覆盖时间,0),主覆盖时间)'y=0
。您可以使用
showwavespic=s=WIDTHxHEIGHT:colors=#9cf42f,drawbox=x=(iw-w)/2:y=(ih-h)/2:w=iw:h=1:color=#9cf42f[1]
也可以动态生成波形,但请记住保持此宽度比视频的宽度大得多,以便条实际滚动。