フェードするファイルにアルファチャンネルあるなしで用途が異なるfadeフィルタの使い方。アルファチャンネルがない場合のフェードインは指定色から入力した映像にフェードし、フェードアウトは入力した映像から指定色にフェードする。アルファチャンネルがあればクロスフェードのように2つの映像をきれいにつなげることができる。

ffmpeg 4.3から手軽にトランジションできるフィルタが追加された。
映像のトランジションの設定ができる xfade

そのほかにアルファチャンネルの濃度の変化をマスクとして利用し、別のフィルタのタイムラインによる強度変化にも使える。出力フォーマットは RGB。

具体的な利用例
時間でフィルタに強弱をつける
ドラクエの戦闘シーンチェンジエフェクトを作る

基本コマンド

元映像(testsrc)から始まり開始1秒から2秒間で白にフェードインする。
ffplay -f lavfi -i testsrc,fade=t=out:st=1:d=2:c=white

赤から始まり開始1秒から元映像(testsrc)に2秒間でフェードアウトする。
ffplay -f lavfi -i testsrc,fade=t=in:st=1:d=2:c=0xff0000

reverseフィルタを使って開始時間の指定なく最初と最後にフェード効果を当てることができる。しかしすべての映像をデコードするので短時間の映像向き。

最初に0.5秒フェードイン、最後に0.5秒フェードアウト。
ffmpeg -i input -vf fade=d=0.5,reverse,fade=d=0.5,reverse -c:a copy output

映像と音声を逆再生にエンコードする

公式ドキュメント:FFmpeg Filters Documentation : fade

オプション

フェードインはフェードイン開始まではcolorで指定した色を継続する。
フェードアウトはフェードアウトが終了したらcolorで指定した色を継続する。

  • type, t[int] フェードタイプの指定
    • 0, in
      フェードイン。既定値
    • 1, out
      フェードアウト
  • start_frame, s[int]
    フェード効果が適用される 0 から始まる最初のフレーム番号
    既定値:0
    範囲:0 から INT_MAX まで
  • nb_frames, n[int]
    フェード効果が適用されるフレーム数
    既定値:25
    範囲:0 から INT_MAX まで
  • alpha[boolean]
    有効にすることで、入力した映像にアルファチャンネルがあればアルファチャンネルだけのフェードを行う。なければcolorで指定した色でフェードする
    既定値:0
    範囲:0(無効) と 1(有効)
  • start_time, st[duration]
    フェード効果が適用される最初のタイムスタンプ秒。start_frame, sを併用した場合start_time, stよりも時間が短ければ合算される。併用しない方が無難
    既定値:0
  • duration, d[duration]
    フェード効果が適用されるタイムスタンプ秒。nb_frames, nを併用した場合はduration, dを優先する。併用しない方が無難
    既定値:0
  • color, c[color]
    フェードの色指定。16進数のrrggbb形式か、色名を指定
    既定値:”black”

応用例

クロスフェード

開始4秒から1秒間で1入力の映像から2入力の映像にクロスフェードする。それぞれの映像の解像度とフレームレートを揃える。出力フォーマットは SDL で再生するためにformat=rgb24で変換している。
ffmpeg -i input -f lavfi -i testsrc=s=640x360:r=30000/1001 -filter_complex [0:v]format=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[0a];[1:v]format=yuva420p,fade=t=in:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[1a];color=s=640x360:r=30000/1001[2a];[2a][0a]overlay[02];[02][1a]overlay,format=rgb24,realtime -f sdl -

開始4秒から1秒間で1入力目から2入力目へクロスフェードする。音声は無効。
ffmpeg -i input1 -i input2 f lavfi -i color=s=1280x720:r=30 -filter_complex [0:v]format=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[0v];[1:v]format=yuva420p,fade=t=in:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[1v];[2:v][0v]overlay[02];[02][1v]overlay -an output

さらに音声も同じ時間にクロスフェードするなら、
ffmpeg -i input1 -i input2 f lavfi -i color=s=1280x720:r=30 -filter_complex [0:v]format=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[0v];[1:v]format=yuva420p,fade=t=in:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[1v];[2:v][0v]overlay[02];[02][1v]overlay;[0:a]afade=t=out:st=4:d=1[0a];[1:a]afade=t=in:st=4:d=1[1a];[0a][1a]amix output

フィルタ強弱のクロスフェード

3秒から1秒間の強くなって弱くなるgblurフィルタを当てる。
ffmpeg -i input -filter_complex split[0],gblur=4:enable='between(t,3,4)',format=yuva420p,fade=t=in:st=3:d=0.5:alpha=1,fade=t=out:st=3.5:d=0.5:alpha=1,[0]overlay -acodec copy output

4秒から1秒間のクロスフェードとgblurフィルタを当てる。
ffmpeg -i input1 -i input2 -filter_complex format=yuva420p,fade=t=out:st=4:d=1:alpha=1[0];[1:v]format=yuva420p,fade=t=in:st=4:d=1:alpha=1,[0]overlay,split[01],gblur=16:2:enable='between(t,3.3,6)',format=yuva420p,fade=t=in:st=3.9:d=0.8:alpha=1,fade=t=out:st=4.7:d=0.7:alpha=1,[01]overlay -acodec copy output

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)