Libavfilter
FFmpeg
には複雑な処理をおこなえるフィルターがたくさん備わっているのだが、使い方がちょっとむずかしい。
公式ドキュメントをみてもさっぱり感はある。
そこでまずは、同梱されているユーティリティーツールを使ってみることにする
前提
ffmpeg
をインストール済み(してない人はこちらへ)
graph2dotのビルドとインストール
$ cd ffmpeg
$ make alltools
# cp tools/graph2dot /usr/local/bin
$ graph2dot -h
Convert a libavfilter graph to a dot file.
Usage: graph2dot [OPTIONS]
Options:
-i INFILE set INFILE as input file, stdin if omitted
-o OUTFILE set OUTFILE as output file, stdout if omitted
-h print this help
$ echo nullsrc,scale=640:360,nullsink | graph2dot -o graph.tmp
[Parsed_nullsrc_0 @ 0x30d78e0] size:320x240 rate:25/1 duration:-1.000000 sar:1/1
[Parsed_scale_1 @ 0x30d7ca0] Setting 'w' to value '640'
[Parsed_scale_1 @ 0x30d7ca0] Setting 'h' to value '360'
[Parsed_scale_1 @ 0x30d7ca0] w:640 h:360 flags:'bilinear' interl:0
query_formats: 3 queried, 2 merged, 0 already done, 0 delayed
[Parsed_scale_1 @ 0x30d7ca0] w:320 h:240 fmt:yuv420p sar:1/1 -> w:640 h:360 fmt:yuv420p sar:3/4 flags:0x2
$ cat graph.tmp
digraph G {
node [shape=box]
rankdir=LR
"Parsed_nullsrc_0\n(nullsrc)" -> "Parsed_scale_1\n(scale)" [ label= "inpad:default -> outpad:default\nfmt:yuv420p w:320 h:240 tb:1/25" ];
"Parsed_scale_1\n(scale)" -> "Parsed_nullsink_2\n(nullsink)" [ label= "inpad:default -> outpad:default\nfmt:yuv420p w:640 h:360 tb:1/25" ];
}
graphvizのインストール
graph2dot
というツールは、グラフコンテキストからグラフスクリプト(?)を生成してくれるツールで
それだけではただのテキストですので、dot
というツールで画像化します。
dot
はgraphviz
というパッケージで管理されています。
yum
管理されているので、簡単にインストール。
# yum install graphviz
$ rpm -qs graphviz | grep dot
normal /usr/bin/dot
normal /usr/bin/dot2gxl
normal /usr/bin/dotty
normal /usr/bin/gxl2dot
normal /usr/bin/vimdot
normal /usr/lib64/graphviz/libgvplugin_dot_layout.so.6
normal /usr/lib64/graphviz/libgvplugin_dot_layout.so.6.0.0
normal /usr/lib64/libxdot.so.4
normal /usr/lib64/libxdot.so.4.0.0
normal /usr/share/graphviz/lefty/dotty.lefty
normal /usr/share/graphviz/lefty/dotty_draw.lefty
normal /usr/share/graphviz/lefty/dotty_edit.lefty
normal /usr/share/graphviz/lefty/dotty_layout.lefty
normal /usr/share/graphviz/lefty/dotty_ui.lefty
normal /usr/share/man/man1/dot.1.gz
normal /usr/share/man/man1/dotty.1.gz
normal /usr/share/man/man1/vimdot.1.gz
dot
で画像化
$ dot -Tpng graph.tmp -o graph.png
すこし複雑にする
$ echo "nullsrc,split[main][tmp];[tmp]crop=iw:ih/2:0:0,vflip[flip];[main][flip]overlay=0:H/2,nullsink" | graph2dot -o graph2.tmp
$ dot -Tpng graph2.tmp -o graph2.png
小さい。。
dot
以外に、レイアウトを変更するコマンドやオプションがたくさんありますので、マニュアルを御覧ください。
おわりに
無事に自分の記述しているフィルターグラフが正しいかどうかを可視化することができました。
エンジョイ Libavfilter !!