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

时间:2017-04-27 16:51:33

标签: ffmpeg

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

enter image description here

对于我的测试我有一个播放短剪辑声音的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

1 个答案:

答案 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应该替换为音频文件的持续时间。