FFmpegの overlay フィルタを使うと、動画にロゴやウォーターマーク(透かし)を重ねられます。背景が透明なPNGのロゴも、そのまま重ねられます。位置や表示する時間、透明度も指定できます。
コマンド例
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=...… メイン動画に、サイズを変えたロゴ[wm]を重ねる
透明な部分の情報(アルファチャンネル)を持つPNGは、FFmpegが自動で透明のまま重ねます。特別な設定はいりません。
4. 不透明度を下げた半透明ウォーターマーク
colorchannelmixer フィルタで、ロゴのアルファ(不透明度)を変えます。0.5なら50%の不透明度です。アルファを持たないPNGやJPEGでは aa が効かないので、先に format=rgba でアルファを付けます。
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "[1:v]scale=150:-1,format=rgba,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, 開始秒, 終了秒)…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つのロゴを同時に重ねます。1つ目のロゴを重ねた映像に [tmp] という名前を付け、そこへ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: Simple filtergraph ... was expected to have exactly 1 input and 1 output
原因: -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のアルファチャンネルが完全に透明になっているか、ロゴが小さすぎます。
解決策: 次のコマンドで、ロゴの幅・高さとピクセル形式(pix_fmt)を確かめます。
# ロゴのサイズとアルファを確認
ffprobe -v quiet -show_streams logo.png | grep -E "width|height|pix_fmt"
エラー3: Error binding filtergraph inputs/outputs
原因: -filter_complex の書き方が間違っています(ラベル名が合っていないなど)。その前の行の Filter 'scale:default' has output 0 (wm) unconnected は、[wm] がどこにもつながっていないという意味です。
解決策: [wm] などのラベルが、名前を付けたところと使うところで同じになっているか確かめます。
エラー4: ロゴのアスペクト比が崩れる
原因: scale=W:H で幅と高さを両方指定しています。
解決策: scale=150:-1 のように高さを -1 にすると、縦横比(アスペクト比)を保ったままサイズを変えられます。
エラー5: 動画が再エンコードされてファイルサイズが増える
原因: overlayフィルタを使うと、映像は必ず再エンコードされます。
軽減策: CRFの値を大きくすると、ファイルは小さくなります。そのぶん画質は下がります(libx264の既定値は23)。
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=main_w-overlay_w-20:main_h-overlay_h-20" \
-c:v libx264 -crf 26 -preset fast -c:a copy output.mp4
FAQ
Q1. JPEGのロゴは使えますか?
A. 使えます。ただしJPEGは、透明な部分(アルファチャンネル)を持てません。透明なロゴにしたいときは、PNG(またはWebP)を使ってください。四角い不透明なロゴなら、JPEGでも問題ありません。
Q2. overlay フィルタを使うと必ず再エンコードされますか?
A. はい。overlayはフレーム(映像の1コマ)に画像を重ねるので、映像は必ず再エンコードされます。音声は -c:a copy で、劣化させずにそのままコピーできます。
Q3. 動画の解像度が変わっても右下に固定できますか?
A. はい。main_w-overlay_w-20:main_h-overlay_h-20 のように変数を使った式なら、どの解像度でも右下に置かれます。
Q4. ロゴの透明度を時間によって変化させられますか?
A. はい。ただし colorchannelmixer=aa= には時間の式を書けないので、enable と組み合わせても、透明度は少しずつは変わりません。徐々に変えるには、ロゴを -loop 1 -i logo.png で読み込み、[1:v]fade=t=in:st=0:d=2:alpha=1[wm];[0:v][wm]overlay=10:10:shortest=1 のように fade でアルファを変えます。表示と非表示を切り替えるだけなら、enable='between(t,0,5)' が簡単です。
Q5. 複数の動画に、同じロゴをまとめて入れるには?
A. macOSやLinuxのターミナルでは、次のループで処理できます。できたファイルは、名前の先頭に watermarked_ が付きます。
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