特定のフィルタで出力されるメタデータを扱うことができるmetadata
フィルタの使い方。ametadata
フィルタも同じオプションで使うことができる。こちらはコンソールに出力するに対してdrawgraph
フィルタは映像にテキストやグラフで出力する。drawgraph
フィルタと比べて出力範囲を指定しなくても良いので使いやすい。functionを使うことでメタデータの内容を条件で使い分けることができる。
メタデータを映像化する drawgraph, adrawgraph
基本コマンド
signalstats
フィルタからYDIF
を表示している。
ffplay -i input -vf signalstats,metadata=print:key=lavfi.signalstats.YDIF:function=expr:expr='between(VALUE1\,0\,1)'
unsharp
フィルタのY差分をssim
で表示している。
ffplay -i input -vf split[a][b];[b]unsharp[B];[a][B]ssim,metadata=print:key=lavfi.ssim.Y
drawtext
フィルタで映像に書き込む。
ffplay -i input -vf split[a][b];[b]unsharp[B];[a][B]ssim,drawtext=fontfile=C\\://WINDOWS/Fonts/arial.ttf:text='"SSIM="%{metadata\:lavfi.ssim.all}'
ebur128
フィルタでM、S、Iを同時に表示するにはametadata
フィルタを3つ並べる。
ffplay -i input -af ebur128=metadata=1,ametadata=print:key=lavfi.r128.M,ametadata=print:key=lavfi.r128.S,ametadata=print:key=lavfi.r128.I
ffplay -f lavfi -i amovie=input,ebur128=metadata=1,ametadata=print:key=lavfi.r128.M,ametadata=print:key=lavfi.r128.S,ametadata=print:key=lavfi.r128.I[out0];amovie=input[out1]
黒が50%未満を出力せずに、その前のフレームをコピーして出力する。blackframe=0
で全フレームを対象に、metadata
フィルタで対象フレームを選ぶ。コピーした重複フレームではなく可変フレームで出力するには-vsync vfrにする。
ffmpeg -i input -vf blackframe=0,metadata=select:key=lavfi.blackframe.pblack:value=50:function=less -vsync cfr -c:a copy output
idet
フィルタのsingle.progressiveのログをテキストで出力する。
ffmpeg -i input -vf idet,metadata=print:key=lavfi.idet.single.progressive:file=single.progressive.txt -an -f null -
ffprobeでsiti
フィルタのlavfi.siti.si,lavfi.siti.tiをcsvで出力する。
ffprobe -v error -f lavfi -i movie=input.mp4,siti -show_entries packet=pts_time -show_entries packet_tags=lavfi.siti.si,lavfi.siti.ti -read_intervals "%1" -of csv > siti.csv
メタデータを標準出力する。
metadata=mode=print:file=-
metadata=mode=print:file='pipe\:4'
- ffmpeg で使える評価式
- ffmpeg でメタデータを加える
- 黒フレームを調べる blackframe
- 2つの映像の画質評価をする ssim
- ffmpeg でのフレームレート設定の違い
- YUV のデータを数値で表示する signalstats
- フレームがインターレースかどうかを調べる idet
- 適切な音量が調べられる ffmpeg の ebur128 の使い方
公式ドキュメント:FFmpeg Filters Documentation : metadata, ametadata
公式wiki:FilteringGuide – FFmpeg : Filter Metadata
オプション
- mode[int]
出力モードの指定
printだけ指定するとその条件のメタデータを表示する。functionの条件で間に合わない場合にprint以外のモードを組み合わせて最終的にprintで VALUE1 を使いメタデータを表示する。サンプルコマンドを示した方がわかりやすいので後述。 - 0, select
key,valueを選択する(and 条件をつける)
メタデータは表示しない - 1, add
key,valueを追加する(or 条件をつける)
同じメタデータがあれば何もしない、つまり別のメタデータを追加する
メタデータは表示しない - 2, modify
key,valueの既存の値を変更する
メタデータは表示しない - 3, delete
valueの値があれば削除する、なければkeyの値を削除する
メタデータは表示しない - 4, print
メタデータを表示する。
–で標準出力する - key[string]
全てのモードで使われるが、
printモード以外では必須指定項目 - value[string]
メタデータの値の指定。
modify,addモードでは必須項目 - function[int]
-
valueの比較方法
- same_str
文字列として解釈し、文字の一致。浮動小数点はマッチしない - starts_with
文字列として解釈し、数値や文字の先頭が一致すればマッチする
例:1 を指定すれば 1.xxx や 1x.xxx などがマッチする - less
浮動小数点として解釈し、以下 - equal
浮動小数点として解釈し、浮動小数点を含む数値の一致 - greater
浮動小数点として解釈し、以上 - expr
浮動小数点として解釈し、
exprオプションの真偽で真偽を返す - ends_with
文字列として解釈し、数値や文字の末尾が一致すればマッチする
例:1 を指定すれば xx1 や xx.xx1 などがマッチする
- same_str
- expr[string]
functionでexprを指定すると使える。真偽の条件として評価式で使う。0 は何も出力せず、1 は全て出力する。ffmpeg で使える評価式を参照 - VALUE1, FRAMEVAL
keyで指定したメタデータの値 - VALUE2, USERVAL
valueで指定した値 - file[string]
ログを指定したファイル名で出力する。既定値は出力しない。フォーマット形式は指定できない - direct[boolean]
mode=printを指定しfileでURLを出力先にするときにバッファを減らす。既定値は無効
オプション解説
selectの例
YLOWを 189 以上と 191 以下を組み合わせて両方を満たす条件の例。同じオプションなのでprintは1つで良い。
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YLOW,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=189:function=greater,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=191:function=less,signalstats,metadata=print:key=lavfi.signalstats.YLOW:function=expr:expr=VALUE1
YLOWとYMINを組み合わせた例。別のオプションなのでprintはそれぞれ必要。
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=190:function=less,metadata=print:key=lavfi.signalstats.YLOW:function=expr:expr=VALUE1,metadata=select:key=lavfi.signalstats.YMIN:value=140:function=less,metadata=print:key=lavfi.signalstats.YMIN:function=expr:expr=VALUE1
addの例
selectの条件にaddをつけてYLOW190以下とYMIN140 以下のどちらかを満たす条件の例。。別のオプションなのでprintはそれぞれ必要。
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=190:function=less,metadata=print:key=lavfi.signalstats.YLOW:function=expr:expr=VALUE1,metadata=add:key=lavfi.signalstats.YMIN:value=140:function=less,signalstats,metadata=print:key=lavfi.signalstats.YMIN:function=expr:expr=VALUE1
modifyの例
YLOWの条件結果の全てを140に書き換える。
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YLOW:value=190:function=less,metadata=modify:key=lavfi.signalstats.YLOW:value=140,metadata=print:key=lavfi.signalstats.YLOW:function=expr:expr=VALUE1
deleteの例
YMINの条件を消してYMAXの条件に切り替えた例。
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YMIN:value=140:function=greater,metadata=delete:key=lavfi.signalstats.YMIN,metadata=select:key=lavfi.signalstats.YMAX:value=0:function=greater,metadata=print:key=lavfi.signalstats.YMAX:function=expr:expr=VALUE1
YMINの条件を消して再度YMINを指定しても出力されない。
ffplay -f lavfi -i movie=input,signalstats,metadata=select:key=lavfi.signalstats.YMIN:value=140:function=greater,metadata=delete:key=lavfi.signalstats.YMIN,metadata=select:key=lavfi.signalstats.YMIN:value=140:function=greater,metadata=print:key=lavfi.signalstats.YMIN:function=expr:expr=VALUE1