「動画に会社ロゴを焼き込みたい」「YouTubeチャンネルのウォーターマークを右下に入れたい」——FFmpegの overlay フィルタを使えば、透明PNGのロゴを任意の位置・時間・透明度で合成できます。GUIソフト不要、コマンド1行で完結します。所要時間:10分。

動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI検証済み)


この記事でわかること

  1. overlay フィルタの基本構造と -filter_complex の使い方
  2. 位置指定変数(main_woverlay_w 等)で動画サイズに依存しない配置
  3. 透明PNG(アルファチャンネル)のロゴを自然に合成する方法
  4. 透明度を下げた半透明ウォーターマーク
  5. 特定の時間帯だけロゴを表示(イントロ・アウトロ限定など)
  6. 流れるスクロール型ウォーターマーク
  7. 複数ロゴの同時合成
  8. よくあるエラーと解決策5件
  9. 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. [1:v]scale=150:-1[wm] … ロゴ(2番目の入力)を幅150pxにリサイズ → [wm] ラベルを付与
  2. [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 式
左上1010
右上main_w-overlay_w-1010
左下10main_h-overlay_h-10
右下(推奨)main_w-overlay_w-20main_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:-1N番目の入力を幅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. はい。enablecolorchannelmixer=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

関連記事


動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-filters.html / trac.ffmpeg.org