ポッドキャストの 1 話を YouTube に上げる、楽曲のサンプルを SNS に貼る、記事に波形のサムネイルを載せる——「音声だけ」の素材に映像を付けたい場面で、FFmpeg は外部ツールなしに波形やスペクトログラムを描けます。使うフィルタは目的別に 3 系統あります。
| 欲しいもの | フィルタ | 出力 |
|---|---|---|
| 波形の静止画(全体像) | showwavespic |
PNG 1 枚 |
| 再生に合わせて動く波形 | showwaves |
動画 |
| 周波数の静止画 / 動画 | showspectrumpic / showspectrum |
PNG / 動画 |
| 周波数バー(イコライザー風) | showfreqs |
動画 |
動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 12 件を検証スクリプトで実行し、全て成功しました(2026-09-06)
波形の静止画(showwavespic)
ffmpeg -i input.mp3 -filter_complex "showwavespic=s=1920x480" -frames:v 1 waveform.png
音声全体を 1 枚の画像に圧縮して描きます。-frames:v 1 は「1 フレームだけ出力」で、これがないと同じ画像を延々と書こうとします。背景は透明(アルファ付き RGBA)です。
色とサイズ
ffmpeg -i input.mp3 -filter_complex "showwavespic=s=1920x480:colors=#00d4aa" -frames:v 1 waveform.png
colors は 16 進または色名(white、red など)。ステレオ音源でチャンネルを上下に分けて別色にするなら split_channels=1 と | 区切りの色指定です。
ffmpeg -i input.mp3 -filter_complex "showwavespic=s=1920x480:split_channels=1:colors=#00d4aa|#ff6b6b" -frames:v 1 waveform.png
背景色を付ける
透明背景が困る場合(SNS の投稿画像など)は、color ソースで塗った背景に overlay で重ねます。
ffmpeg -i input.mp3 -filter_complex "color=c=#0f1117:s=1920x480[bg];[0:a]showwavespic=s=1920x480:colors=#00d4aa[fg];[bg][fg]overlay=format=auto" -frames:v 1 waveform.png
見た目のオプション
| オプション | 値 | 効果 |
|---|---|---|
scale |
lin(既定)/ log / sqrt / cbrt |
振幅の縮尺。話し声のような小さい音は sqrt や log にすると見えやすい |
draw |
scale(既定)/ full |
full は各サンプルを線で描くので密度が上がり、塗りつぶしに近い見た目になる |
filter |
average(既定)/ peak |
1 ピクセルに複数サンプルが入るときに平均をとるかピークをとるか |
ffmpeg -i input.mp3 -filter_complex "showwavespic=s=1920x480:draw=full" -frames:v 1 waveform.png
動く波形の動画(showwaves)
ffmpeg -i input.mp3 -filter_complex "[0:a]showwaves=s=1280x720:mode=cline:rate=30:colors=#00d4aa,format=yuv420p[v]" -map "[v]" -map 0:a -c:v libx264 -c:a aac -shortest output.mp4
s=1280x720— 出力解像度mode=cline— 中央線から上下対称に塗る。他にpoint(点)、line(線)、p2p(点を線で結ぶ)rate=30— 映像のフレームレート(既定は 25)format=yuv420p— showwaves の出力は RGBA なので、H.264 で広く再生できる yuv420p に変換する-shortest— 音声の終わりで動画も終わらせる
-vf ではなく -filter_complex を使うのは、音声ストリームを入力にして映像ストリームを出力する「種類をまたぐ」フィルタだからです。
背景色付き
showwaves も背景は透明なので、静止画と同じ手順で背景を敷きます。背景側にも r=30 でフレームレートを合わせてください。
ffmpeg -i input.mp3 -filter_complex "color=c=#0f1117:s=1280x720:r=30[bg];[0:a]showwaves=s=1280x720:mode=cline:rate=30:colors=#00d4aa[w];[bg][w]overlay=format=auto[v]" -map "[v]" -map 0:a -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest output.mp4
ジャケット画像の上に波形を置く(ポッドキャスト用)
静止画を -loop 1 で動画化し、その下部に細長い波形を重ねる構成です。ポッドキャストや楽曲の公開用として最もよく使われる形です。
ffmpeg -loop 1 -i cover.png -i input.mp3 -filter_complex "[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2[bg];[1:a]showwaves=s=1280x200:mode=cline:rate=30:colors=#00d4aa[w];[bg][w]overlay=0:520:format=auto[v]" -map "[v]" -map 1:a -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest output.mp4
scale=...:force_original_aspect_ratio=decrease,pad=... は、画像を 1280×720 に収めて余白を黒で埋める定型です。overlay=0:520 で高さ 200 の波形を画面下部(y=520〜720)に置いています。
スペクトログラム(showspectrumpic / showspectrum)
横軸が時間、縦軸が周波数、色が強さです。ノイズの帯や高域の有無(MP3 の 16 kHz カットなど)が一目で分かるので、音質チェックにも使えます。
ffmpeg -i input.mp3 -filter_complex "showspectrumpic=s=1920x480" -frames:v 1 spectrum.png
既定では軸と目盛りの凡例が描かれます。デザイン用途で不要なら legend=0。色は color=intensity(既定は channel)など。
ffmpeg -i input.mp3 -filter_complex "showspectrumpic=s=1920x480:legend=0:color=intensity" -frames:v 1 spectrum.png
動画版は showspectrum で、slide=scroll にすると右から左へ流れる表示になります。
ffmpeg -i input.mp3 -filter_complex "[0:a]showspectrum=s=1280x720:mode=combined:color=intensity:slide=scroll[v]" -map "[v]" -map 0:a -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest output.mp4
周波数バー(showfreqs)
イコライザー風に周波数帯ごとのバーが動くビジュアライザーです。
ffmpeg -i input.mp3 -filter_complex "[0:a]showfreqs=s=1280x720:mode=bar:colors=#00d4aa[v]" -map "[v]" -map 0:a -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest output.mp4
showfreqs にも rate オプションがあり、既定は 25fps です(実測で出力が 25/1 になることを確認)。30fps にしたい場合は rate=30 を足してください。
実測: 描画時間とファイルサイズ
3 分(180 秒)のステレオ MP3 を素材に、各フィルタの処理時間と出力サイズを測りました。素材は anoisesrc で生成したピンクノイズで、波形の情報量としては最悪ケースです(実際の音楽や会話はこれより小さくなります)。エンコードは libx264 -preset veryfast -crf 23、i9-14900KF、FFmpeg 8.1、2026-09-02 計測。
| 出力 | 処理時間 | サイズ |
|---|---|---|
showwavespic 1920×480 PNG |
0.24 s | 8 KB |
showspectrumpic 1920×480 PNG |
0.46 s | 1.2 MB |
showwaves cline 1280×720 / 30fps / 3 分 |
15.5 s | 82 MB |
showwaves cline 1920×1080 / 30fps / 3 分 |
27.4 s | 86 MB |
showspectrum 1280×720 / 3 分 |
6.5 s | 9.5 MB |
showfreqs bar 1280×720 / 3 分 |
13.2 s | 32 MB |
ここから分かることが 2 つあります。
showwavesは H.264 と相性が悪い。 毎フレーム細い線が全画面で激しく動くため、動き予測がほとんど効かず、3 分で 82 MB(約 3.6 Mbps)になりました。同じ音源のスペクトログラム動画は 9.5 MB です。波形動画のサイズを抑えたいなら、mode=clineで塗り面を作る、波形を画面の一部(高さ 200px など)に限定する、-crfを上げる、の順に効きます。- 720p と 1080p でサイズはほぼ同じ(82 MB vs 86 MB)。線の本数が変わらないので、解像度を上げても増えるのは処理時間だけです。
ピンクノイズという極端な素材なので、会話のポッドキャストならこの数分の一に収まります。ただし傾向は同じです。
よくある質問
出力が真っ黒 / 波形が見えない
showwaves と showwavespic の出力は透明背景(RGBA)です。透明を扱えないプレイヤーやビューアでは黒く見えます。本文の color + overlay で背景を敷いてください。また、声の小さい録音は scale=sqrt か scale=log にすると振幅が見えるようになります。
ステレオを 1 本の波形にしたい
showwavespic は既定でチャンネルを重ねて描きます(split_channels=0)。完全に 1 本にしたいなら前段で aformat=channel_layouts=mono を挟んで先にモノラル化してください。
波形だけの動画に音が入っていない
-map 0:a を忘れると映像だけになります。-map を 1 つでも書くと FFmpeg のストリーム自動選択は無効になるので、-map "[v]" で映像を指定した時点で音声側も明示的に -map する必要があります。
関連ツール
波形動画作成ツールは、音声ファイルからこの記事の showwaves 相当の動画をブラウザ内で生成します。
関連記事
- 音声を抽出する — 動画から音声だけを取り出す
- 音量の測定(volumedetect) — 波形の前にレベルを確認する
- ラウドネス正規化 — 配信前の音量揃え
- GIF 作成 — 短い波形をアニメ GIF にする場合