fade フィルタ — フェードイン・フェードアウト
フェードイン(冒頭を黒から徐々に表示)
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2" output.mp4
| パラメータ | 値 | 説明 |
|---|---|---|
t |
in / out |
フェードの方向 |
st |
秒 | フェード開始時刻 |
d |
秒 | フェードの継続時間 |
フェードアウト(映像の末尾を黒にフェード)
ffmpeg -i input.mp4 -vf "fade=t=out:st=8:d=2" output.mp4
st=8 は、8秒の時点から2秒かけてフェードアウトする指定です。st は動画の長さに合わせて変えてください。
フェードイン+フェードアウトを一度に適用
ffmpeg -i input.mp4 \
-vf "fade=t=in:st=0:d=1.5, fade=t=out:st=8.5:d=1.5" \
output.mp4
黒以外の色にフェードする
ffmpeg -i input.mp4 \
-vf "fade=t=in:st=0:d=2:color=white" \
output.mp4
color=white を付けると、白からのフェード(ホワイトイン)になります。フェードの代わりに画面を一瞬ぼかして切り替えたいときは、boxblur フィルタを組み合わせる方法もあります。
xfade フィルタ — 2映像間のクロスフェード
基本的なクロスフェード
ffmpeg -i input1.mp4 -i input2.mp4 \
-filter_complex "[0][1]xfade=transition=fade:duration=1:offset=4" \
output.mp4
| パラメータ | 説明 |
|---|---|
transition |
トランジション効果名(後述) |
duration |
トランジションの継続時間(秒) |
offset |
1本目のどの時点でトランジションを開始するか(秒) |
offset=4 は、1本目の4秒の時点からトランジション(映像の切り替え効果)が始まるという意味です。背景を差し替えた素材をつなぎたいときは、先にchromakey フィルタでグリーンバック合成をして素材を作っておきます。
主な組み込みトランジション効果
| 効果名 | 説明 |
|---|---|
fade |
クロスフェード(デフォルト) |
wipeleft |
左方向にワイプ |
wiperight |
右方向にワイプ |
wipeup |
上方向にワイプ |
wipedown |
下方向にワイプ |
slideleft |
左スライド |
slideright |
右スライド |
slideup |
上スライド |
slidedown |
下スライド |
circlecrop |
円形クロップ |
rectcrop |
矩形クロップ |
distance |
距離ベース |
fadeblack |
黒経由のフェード |
fadewhite |
白経由のフェード |
radial |
放射状ワイプ |
smoothleft |
境目をぼかした左方向のワイプ |
smoothright |
境目をぼかした右方向のワイプ |
smoothup |
境目をぼかした上方向のワイプ |
smoothdown |
境目をぼかした下方向のワイプ |
pixelize |
ピクセレート |
diagtl |
斜め(右下→左上) |
diagtr |
斜め(左下→右上) |
diagbl |
斜め(右上→左下) |
diagbr |
斜め(左上→右下) |
hlslice |
水平スライスワイプ |
hrslice |
水平逆スライスワイプ |
vuslice |
垂直上スライスワイプ |
vdslice |
垂直下スライスワイプ |
dissolve |
ディゾルブ |
hblur |
水平ブラートランジション |
fadegrays |
グレースケールフェード |
squeezeh |
水平スクイーズ |
squeezev |
垂直スクイーズ |
FFmpeg 8.1 には、式で自作する custom を除いて58種類あり、表にない circleopen・wipetl・zoomin・coverleft・revealleft なども使えます。使える名前は ffmpeg -h filter=xfade で確認できます。全部の名前は xfade フィルタの記事 にあります。
# ワイプ左の例
ffmpeg -i input1.mp4 -i input2.mp4 \
-filter_complex "[0][1]xfade=transition=wipeleft:duration=1:offset=4" \
output.mp4
2映像の長さが異なる場合の注意
offset は1本目の映像の中の秒数です。offset + duration が1本目の長さを超えないようにしてください。
# 1本目が6秒の場合: offset=5, duration=1 はOK
ffmpeg -i clip1.mp4 -i clip2.mp4 \
-filter_complex "[0][1]xfade=transition=fade:duration=1:offset=5" \
output.mp4
3本の映像を2つのトランジションでつなぐ
ffmpeg -i clip1.mp4 -i clip2.mp4 -i clip3.mp4 \
-filter_complex \
"[0][1]xfade=transition=fade:duration=1:offset=4[v01]; \
[v01][2]xfade=transition=wipeleft:duration=1:offset=8" \
output.mp4
clip1とclip2の間にフェード- その結果と
clip3の間にワイプ
音声を含む場合の処理
xfade は映像だけを扱うフィルタです。音声も同じように切り替えるには acrossfade フィルタを使います。acrossfade には offset がなく、いつも1本目の最後の d 秒と2本目の最初を重ねます。そのため、映像と音声が同じ位置で切り替わるのは、offset が「1本目の長さ − duration」のときだけです。次の例は1本目が5秒の場合で、1本目が10秒だと、映像は4秒、音声は9秒の位置から切り替わります。
ffmpeg -i clip1.mp4 -i clip2.mp4 \
-filter_complex \
"[0:v][1:v]xfade=transition=fade:duration=1:offset=4[v]; \
[0:a][1:a]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" \
output.mp4
静止画のスライドショーにクロスフェードを追加する
ffmpeg -loop 1 -t 3 -i img1.jpg \
-loop 1 -t 3 -i img2.jpg \
-filter_complex "[0][1]xfade=transition=fade:duration=1:offset=2" \
output.mp4
注意点
xfadeは FFmpeg 4.3 以降で使えます。それより古いバージョンでは、overlayとfadeを組み合わせる必要がありました。offsetは1本目の映像の長さより小さくします。acrossfadeのdをxfadeのdurationとそろえ、offsetを「1本目の長さ −duration」にすると、映像と音声が同じ位置で切り替わります。
つまずきやすいポイント
-
症状: 2本目が出てこない、または切り替えの途中で急に2本目に変わる(エラーは出ない)。 原因:
offset + durationが1本目の映像の長さを超えています。offsetが1本目の長さ以上だと、出力は1本目とほぼ同じ長さで終わります。対処:offsetは「1本目の長さ −duration」以下にします。1本目が6秒なら、offset=5:duration=1までにします。 -
症状: クロスフェードはできたが、音声が消える、または途切れる。 原因:
xfadeは映像専用なので、音声は別に処理する必要があります。対処:acrossfadeを一緒に使い、-map "[v]" -map "[a]"で映像と音声の両方を指定します。acrossfadeのdはxfadeのdurationとそろえ、offsetは「1本目の長さ −duration」にします。 -
症状: フェードアウトの開始位置がずれる。 原因:
fade=t=outのstは「フェードの開始時刻」で、「終了時刻」ではありません。対処: 10秒の映像の最後の2秒でフェードアウトするならst=8:d=2です(8+2=10)。 -
症状: 2本のクリップで解像度やfpsが違い、
First input link main parameters (size 640x360) do not match the corresponding second input link xfade parameters (size 1280x720)のようなエラーで止まる。 原因:xfadeは、2つの入力が同じサイズ・同じfpsであることを前提にしています。fpsが違うときは、timebaseやframe rateがdo not matchというエラーになります。対処: 先にscaleとfpsでそろえてからxfadeに渡します。
よくある質問
Q. fade と xfade はどう違いますか。
A. fade は1本の映像を、黒(または指定した色)との間でフェードイン・フェードアウトさせます。xfade は2本の映像を重ねて切り替えるフィルタで、-filter_complex と2つの入力が必要です。
Q. 黒や白以外の色にフェードできますか。
A. fade なら color= で好きな色を指定できます(例: color=red、color=0x3366FF)。xfade で色を経由して切り替えるトランジションは fadeblack(黒)と fadewhite(白)だけなので、それ以外の色はトランジション名では選べません。
Q. 3本以上をつなげられますか。
A. はい。xfade の出力にラベルを付け、それを次の xfade の入力にします。上の3本をつなぐ例のように、; で区切って続けます。
Q. 静止画のスライドショーにも使えますか。
A. 使えます。-loop 1 -t 3 -i img1.jpg のように各画像を繰り返し入力にして、xfade でつなぎます。offset は画像の表示秒数に合わせます。
Q. トランジション効果はどれくらいありますか。
A. FFmpeg 8.1 では、custom を除いて58種類あります。fade のほかに wipeleft・slideup・circlecrop・dissolve などがあり、名前を transition= に指定して切り替えます。
関連フィルタ
afade— 音声のフェードイン・アウトacrossfade— 音声のクロスフェードoverlay— 映像の重ね合わせconcat— 映像の結合