フィルターノート

FFmpeg Filters Documentation から興味のある部分を読んでノートをつづる。

フィルター概念

FFmpeg のフィルターは libavfilter ライブラリーで実装されている。このライブラリーではフィルター一つが入力と出力を複数持つことができる。説明のために次のようなフィルターグラフを考える:

ffmpeg -i INPUT -vf "
  split[main][tmp];
  [tmp]crop=iw:ih/2:0:0,vflip[flip];
  [main][flip]overlay=0:H/2" \
  OUTPUT

本文でアスキーアートで説明されているものを改めて模式化する:

flowchart LR INPUT --> split --"[main]"--> overlay --> OUTPUT split --"[tmp]"--> crop --> vflip --"[flip]"--> overlay
  • 角括弧パターンはラベルを指定(ストリーム選択子の一形態)

  • split, crop, vflip, overlay はいずれも映像フィルター

    • フィルター split はおそらくラベル複数を「出力」とする

    • フィルター overlay はおそらくラベル複数を「入力」とする * 引数 0:H/2 を取るらしい

    • フィルター crop は映像の切り取りだろう * 引数 iw:ih/2:0:0 を取るらしい

    • フィルター vflip は垂直方向にひっくり返すのだろう * 引数はないらしい

引数の説明が下の方にある。

  • crop=iw:ih/2:0:0=出力幅:出力高:出力位置x:出力位置y の意。iw, ih はそれぞれ入力幅と入力高。座標系原点は左上だろうから(画像なので)、映像の上半分を切り抜く(残るほう)。

  • overlay=0:H/2 は主映像に重ね合わせる映像の座標を設定する。貼り付ける位置は画面の下半分ということになる。

読者ノート

iw, ih, etc. の意味はフィルター個別の仕様に記載されてもいるが、意味はどのフィルターでも共通することが多い。

タイムライン編集

フィルターによってはオプション enable がある。特定の時間区間だけフィルターを ON にしたい場合に有用だ。簡単に述べると値が 0 でない場合フィルター自身が有効になる。そうでない場合、フレームはフィルターグラフ内の次のフィルターにそのまま送られる。

オプション enable を対応しているフィルターは次のコマンドで確認可能:

bash$ ffmpeg -filters | grep -- '^ T'

例:映像フィルター smartblur で、その効果を 10 秒から 3*60 秒までに限って適用したい:

smartblur=enable='between(t,10,3*60)'

評価式の構文は FFmpeg Utilities Documentation の Expression Evaluation を参照すること。

複数の入力を持つフィルターのオプション (framesync)

複数の入力を持つフィルターの中には、共通のオプション集合を備えているものがある。フィルター仕様に «supports the framesync option» のような記載のあるものだ。特に重要なオプションをここに記す。

shortest

値を 1 に設定すると、入力ストリームにうち最短のものが終了したときに出力全体としても終了とする。

例えば再生時間の異なる映像と音声を合成したり、映像フィルター hstack などでビデオを複数並べたりするときに有用となり得る。