Askthewind’s diary

個人的なメモ

FFmpegで動画におしゃれなカーテンエフェクトをつける

 Add fashionable curtain(barn door) and circle wipe effects

 

Curtains, unveiled Horizontal

f:id:Askthewind:20181213095501g:plain

真ん中から左右へフェードアウトするカーテンエフェクト

FFmpegでプレビュー

ffmpeg  -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(2*abs(X-W/2)/W,(T-2)/3),A,B)':enable='between(t,0,6)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input.mp4 -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(2*abs(X-W/2)/W,(T-2)/3),A,B)':enable='between(t,0,6)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

真ん中から左右へワイプするblendコマンド。

blend=all_expr='if(lte(2*abs(X-W/2)/W,(T-2)/3),A,B)'

[0]format=yuv444p,split=2[a][b];でフォーマット形式をyuv444pに変換して入力された動画を2つの出力に分割して[a]と[b]という任意の名前をつけています。

[b]drawbox=t=fill[b];で入力動画と同じ解像度のワイプエフェクトさせる黒のboxを生成しています。drawboxを使用するときは、フォーマット形式をyuv444pに変換すると色の領域の幅が改善されます。

[a][b]blend=all_expr='if(lte(2*abs(X-W/2)/W,(T-2)/3),A,B)'で[a]と[b]をブレンドしてblend=all_exprコマンドで使えるStatement formula(計算式)コマンドを指定してワイプエフェクトの設定しています。

:enable='between(t,0,6)',format=yuv420pで[a]と[b]のブレンド時間を指定して負荷を下げて他のデバイスでも見れるようにformat=yuv420pで出力を最適化しています。

 

Wipe, unveiled vertically

f:id:Askthewind:20181213095611g:plain

真ん中から上下へフェードアウトするワイプエフェクト

FFmpegでプレビュー
ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(2*abs(Y-H/2)/H,(T-2)/3),A,B)':enable='between(t,0,6)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input.mp4 -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(2*abs(Y-H/2)/H,(T-2)/3),A,B)':enable='between(t,0,6)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

真ん中から上下へワイプするblendコマンド。

blend=all_expr='if(lte(2*abs(Y-H/2)/H,(T-2)/3),A,B)'

 

Circle Wipe, expanding

f:id:Askthewind:20181213100330g:plain

真ん中から円状にフェードアウトするワイプエフェクト

FFmpegでプレビュー
ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(sqrt(pow(X-W/2,2)+pow(Y-H/2,2))/sqrt(pow(W,2)+pow(H,2)),(T-2)/3)/2,A,B)':enable='between(t,0,5)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(sqrt(pow(X-W/2,2)+pow(Y-H/2,2))/sqrt(pow(W,2)+pow(H,2)),(T-2)/3)/2,A,B)':enable='between(t,0,5)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

真ん中から円状にワイプするblendコマンド。

blend=all_expr='if(lte(sqrt(pow(X-W/2,2)+pow(Y-H/2,2))/sqrt(pow(W,2)+pow(H,2)),(T-2)/3)/2,A,B)'
 
Diamond Wipe, expanding

f:id:Askthewind:20181213202922g:plain

真ん中からダイヤ状にフェードアウトするワイプエフェクト

FFmpegでプレビュー
ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(abs(X-W/2)/W+(abs(Y-H/2)/H),(T-2)/3),A,B)':enable='between(t,0,6)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(abs(X-W/2)/W+(abs(Y-H/2)/H),(T-2)/3),A,B)':enable='between(t,0,6)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

真ん中からダイヤ状にワイプするblendコマンド。

blend=all_expr='if(lte(abs(X-W/2)/W+(abs(Y-H/2)/H),(T-2)/3),A,B)'
 

Curtains, Right to left

f:id:Askthewind:20181215073101g:plain

右から左へフェードアウトするカーテンエフェクト

ffmpegでプレビュー

ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(gte(X,W*(1-T/2)),A,B)':enable='between(t,0,4)',format=yuv420p" -f matroska - | ffplay -i -

ffmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(gte(X,W*(1-T/2)),A,B)':enable='between(t,0,4)',format=yuv420p" "output.mp4"

 

右から左へワイプするblendコマンド。

blend=all_expr='if(gte(X,W*(1-T/2)),A,B)'

 

Wipe, bottm to top

f:id:Askthewind:20181215074928g:plain

下からから上へフェードアウトするワイプエフェクト

ffmpegでプレビュー

ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(gte(Y,H*(1-T/2)),A, B)':enable='between(t,0,4)',format=yuv420p" -f matroska - | ffplay -i -

ffmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbo x=t=fill[b];[a][b]blend=all_expr='if(gte(Y,H*(1-T/2)),A,B)':enable='between (t,0,4)',format=yuv420p" "output.mp4"

 

下からから上へワイプするblendコマンド。

blend=all_expr='if(gte(Y,H*(1-T/2)),A, B)'
 
Curtains, Left to right

f:id:Askthewind:20181216194157g:plain

左から右へフェードアウトするカーテンエフェクト

FFmpegでプレビュー

ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(X,W*(T/2)),A,B)':enable='between(t,0,4)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(X,W*(T/2)),A,B)':enable='between(t,0,4)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

左から右へワイプするblendコマンド。

blend=all_expr='if(lte(X,W*(T/2)),A,B)'
 
Wipe, top to bottm

f:id:Askthewind:20181216194517g:plain

上から下へフェードアウトするワイプエフェクト

FFmpegでプレビュー

ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(Y,H*(T/2)),A, B)':enable='between(t,0,4)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(Y,H*(T/2)),A, B)':enable='between(t,0,4)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

上から下へワイプするblendコマンド。

blend=all_expr='if(lte(Y,H*(T/2)),A, B)'
 
Diagonal wipe,lower right to upper left

f:id:Askthewind:20181215075852g:plain

右下からから左上へフェードアウトするワイプエフェクト

ffmpegでプレビュー

ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(gte(X+Y,(W+H)*(1-T/2)),A,B)':enable='between(t,0,4)',format=yuv420p" -f matroska - | ffplay -i -

ffmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(gte(X+Y,(W+H)*(1-T/2)),A,B)':enable='between(t,0,4)',format=yuv420p" "output.mp4"

 

右下からから左上へワイプするblendコマンド。

blend=all_expr='if(gte(X+Y,(W+H)*(1-T/2)),A,B)'
 
Diagonal wipe,upper right to lower left
 

f:id:Askthewind:20181215080917g:plain

右上からから左下へフェードアウトするワイプエフェクト

ffmpegでプレビュー

ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(gte(X-Y,(W+H)*(1-T/2)),A,B)':enable='between(t,0,4)',format=yuv420p" -f matroska - | ffplay -i -

ffmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(gte(X-Y,(W+H)*(1-T/2)),A,B)':enable='between(t,0,4)',format=yuv420p" "output.mp4"

 

右上からから左下へワイプするblendコマンド。

blend=all_expr='if(gte(X-Y,(W+H)*(1-T/2)),A,B)'
 
Diagonal wipe,upper left to lower right

f:id:Askthewind:20181216194731g:plain

左上から右下へフェードアウトするワイプエフェクト

FFmpegでプレビュー

ffmpeg -f lavfi -i "testsrc2=s='480*360'" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(X+Y,(W+H)*(T/2)),A,B)':enable='between(t,0,4)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "[0]format=yuv444p,split=2[a][b];[b]drawbox=t=fill[b];[a][b]blend=all_expr='if(lte(X+Y,(W+H)*(T/2)),A,B)':enable='between(t,0,4)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

左上から右下へワイプするblendコマンド。

blend=all_expr='if(lte(X+Y,(W+H)*(T/2)),A,B)'

 

 

参考にさせていただきました。Special Thanks 

superuser.com

Also see

www.ffmpeg.org