ffmpeg -filters
のCの列で使えるsendcmd、asendcmd
フィルタの使い方。exprに対応してないフィルタでも設定を時間で変えられる。
ffmpeg -filters using Gyan ffmpeg
基本コマンド
コマンドに直接記入する方法とテキストファイルを読み込む方法の2通りがある。
コマンドに直接記入する方法で、開始秒の指定から最後まで実行するならこの方法が手軽。2重引用符でコマンドを囲むこと。開始2秒からhue
フィルタを当てる。タイムライン編集でも同様のことができる。
ffplay -f lavfi -i testsrc2 -vf "sendcmd=c=2 hue h 30,hue"
ffplay -f lavfi -i testsrc2 -vf "hue=h=30:enable=gte(t\,2)"
色相を動的に変更できる hue
特定の時間だけフィルタを当てるタイムライン編集について
同じ効果をテキストファイルを読み込む方法。既定値が[enter]なので省略できる。
ffplay -f lavfi -i testsrc2 -vf "sendcmd=f=filter.txt,hue"
# filter.txt 2 [enter] hue h 30;
設定は通常のkey=value形式ではなく半角スペースを開けて指定する。同じ時間なら複数設定ごとにカンマでつなぎ、終わりにはセミコロンでフィルタを閉じる。
2 hue h 30, hue s 5;
設定は1つずつカンマを区切って1行にまとめられる。
2 hue h 30, hue s 5;
フィルタの効果を指定秒以降で無効にするにはフィルタで変更した部分に無効の状態を指定する。[leave]で2秒以降の処理を指定している。
1-2 hue h 30, hue s 5, [leave] hue h 0, hue s 1;
再度時間を指定して同様にフィルタを当てる。
1-2 hue h 30, hue s 5, [leave] hue h 0, hue s 1; 4-5 hue h 180, hue s 5, [leave] hue h 0, hue s 1;
フィルタの設定を動的に変更するにはexprを追加して評価式を使えるようにする。0から359フレームをループしてhを変更する。
0 [enter+expr] hue h mod(N\,360);
指定秒間でhを一周するならTIを指定する。
2-5 [enter+expr] hue h TI*359;
線形補間以外の処理にするならafade
フィルタの実装がわかりやすい。
AfadeCurves – FFmpeg
フェードトランジションのカーブを別フィルタに実装する
drawtext
フィルタは例外で通常のkey=value形式で指定する。共通のフィルタ設定をffmpegのコマンドに記述して、時間別の設定をテキストファイル内に記述する。reinitで以前のフィルタの効果を初期化している。
ffplay -f lavfi -i testsrc2 -vf "sendcmd=f=filter.txt,drawtext=fontfile=C\\://WINDOWS/Fonts/msgothic.ttc:text='':fontsize=64"
0-4 [enter] drawtext reinit text=foobar, [leave] drawtext reinit text='';
FFmpeg Filters Documentation : drawtext Commands
時間で設定を変える例。
1 [enter] drawtext reinit text=foobar1; 2 [enter] drawtext reinit text=foobar2:fontsize=48; 4-5 [enter] drawtext reinit text=foobar3:fontsize=64, [leave] drawtext reinit text='';
コマンド対応していれば複数のフィルタも併用できる。
ffplay -f lavfi -i testsrc2 -vf "sendcmd=f=filter.txt,drawtext=fontfile=C\\://WINDOWS/Fonts/msgothic.ttc:text='':fontsize=64,hue"
1 [enter] drawtext reinit text=foobar1, hue h 30; 2 [enter] drawtext reinit text=foobar2:fontsize=48, hue h 130; 4-5 [enter] drawtext reinit text=foobar3:fontsize=64, [leave] drawtext reinit text=''; 5 [enter] hue h 0;
@fooで一時的なフィルタ名をつけて同時に複数のフィルタをsendcmd
フィルタで変えられる。
ffplay -f lavfi -i testsrc2 -vf split=3[1v][2v],sendcmd=f=textfile.txt,nullsink;[1v]hue@1[1v];[2v]hue@2[2v];[1v][2v]vstack
1 hue@1 h 30; 2 hue@2 h 60;
video – Sendcmd in ffmpeg – Stack Overflow
公式ドキュメント:FFmpeg Filters Documentation
オプション
- commands, c[string]
フィルタに送るコマンドの指定 - filename, f[string]
フィルタに送るコマンドをテキストファイルから読み込むためのファイルの指定
[FLAGS]の指定
exprはenter、またはleaveと併用する。併用するときは+, |でつなげる。
- enter
コマンドは現在のフレームのタイムスタンプが指定された間隔に入ると送信される。つまり、前のフレームのタイムスタンプが指定された間隔内になく、現在のフレームのタイムスタンプが指定された間隔内にある場合にコマンドが送信される。無指定はenterのみを指定する - leave
コマンドは現在のフレームのタイムスタンプが指定された間隔を離れると送信される。つまり、前のフレームのタイムスタンプが指定された間隔内にあり、現在のフレームのタイムスタンプが指定された間隔内にない場合にコマンドが送信される - expr
コマンド ARGは式として解釈され、式の結果がARGとして渡される
コマンドの記述方法
先頭に#をつけると以降はコメント扱いになる。
STARTの開始秒は必須でENDの終了秒は省略可能。省略すると最後までになる。
START[-END] COMMANDS;
TARGETはフィルタ名か、一時的に名前を付けたフィルタ名。
[FLAGS] TARGET COMMAND ARG
コマンドの仕様構文
COMMAND_FLAG ::= "enter" | "leave" COMMAND_FLAGS ::= COMMAND_FLAG [(+|"|")COMMAND_FLAG] COMMAND ::= ["[" COMMAND_FLAGS "]"] TARGET COMMAND [ARG] COMMANDS ::= COMMAND [,COMMANDS] INTERVAL ::= START[-END] COMMANDS INTERVALS ::= INTERVAL[;INTERVALS]
exprの設定
- PTS:PTS時間。タイムベースで割るとTになる
- N:0から始まるフレーム数
- T:秒時間
- TS:コマンド区間で指定した開始時間
- TE:コマンド区間で指定した終了時間
- TI:開始時間から終了時間を0から1に線形補間する
- W:映像の横幅
- H:映像の縦幅