動画や音声、画像ファイルを調べるのに ffmpeg で表示される以上のことを調べるときに使う ffprobe の使い方。grep, awk などから正規表現を使って必要なデータを取る方法もあるが、今回はそうでなくオプションを指定して必要なデータを表示する方法を紹介する。出力フォーマット指定ができるので json, xml からパースすれば正規表現で無理に取る必要はない。
ffprobe では vf, af, filter_complex が使えないので lavfi デバイスで読み込み、そこからフィルタを使う。よって映像は rawvideo、音声は pcm_f32le になるのに注意。
基本コマンド
オプションを何も付けなければ ffmpeg と同じ表示になる。
ffprobe -i input
コンテナストリームの情報を表示する。これが基本の出力内容になりこれから必要なものだけを出力したり、パケット単位で出力したりもできる。
ffprobe -i input -show_streams
ffmpeg などで表示される configure オプションやライブラリのバージョンは -hide_banner で非表示にできる。
ffprobe -hide_banner -i input -show_streams
ffprobe の内容だけが必要なら -v error を付ける。
ffprobe -v error -i input -show_streams
解像度を表示する。
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -i input
フレームレート、映像の開始時間、映像の時間を表示する。
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,start_time,duration -i input
パケット毎の pts_time,dts_time,size,flags(フレームタイプ, K_ がキーフレーム)を開始から10秒間 log.txt にリダイレクトさせる。
ffprobe -v error -i input -select_streams v:0 -show_entries packet=pts_time,dts_time,size,flags -read_intervals "%+10" > log.txt
pts_time と signalstats
フィルタから YMIN を開始から1秒間 YMIN.txt にリダイレクトさせる。
ffprobe -v error -f lavfi -i movie=input.mp4,signalstats -show_entries packet=pts_time -show_entries packet_tags=lavfi.signalstats.YMIN -read_intervals "%1" > YMIN.txt
lavfi デバイスで読み込む方法は movie, amovie 入力の設定内容 を参照。
packet_tags で使えるフィルタは meta | ニコラボ で検索。
16進数 ASCII のテキスト(show_data.txt)にリダイレクトする。コンソールにそのまま表示するとデータ量が多くおそらく固まるので必ずリダイレクトさせる。
ffprobe -v error -show_packets -show_data -i img > show_data.txt
公式ドキュメント : ffprobe Documentation
公式のWiki : FFprobeTips – FFmpeg
オプション
- -unit
start_time, duration, bit_rate, sample_rate に単位が付く - -prefix
start_time, sample_rate, bit_rate の表示が2進接頭辞(K)表示に変わる - -sexagesimal
start_time, duration の書式が60進数の時間表示に変わる - -pretty
表示が KHz, Kbit/s になり読みやすくなる - -print_format, of
default, csv, flat, ini, json, xml が使える。詳しくは後述 - -select_streams
フレーム毎のデータを表示。show_streams, show_packets, etc と併用する。map と同じように v, a, 0:v, 0:a などと指定する - -sections
セクション階層の表示 - -show_data
パケット毎のデータを16進数 ASCII のテキストで表示。show_packets を指定すればパケットのデータを出力し、show_streams を指定すればコーデックの extradata を出力する - -show_data_hash
show_packets を指定すればパケット毎の指定したアルゴリズムのハッシュを表示。show_streams を指定すればコーデックの extradata_hash を表示 - -show_error
“ERROR”セクションにエラーを表示。何もなければ出力しない - -show_format
“FORMAT”セクションにコンテナフォーマットを表示。シンプルにデータ表示されるので使い勝手がよい
表示内容は filename, nb_streams, nb_programs, format_name, format_long_name, start_time, duration, size, bit_rate, probe_score - -show_frames
フレーム単位で表示 - -show_entries
表示する内容の指定。section_entries を指定しなければすべてを表示。詳しくは後述 - -show_packets
パケット単位で表示 - -show_programs
“PROGRAM”セクションをプログラム内容を表示
表示内容は program_id, program_num, nb_streams, pmt_pid, pcr_pid, start_pts, start_time, end_pts, end_time, TAG:service_name, TAG:service_provider - -show_streams
ストリーム内容の表示 - -show_chapters
“CHAPTER”セクションにチャプター別のデータを表示
表示内容は id, time_base, start, start_time, end, end_time, TAG:title - -count_frames
フレーム数の表示。-show_entries stream と併用。nb_read_frames に表示される - -count_packets
パケット数の表示。-show_entries stream と併用。nb_read_packets に表示される - -show_program_version
“PROGRAM_VERSION”セクションにプログラムのバージョン表示
表示内容は version, copyright, compiler_ident, configuration - -show_library_versions
“LIBRARY_VERSION”セクションにライブラリのバージョン表示
表示内容は libavutil, libavcodec, libavformat, libavdevice, libavfilter, libswscale, libswresample, libpostproc - -show_versions
show_program_version, show_library_versions を同時指定 - -show_pixel_formats
“PIXEL_FORMAT”セクションに対応したピクセルフォーマットを表示 - -read_intervals
調べるデータの範囲指定。パケット単位と秒単位がある。詳しくは後述 - -i
入力ファイルの指定。無指定でも入力ファイルとして扱える。ffplay と同じ
print_format, of
default
無指定だとこれになり、対応する FORMAT, STREAM と PROGRAM_STREAM セクションにメタデータタグを表示する。
表示形式
[SECTION]
key1=val1
...
keyN=valN
[/SECTION]
オプション内容
- nokey, nk[boolean]
有効にすると key=val の key を表示しない
既定値:0(表示する) - noprint_wrappers, nw[boolean]
有効にするとセクション名を表示しない
既定値:0(表示する)
compact, csv
1つのセクションを1行でカンマ区切りに表示し、対応する “FORMAT”, “STREAM” セクションのメタデータタグを表示する。メタデータタグキーが表示される場合は接頭辞 “tag:” が付く。
表示形式
section|key1=val1| ... |keyN=valN
オプション内容
- item_sep, s[string]
セパレータの指定
既定値:”,”(カンマ) - nokey, nk[boolean]
有効にすると key=val の key を表示しない
既定値:1(表示しない) - escape, e[string]
エスケープ方法の指定 - c
C言語のようなエスケープ。既定値 - csv
CSVのようなエスケープ - none
エスケープしない - rint_section, p[boolean]
セクション名の表示指定
既定値:1(表示する)
flat
スクリプトと連携しやすい形式。key=value 形式が “streams.stream.3.tags.foo=bar” 形式になる。
オプション内容
- sep_char, s[string]
セパレータの指定
既定値:”.”(ピリオド) - hierarchical, h[boolean]
セクション名の表示指定
既定値:1(表示する)
ini
ini 形式で表示する。
- メタデータファイルは UTF-8 でエンコードされた INI 形式のテキストファイルで構成される
- ‘.’はサブグループのセパレータである
- 改行の ‘\t’, ‘\f’, ‘\b’ 文字はエスケープされる
- ‘\’ はエスケープ文字である
- ‘#’ の後ろはコメント扱いになる
- ‘=’ は key/value のセパレータである
- ‘:’ は使われないが key/value セパレータをパースする
オプション内容
hierarchical, h[boolean]
セクション名の表示指定
既定値:1(表示する)
json
json 形式で表示する。
オプション内容
compact, c[boolean]
有効にすると1行表示になる
既定値:0(1行で表示しない)
xml
xml 形式で表示する。
- fully_qualified, q[boolean]
完全に XSD ファイルの仕様に沿った形で表示する
既定値:0(厳格ではない) - xsd_compliant, x[boolean]
完全に XSD ファイルの仕様に沿った形か確認する。有効にすると fully_qualified, q も有効になる
既定値:0(確認しない)
show_entries
書式
LOCAL_SECTION_ENTRIES ::= SECTION_ENTRY_NAME[,LOCAL_SECTION_ENTRIES]
SECTION_ENTRY ::= SECTION_NAME[=[LOCAL_SECTION_ENTRIES]]
SECTION_ENTRIES ::= SECTION_ENTRY[:SECTION_ENTRIES]
パケットにはpts_time,duration_time,stream_index を表示し、ストリームには index,codec_type を表示する。
show_entries packet=pts_time,duration_time,stream_index:stream=index,codec_type
“format” セクションはすべてを表示し、”stream” セクションでは codec_type だけを表示する。
show_entries format:stream=codec_type
“stream, format” セクションですべてのタグを表示する。
show_entries stream_tags:format_tags
“stream” セクションで表示可能ならタイトルタグを表示する。
show_entries stream_tags=title
“packet” セクションで表示可能なら signalstats
フィルタの YAVG を表示する。
show_entries packet_tags=lavfi.signalstats.YAVG
show_entries stream の表示例
show_entries packet の抜粋
show_entries format の表示例
read_intervals
書式
INTERVAL ::= [START|+START_OFFSET][%[END|+END_OFFSET]]
INTERVALS ::= INTERVAL[,INTERVALS]
- 実際に使うには “” で数値を囲む
- 指定した値は完璧ではないので多少の余分を持って指定する
- “%” から左が1セクション(開始位置)、右が2セクション(終了位置)
- 1セクションが無記入なら最初から、2セクションが無記入なら最後まで
- “+” は相対位置、無指定は絶対位置
- “#” はパケット数、数値なら時間(ss, hh:mm:ss 形式)
- “複数の位置を指定するには “,” でつなげる
10秒から始まり、そこから20秒間(相対位置)と、1分30秒から1分45秒(絶対位置)までの例。
10%+20,01:30%01:45
1分23秒から始まり、そこから42パケット(相対位置)。
01:23%+#42
開始0秒(1セクション無指定)から20秒まで。
%+20
開始0秒(1セクション無指定)から2分30秒まで。
%02:30