ffmpeg -filtersCの列で使える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);

ffmpeg で使える評価式

指定秒間で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]の指定

exprenter、または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:映像の縦幅

コメントを残す

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

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