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

5

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

enter image description here

对于我的测试,我有一个播放短音频的mp3文件。有4个1/4音符和4个1/8音符的4个小节以120bpm的速度播放。我在尝试使用预处理和过滤器的正确组合来产生像图像一样的视频时遇到了一些问题。颜色不必完全相同,我更关心节拍的形状。我尝试使用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

This link will download the output of that command.
展示频谱
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的输出结果,但我想了解我思考的方式/位置有何错误。感谢任何建议。

这里是源音频文件的链接


很遗憾,下载链接已经失效。 - Florian Gössele
1个回答

7
showwaves 的功能是实时显示声波形,显示窗口的长度为 1/帧率,例如如果视频输出为 25 帧每秒,则每帧显示 40 毫秒音频的波形。它没有“历史”或“记忆”,因此您不能(直接)获得像参考视频所显示的滚动输出。

解决方法是使用 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”参数似乎将其固定在原地。 - RhythmicDevil
2
在我的命令中,W-w*t/mp3dur 是一个 x 表达式。要从中心开始:W/2-w*t/mp3dur - Gyan
我在尝试中得到了这个滚动条设计: color=c=black:s=2x360[bar]; [1][bar]overlay=x='main_w*t/MP3_DURATION-overlay_w/2':y=0 [spectro1]; [grid][spectro1] overlay=x=0:y=0 [spectro2]; [0][spectro2]overlay=x='max(min(main_w/2-overlay_w*t/MP3_DURATION,0), main_w-overlay_w)':y=0。 您可以在前面加上showwavespic=s=WIDTHxHEIGHT:colors=#9cf42f, drawbox=x=(iw-w)/2:y=(ih-h)/2:w= iw:h=1:color=#9cf42f [1]以实时生成波形图,但请记得将其宽度保持远大于视频的宽度,这样滚动条才会真正移动。 - Varad Mahashabde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接