ffmpeg 同梱の ffprobe で動画ファイルの詳細を確認する

以前の記事で、Windows10 + Git SDK 環境に CODEX FFMPEG (gyan.dev) というビルド済の ffmpeg をインストールした。

この時、アーカイブを 7-Zip で解凍したところ、ffmpeg.exe の他に ffplay.exeffprobe.exe というファイルも格納されていた。この ffprobe というのは、動画ファイルの詳細情報を出力するための CLI ツールだそうなので、試してみた。

ffmpeg 同様、オプションがかなり豊富で、書き方や順序が難しかった。試行錯誤して、自分がよく使いそうなオプションを取り揃えたので以下に記載する。

$ ffprobe -hide_banner -loglevel error \
    -print_format flat=s=_ \
    -select_streams v:0 \
    -show_entries format=filename,size,duration,bit_rate:stream=width,height,coded_width,coded_height,duration,bit_rate,codec_name,r_frame_rate \
    -sexagesimal -byte_binary_prefix -unit -prefix -pretty \
    './Example.mp4'

Git SDK から ffprobe.exe コマンドを実行した時の出力結果例は次のとおり。

# オプションなし
streams_stream_0_codec_name="h264"
streams_stream_0_width=1280
streams_stream_0_height=720
streams_stream_0_coded_width=1280
streams_stream_0_coded_height=720
streams_stream_0_r_frame_rate="30/1"
streams_stream_0_duration="40.408333"
streams_stream_0_bit_rate="1665186"
format_filename="./Example.mp4"
format_duration="40.425941"
format_size="9082607"
format_bit_rate="1797381"

# -pretty オプション
streams_stream_0_codec_name="h264"
streams_stream_0_width=1280
streams_stream_0_height=720
streams_stream_0_coded_width=1280
streams_stream_0_coded_height=720
streams_stream_0_r_frame_rate="30/1"
streams_stream_0_duration="0:00:40.408333"
streams_stream_0_bit_rate="1.665186 Mbit/s"
format_filename="./Example.mp4"
format_duration="0:00:40.425941"
format_size="8.661849 Mibyte"
format_bit_rate="1.797381 Mbit/s"

ビットレートと再生時間は format セクションから取得するのと stream から取得するのとがあって、微妙に値に違いがあるのだが、どういう差なのかはよく分かっていない。エクスプローラでファイルのプロパティを見た時も、「ビットレート」と「総ビットレート」という項目が2つ存在するので、ファイル全体と、オーディオを除いたビデオ部分とかで、何か違うのかもしれない。

出力時の -pretty 周りのオプションは、どれがどう効くのかイマイチ分かりにくいところがあるので、4つのオプションの全組み合わせを一覧表にしてみた。やっぱりよー分からん。w

ffprobe オプション一覧表

自分は -sexagesimal だけ付けておいて、ビットレートやファイルサイズは詳細な値を出力するのが扱いやすいかな。

JSON 形式での出力はこんな感じ。

$ ffprobe -hide_banner -loglevel error \
    -print_format json \
    -select_streams v:0 \
    -show_entries format=filename,size,duration,bit_rate:stream=width,height,coded_width,coded_height,duration,bit_rate,codec_name,r_frame_rate \
    -sexagesimal \
    './Example.mp4'

{
    "programs": [

    ],
    "streams": [
        {
            "codec_name": "h264",
            "width": 1280,
            "height": 720,
            "coded_width": 1280,
            "coded_height": 720,
            "r_frame_rate": "30/1",
            "duration": "0:00:40.408333",
            "bit_rate": "1665186"
        }
    ],
    "format": {
        "filename": "./Example.mp4",
        "duration": "0:00:40.425941",
        "size": "9082607",
        "bit_rate": "1797381"
    }
}

jq コマンドを組み合わせてタブ区切りで出力とかしてみたら、xargs で複数ファイルのデータを出力させて Excel に貼っ付けて表で管理とかしやすそう。

$ ffprobe -hide_banner -loglevel error \
    -print_format json \
    -select_streams v:0 \
    -show_entries format=filename,size,duration,bit_rate:stream=width,height,coded_width,coded_height,duration,bit_rate,codec_name,r_frame_rate \
    -sexagesimal \
    './Example.mp4' \
  | jq -r '[.format.filename, .format.size, .format.duration, .format.bit_rate, .streams[0].width, .streams[0].height, .streams[0].r_frame_rate] | @tsv'

# ファイル名     サイズ     再生時間          bps         幅      高さ   FPS
./Example.mp4    9082607    0:00:40.425941    1797381     1280    720    30/1

よきよき。