用FFmpeg生成视频或音频的波形图
🌊 波形图在视频创作中的应用

波形可视化是音频内容视觉化的有效手段:

  • 音乐视频视觉元素:将波形图作为MV或纯音乐视频的背景,可以极大提升视觉吸引力,让听众'看到'音乐。
  • 播客封面增强:为播客或有声读物生成波形海报图,作为封面或社交媒体预览图,比纯文字更具吸引力。
  • 音频质量检查:通过生成的波形图可以直观判断音频是否存在削波(波形顶部被削平)、静音段落动态范围异常等问题。
  • 教学设计:在音乐教学或音频技术教程中,波形图能直观展示声音的强弱变化、节奏型和结构段落。

FFmpeg 波形图核心知识

FFmpeg 提供两个专用于波形可视化的音频滤镜:showwavespicshowwaves

  • showwavespic——生成静态波形图片。它一次性读取整个音频文件,将各采样点的幅值映射到像素位置,输出一张 PNG/JPEG 图片。适合做专辑封面、音频预览图、频谱海报等。基本用法:showwavespic=s=640x120 指定输出分辨率。
  • showwaves——生成动态波形视频。它随时间逐帧绘制波形,输出一段视频而非单张图片。常用于 YouTube 音频可视化视频、播客动态封面等。需配合编码器输出视频流,如 showwaves=s=1280x720:mode=line,format=yuv420p[v]

关键参数详解

  • split_channels(0 或 1)——控制多声道是否分行显示。默认值为 0,所有声道波形叠加在同一行;设为 1 时每个声道占用独立的一行,便于观察各声道差异。例如立体声音频设置 split_channels=1 后,左声道和右声道分别在上、下两行绘制。
  • colors——指定每个声道的颜色。用 | 分隔多个颜色值,按声道顺序对应。例如 colors=red|blue 表示第一个声道用红色、第二个用蓝色。支持 FFmpeg 中所有合法颜色名称(red、green、blue、yellow 等)及十六进制色值。
  • compand(音频压缩/扩展滤镜)——在波形生成前先通过 compand 滤镜调整音频的动态范围。它将低电平部分抬高、高电平部分压低(或反过来),使波形的"饱满度"更均匀,弱音不至于过细、强音不至于削顶。使用方式类似 compand,showwavespic=s=640x120
  • mode——控制波形的绘制样式,适用于 showwaves 动态滤镜。可选值:line(折线连接各采样点,连续平滑)、bar(竖条状,每帧对应一根竖线,经典可视化风格)、point(点状,每个采样点单独绘制)、p2p(尖峰到尖峰模式,强调峰值变化)。不同模式适合不同的视觉风格需求。
广告
{{v.name}}
默认情况下,showwavespic 会将所有音频通道的波形叠加显示在一张图中,代码如下
$ ffmpeg -i input.mp3 -filter_complex "showwavespic=s=640x120" -frames:v 1 output.png
如果音频有多个声道(如立体声),可以使用 split_channels 选项让每个声道在独立的行上显示,代码如下
$ ffmpeg -i input.mp3 -filter_complex "showwavespic=s=640x240:split_channels=1" -frames:v 1 output_separated.png
先用 aformat 滤波器转换为单声道再显示,代码如下
$ ffmpeg -i input.mp3 -filter_complex "aformat=channel_layouts=mono,showwavespic=s=640x120" -frames:v 1 output_mono.png
先使用 compand 滤波器来调整动态范围再显示,代码如下
$ ffmpeg -i input.mp3 -filter_complex "compand,showwavespic=s=640x120" -frames:v 1 output_companded.png
使用 colors 参数为每个音频通道指定不同的颜色并显示,代码如下
$ ffmpeg -i input.mp3 -filter_complex "showwavespic=s=640x120:colors=red|blue" -frames:v 1 output_colored.png
使用 showwaves 滤镜可以创建动态的波形视频,代码如下
$ ffmpeg -i input.mp3 -filter_complex "[0:a]showwaves=s=1280x720:mode=line,format=yuv420p[v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy output_wavevideo.mkv
友链