一、概述
有时候需要将音频可视化,即转成视频。本文是一篇备忘录。
二、音频可视化
1、简单显示
1 2 3 4 5
| ffmpeg -i input.mp3 \ -filter_complex "[0:a]showcqt=s=640x360,format=yuv420p[v]" \ -map "[v]" -map 0:a \ -c:v libx264 -c:a aac \ output.mp4 -y
|
showcqt
可替换为 showwaves
、showspectrum
、showfreqs
等以显示其他图形。
2、修改视频的背景颜色和图形颜色
1 2 3 4 5
| ffmpeg -i input.mp3 \ -filter_complex "[0:a]showfreqs=s=640x360:mode=bar:colors=#824880,format=yuva420p[video];color=s=640x360:color=#e7e7eb[bg];[bg][video]overlay=format=auto:shortest=1:eval=frame[output]" \ -map "[output]" -map 0:a \ -c:v libx264 -c:a aac \ output.mp4 -y
|
3、连接音频并合成视频
1 2 3 4 5
| ffmpeg -i input1.mp3 -i input2.mp3 \ -filter_complex "[0:a][1:a]concat=v=0:a=1,asplit=2[a1][a2];[a1]showfreqs=s=640x360:mode=bar:colors=#824880,format=yuva420p[video];color=s=640x360:color=#e7e7eb[bg];[bg][video]overlay=format=auto:shortest=1:eval=frame[v]" \ -map "[v]" -map "[a2]" \ -c:v libx264 -c:a aac \ output.mp4 -y
|
使用 asplit
复制连接后的音频,一份用于生成视频,一份用于最终合成到文件。
其他备忘
1、连接音频
1 2 3 4
| ffmpeg -i input1.mp3 -i input2.mp3 \ -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1[out]" \ -map "[out]" \ output.mp3 -y
|
2、label 被使用的问题
1 2 3 4 5
| ffmpeg -i input1.mp3 -i input2.mp3 \ -filter_complex "[0:a][1:a]concat=v=0:a=1[a];[a]showfreqs=s=640x360:mode=bar:colors=#824880,format=yuva420p[video];color=s=640x360:color=#e7e7eb[bg];[bg][video]overlay=format=auto:shortest=1:eval=frame[v]" \ -map "[v]" -map "[a]" \ -c:v libx264 -c:a aac \ output.mp4 -y
|
上面的的命令会报错:[out#0/mp4 @ 0x6000007a8180] Output with label 'a' does not exist in any defined filter graph, or was already used elsewhere.
。
所以要么将 [a]
复制一份,要么重新 concat
。“连接音频并合成视频”中将音频使用 asplit
将音频复制了一份,下面的代码是重新 concat
:
1 2 3 4 5
| ffmpeg -i input1.mp3 -i input2.mp3 \ -filter_complex "[0:a][1:a]concat=v=0:a=1[a1];[0:a][1:a]concat=v=0:a=1[a2];[a1]showfreqs=s=640x360:mode=bar:colors=#824880,format=yuva420p[video];color=s=640x360:color=#e7e7eb[bg];[bg][video]overlay=format=auto:shortest=1:eval=frame[v]" \ -map "[v]" -map "[a2]" \ -c:v libx264 -c:a aac \ output.mp4 -y
|
参考资料
FFmpeg filters