動画や音声、画像ファイルを調べるのに 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

Json に出力する。
ffprobe -v error -i input -show_streams -of json > output.json

解像度を表示する。
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

コメントを残す

メールアドレスが公開されることはありません。

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