Alby's blog

世上没有巧合,只有巧合的假象。

0%

FFmpeg 音频可视化

一、概述

有时候需要将音频可视化,即转成视频。本文是一篇备忘录。

二、音频可视化

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

showcqt 可替换为 showwavesshowspectrumshowfreqs 等以显示其他图形。

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