我正在尝试从音频创建波形视频。我的目标是制作一个看起来像这样的视频
对于我的测试我有一个播放短剪辑声音的mp3。有4个1/4音符条和4个1/8音符条以120bpm播放。我在预处理和过滤的正确组合方面遇到了一些麻烦,以产生看起来像图像的视频。颜色不一定要精确,我更关心节拍的形状。我尝试了几种使用showwaves和shows谱的不同方法。我不能完全理解为什么在使用showwaves时节拍会如此快速地过去,但是使用showspectrum会产生一个视频,我可以看到每个节拍。
ShowWaves
def _download_flow(self, url):
req = requests.get(url, stream=True)
if req.status_code == 200:
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".csv")
for chunk in req.iter_content():
tmp.write(chunk)
return tmp
raise Exception('error:{}'.format(req.status_code))
此link将下载该命令的输出。
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
此link将下载该命令的输出。
我发布了简单的示例,因为我不想通过添加我尝试的所有变体来混淆问题。
在实践中,我想我可以放弃showpectrum的输出,但我想知道我在哪里/如何错误地思考这个问题。谢谢你的建议。
这是源音频文件的link。
答案 0 :(得分:2)
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
应该替换为音频文件的持续时间。