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
  1. clip1 と clip2 の間にフェード
  2. その結果と 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 — 映像の結合