「動画に会社ロゴを焼き込みたい」「YouTubeチャンネルのウォーターマークを右下に入れたい」——FFmpegの overlay フィルタを使えば、透明PNGのロゴを任意の位置・時間・透明度で合成できます。GUIソフト不要、コマンド1行で完結します。所要時間:10分。
動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI検証済み)
この記事でわかること
overlayフィルタの基本構造と-filter_complexの使い方- 位置指定変数(
main_w・overlay_w等)で動画サイズに依存しない配置 - 透明PNG(アルファチャンネル)のロゴを自然に合成する方法
- 透明度を下げた半透明ウォーターマーク
- 特定の時間帯だけロゴを表示(イントロ・アウトロ限定など)
- 流れるスクロール型ウォーターマーク
- 複数ロゴの同時合成
- よくあるエラーと解決策5件
- FAQ 5問
コマンド例
1. 基本:左上にロゴを合成
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
-i input.mp4… メイン動画-i logo.png… ウォーターマーク画像overlay=X:Y… ロゴ左上角を (X, Y) に配置(左上が原点)
2. 右下に配置(最も一般的)
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=main_w-overlay_w-20:main_h-overlay_h-20" \
output.mp4
main_w-overlay_w-20… 右端から20pxマージンmain_h-overlay_h-20… 下端から20pxマージン
3. ロゴをリサイズしてから合成(アルファ透明対応)
透明PNGのロゴを幅150pxにリサイズして右下に配置します。
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "[1:v]scale=150:-1[wm];[0:v][wm]overlay=main_w-overlay_w-20:main_h-overlay_h-20" \
output.mp4
フィルタグラフ解説:
[1:v]scale=150:-1[wm]… ロゴ(2番目の入力)を幅150pxにリサイズ →[wm]ラベルを付与[0:v][wm]overlay=...… メイン動画とリサイズ済みロゴを合成
アルファチャンネル付きPNGはFFmpegが自動的に透過処理します。特別な設定は不要です。
4. 透明度を下げた半透明ウォーターマーク
colorchannelmixer フィルタでアルファチャンネルを調整します(0.5=50%不透明)。
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "[1:v]scale=150:-1,colorchannelmixer=aa=0.5[wm];[0:v][wm]overlay=main_w-overlay_w-20:main_h-overlay_h-20" \
output.mp4
aa=0.5… アルファ成分を50%に(0.0=完全透明、1.0=完全不透明)
5. 特定の時間帯だけロゴを表示
enable オプションで表示時間を秒単位で制御します。
# 動画の0〜5秒のみロゴ表示
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=main_w-overlay_w-20:main_h-overlay_h-20:enable='between(t,0,5)'" \
output.mp4
# 10秒〜30秒の間だけ表示
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=10:10:enable='between(t,10,30)'" \
output.mp4
t… 現在のタイムスタンプ(秒)between(t, 開始秒, 終了秒)… 範囲内で1(有効)を返す関数
6. 横スクロールするウォーターマーク
ロゴが左から右へ流れるアニメーション効果です。
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "[1:v]scale=200:-1[wm];[0:v][wm]overlay=x='mod(t*100,main_w+overlay_w)-overlay_w':y=main_h-overlay_h-20" \
output.mp4
mod(t*100, main_w+overlay_w)-overlay_w… 1秒あたり100px移動、画面外から入って画面外へ出る
7. 複数ロゴの同時合成
左上と右下に2つのロゴを同時に合成します。
ffmpeg -i input.mp4 -i logo1.png -i logo2.png \
-filter_complex "[1:v]scale=100:-1[wm1];[2:v]scale=150:-1[wm2];[0:v][wm1]overlay=10:10[tmp];[tmp][wm2]overlay=main_w-overlay_w-20:main_h-overlay_h-20" \
output.mp4
位置指定変数リファレンス
| 変数 | 意味 |
|---|---|
main_w / W | メイン動画の幅 |
main_h / H | メイン動画の高さ |
overlay_w | ロゴの幅 |
overlay_h | ロゴの高さ |
t | 現在時刻(秒、アニメーション用) |
定番位置の座標式
| 位置 | X 式 | Y 式 |
|---|---|---|
| 左上 | 10 | 10 |
| 右上 | main_w-overlay_w-10 | 10 |
| 左下 | 10 | main_h-overlay_h-10 |
| 右下(推奨) | main_w-overlay_w-20 | main_h-overlay_h-20 |
| 中央 | (main_w-overlay_w)/2 | (main_h-overlay_h)/2 |
オプション詳解
| オプション | 意味 | 例 |
|---|---|---|
overlay=X:Y | ロゴ配置位置(左上原点) | overlay=10:10 |
enable='between(t,S,E)' | 表示時間制御(S秒〜E秒) | enable='between(t,0,5)' |
[N:v]scale=W:-1 | N番目の入力を幅Wpxにリサイズ | [1:v]scale=150:-1 |
colorchannelmixer=aa=A | アルファ値調整(0.0〜1.0) | aa=0.5(50%透明) |
x='mod(t*speed,...)' | アニメーション(スクロール) | x='mod(t*100,main_w+overlay_w)-overlay_w' |
トラブルシューティング
エラー1: Too many inputs for overlay filter
原因: -vf でoverlayを使おうとしている。overlayは2入力が必要なため -vf では動作しない。
解決策: -filter_complex を使用してください:
# 間違い
ffmpeg -i input.mp4 -i logo.png -vf "overlay=10:10" output.mp4
# 正しい
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
エラー2: ロゴが見えない(透明になっている)
原因: ロゴPNGのアルファチャンネルが完全透明、またはロゴが小さすぎる。
解決策:
# ロゴのサイズとアルファを確認
ffprobe -v quiet -show_streams logo.png | grep -E "width|height|pix_fmt"
エラー3: Output file #0 does not contain any stream
原因: -filter_complex のフィルタグラフが正しくない(ラベル名の不一致など)。
解決策: フィルタグラフの [wm] などのラベルが前後で一致しているか確認。
エラー4: ロゴのアスペクト比が崩れる
原因: scale=W:H で幅と高さを両方指定している。
解決策: scale=150:-1(高さを -1 にするとアスペクト比保持)を使用。
エラー5: 動画が再エンコードされてファイルサイズが増える
原因: overlayフィルタを使うと必ず再エンコードが発生します(これは仕様)。
軽減策: CRFを低めに設定して品質を維持:
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=main_w-overlay_w-20:main_h-overlay_h-20" \
-c:v libx264 -crf 18 -preset fast -c:a copy output.mp4
FAQ
Q1. JPEGのロゴは使えますか?
A. 使えますが、JPEGはアルファチャンネル(透過)に対応していません。透過ロゴを使いたい場合はPNG(またはWebP)を使用してください。不透明な四角いロゴであればJPEGも問題ありません。
Q2. overlay フィルタを使うと必ず再エンコードされますか?
A. はい。overlayフィルタはフレームを合成するため、映像ストリームは必ず再エンコードされます。音声は -c:a copy で無劣化コピーできます。
Q3. 動画の解像度が変わっても右下に固定できますか?
A. はい。main_w-overlay_w-20:main_h-overlay_h-20 のような変数式を使えば、どんな解像度でも正しく右下に配置されます。
Q4. ロゴの透明度を時間によって変化させられますか?
A. はい。enable と colorchannelmixer=aa= を組み合わせることで可能ですが、複雑なフィルタグラフになります。シンプルな実装は enable='between(t,0,5)' で表示ON/OFFを切り替える方法です。
Q5. バッチ処理で複数動画に同じロゴを追加するには?
for f in *.mp4; do
ffmpeg -i "$f" -i logo.png \
-filter_complex "[1:v]scale=150:-1[wm];[0:v][wm]overlay=main_w-overlay_w-20:main_h-overlay_h-20" \
-c:v libx264 -crf 18 -c:a copy "watermarked_${f}" -y
done
関連記事
- 動画をリサイズ・スケールする — scale フィルタの使い方
- FFmpegコマンドの基本構文 — 入力・フィルタ・出力の順序
- 動画からGIFを作成する完全ガイド
- 動画圧縮の完全ガイド — CRF・ビットレート・プリセット
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-filters.html / trac.ffmpeg.org