ffprobeで動画を解析する

ffprobeとはマルチメディアストリーム情報を解析し、人間もしくは機会が理解出来る形式で出力するツールです。


# ffprobeのインストール

ffprobeはffmpegに含まれているのでffmpegをインストールします。

```shell-session
% brew install ffmpeg
```

# ffprobeの使い方

## コマンド構成

```shell-session
ffprobe [オプション] [入力ファイル]
```

## 入力ファイルの解析

```shell-session
ffprobe 入力ファイル
```

```shell-session:出力例
% ffprobe XXX.ts
ffprobe version 3.1.2 Copyright (c) 2007-2016 the FFmpeg developers
  built with Apple LLVM version 7.3.0 (clang-703.0.31)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.1.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --disable-lzma --enable-vda
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 48.101 / 57. 48.101
  libavformat    57. 41.100 / 57. 41.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 47.100 /  6. 47.100
  libavresample   3.  0.  0 /  3.  0.  0
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
[mpegts @ 0x7fc7ba008000] start time for stream 0 is not set in estimate_timings_from_pts
Input #0, mpegts, from 'XXX.ts':
  Duration: 00:00:02.04, start: 2.154811, bitrate: 1963 kb/s
  Program 1
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv), 1024x576 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 94 kb/s
Unsupported codec with id 100358 for input stream 0
```

入力ファイルが開けない、もしくはマルチメディアファイルとして認識できない場合は正の値の戻り値を返して終了します。

```shell-session:失敗例
% ffprobe XXX.pdf -hide_banner
XXX.pdf: Invalid data found when processing input
% echo $?
1 <- 正の値の戻り値
```

## オプション

### ヘルプ [-h]

マルチメディア形式ごとにオプション異なったりするので、不明点ある時はヘルプオプションを使いましょう。

#### 特定のヘルプを表示 [-h *topic*]

```shell-session:デコーダで絞る例
% ffprobe -h decoder=h264 -hide_banner
```
指定できるデコーダ一覧は `ffprobe -decoders` で取得できます。

```shell-session:エンコーダで絞る例
% ffprobe -h encoder=h264_videotoolbox -hide_banner
```
指定できるエンコーダ一覧は `ffprobe -encoders` で取得できます。

```shell-session:デマルチプレクサで絞る例
% ffprobe -h demuxer=hls -hide_banner
```
指定できるデマルチプレクサ一覧は `ffprobe -formats` で取得できます。
(先頭にDがついているのがデマルチプレクサです)

```shell-session:マルチプレクサで絞る例
% ffprobe -h muxer=hls -hide_banner
```
指定できるデマルチプレクサ一覧は `ffprobe -formats` で取得できます。
(先頭にEがついているのがマルチプレクサです)

### バナーを隠す [-hide_banner]

以下のようなバナー(バージョンやライブラリ情報など)を表示したくない時に使いましょう。

```shell-session:バナー部
% ffprobe XXX.ts -hide_banner
ffprobe version 3.1.2 Copyright (c) 2007-2016 the FFmpeg developers
  built with Apple LLVM version 7.3.0 (clang-703.0.31)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.1.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --disable-lzma --enable-vda
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 48.101 / 57. 48.101
  libavformat    57. 41.100 / 57. 41.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 47.100 /  6. 47.100
  libavresample   3.  0.  0 /  3.  0.  0
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
```

### フォーマット/コンテナ情報表示 [-show_format]

フォーマット、サイズ、ビットレート情報を表示します。

```shell-session:例
% ffprobe XXX.ts -hide_banner -show_format                                                                                                                          [mpegts @ 0x7ff284000400] start time for stream 0 is not set in estimate_timings_from_pts
Input #0, mpegts, from 'XXX.ts':
  Duration: 00:00:02.04, start: 2.154811, bitrate: 1963 kb/s
  Program 1
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv), 1024x576 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 94 kb/s
Unsupported codec with id 100358 for input stream 0
[FORMAT]
filename=XXX.ts
nb_streams=3
nb_programs=1
format_name=mpegts
format_long_name=MPEG-TS (MPEG-2 Transport Stream)
start_time=2.154811
duration=2.044522
size=501772
bit_rate=1963381
probe_score=50
[/FORMAT]
```

### フレーム情報表示 [-show_frames]

フレーム情報を表示します。

```shell-session:例
% ffprobe XXX.ts -hide_banner -show_frames
[mpegts @ 0x7fdafa803a00] start time for stream 0 is not set in estimate_timings_from_pts
Input #0, mpegts, from 'XXX.ts':
  Duration: 00:00:02.04, start: 2.154811, bitrate: 1963 kb/s
  Program 1
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv), 1024x576 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 94 kb/s
Unsupported codec with id 100358 for input stream 0
[FRAME]
media_type=audio
stream_index=2
key_frame=1
pkt_pts=193933
pkt_pts_time=2.154811
pkt_dts=193933
pkt_dts_time=2.154811
best_effort_timestamp=193933
best_effort_timestamp_time=2.154811
pkt_duration=2089
pkt_duration_time=0.023211
pkt_pos=376
pkt_size=287
sample_fmt=fltp
nb_samples=1024
channels=2
channel_layout=stereo
[/FRAME]
[FRAME]
media_type=video
stream_index=1
key_frame=1
pkt_pts=197910
pkt_pts_time=2.199000
pkt_dts=197910
pkt_dts_time=2.199000
best_effort_timestamp=197910
best_effort_timestamp_time=2.199000
pkt_duration=3000
pkt_duration_time=0.033333
pkt_pos=1316
pkt_size=37483
width=1024
height=576
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
[/FRAME]
.
.
.
```

### 指定のエントリーを表示 [-show_entries *section_entries*]

特定の情報だけを取得できるので便利。

以下の例だとFORMATセクションのビットレート(bit_rate)を表示

```shell-session:例
% ffprobe XXX.ts -hide_banner -show_entries format=bit_rate                                                                                                         [mpegts @ 0x7fa3c9000000] start time for stream 0 is not set in estimate_timings_from_pts
Input #0, mpegts, from 'XXX.ts':
  Duration: 00:00:02.04, start: 2.154811, bitrate: 1963 kb/s
  Program 1
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv), 1024x576 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 94 kb/s
Unsupported codec with id 100358 for input stream 0
[FORMAT]
bit_rate=1963381
[/FORMAT]
.
.
.
```

*section_entries* は以下の構成になっており、

```:section_entries
LOCAL_SECTION_ENTRIES ::= SECTION_ENTRY_NAME[,LOCAL_SECTION_ENTRIES]
SECTION_ENTRY         ::= SECTION_NAME[=[LOCAL_SECTION_ENTRIES]]
SECTION_ENTRIES       ::= SECTION_ENTRY[:SECTION_ENTRIES]
```

以下のように複合的に検索することも可能。
(FORMATセクションのビットレート(bit_rate)エントリーとFRAMEセクションのメディア種別(media_type)、PTS秒数、DTS秒数を表示)

```shell-session:例
% ffprobe XXX.ts -hide_banner -show_entries format=bit_rate:frame=media_type,pkt_pts_time,pkt_dts_time
[mpegts @ 0x7f949b008400] start time for stream 0 is not set in estimate_timings_from_pts
Input #0, mpegts, from 'XXX.ts':
  Duration: 00:00:02.04, start: 2.154811, bitrate: 1963 kb/s
  Program 1
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv), 1024x576 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 94 kb/s
Unsupported codec with id 100358 for input stream 0
[FRAME]
media_type=video
pkt_pts_time=4.166000
pkt_dts_time=4.166000
[/FRAME]
[FORMAT]
bit_rate=1963381
[/FORMAT]
.
.
.
```

### パケット情報を表示 [-show_packets]

```shell-session:例
% ffprobe XXX.ts -hide_banner -show_packets
[mpegts @ 0x7fb084008400] start time for stream 0 is not set in estimate_timings_from_pts
Input #0, mpegts, from 'XXX.ts':
  Duration: 00:00:02.04, start: 2.154811, bitrate: 1963 kb/s
  Program 1
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv), 1024x576 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 94 kb/s
Unsupported codec with id 100358 for input stream 0
[PACKET]
codec_type=audio
stream_index=2
pts=193933
pts_time=2.154811
dts=193933
dts_time=2.154811
duration=2089
duration_time=0.023211
convergence_duration=N/A
convergence_duration_time=N/A
size=301
pos=376
flags=K
[/PACKET]
.
.
.
```

### プログラム情報を表示 [-show_programs]

プログラム情報(ストリーム情報含む)を表示

```shell-session:例
% ffprobe XXX.ts -hide_banner -show_programs
[mpegts @ 0x7fe0e4008400] start time for stream 0 is not set in estimate_timings_from_pts
Input #0, mpegts, from 'XXX.ts':
  Duration: 00:00:02.04, start: 2.154811, bitrate: 1963 kb/s
  Program 1
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv), 1024x576 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 94 kb/s
Unsupported codec with id 100358 for input stream 0
[PROGRAM]
program_id=1
program_num=1
nb_streams=3
pmt_pid=4095
pcr_pid=256
start_pts=2154811
start_time=2.154811
end_pts=4199333
end_time=4.199333
[STREAM]
...
[/STREAM]
[/PROGRAM]
```

### ストリーム情報を表示 [-show_streams]

```
% ffprobe XXX.ts -hide_banner -show_streams
[mpegts @ 0x7ffc9b000000] start time for stream 0 is not set in estimate_timings_from_pts
Input #0, mpegts, from 'XXX.ts':
  Duration: 00:00:02.04, start: 2.154811, bitrate: 1963 kb/s
  Program 1
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv), 1024x576 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 94 kb/s
Unsupported codec with id 100358 for input stream 0
[STREAM]
index=0
codec_name=timed_id3
codec_long_name=timed ID3 metadata
profile=unknown
codec_type=data
codec_tag_string=ID3
codec_tag=0x20334449
id=0x102
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/90000
start_pts=193933
start_time=2.154811
duration_ts=184007
duration=2.044522
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
[/STREAM]
[STREAM]
index=1
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Main
codec_type=video
codec_time_base=1/60
codec_tag_string=[27][0][0][0]
codec_tag=0x001b
width=1024
height=576
coded_width=1024
coded_height=576
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=41
color_range=tv
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=left
timecode=N/A
refs=1
is_avc=false
nal_length_size=0
id=0x100
r_frame_rate=30/1
avg_frame_rate=30/1
time_base=1/90000
start_pts=197910
start_time=2.199000
duration_ts=180030
duration=2.000333
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
[/STREAM]
[STREAM]
index=2
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=LC
codec_type=audio
codec_time_base=1/44100
codec_tag_string=[15][0][0][0]
codec_tag=0x000f
sample_fmt=fltp
sample_rate=44100
channels=2
channel_layout=stereo
bits_per_sample=0
id=0x101
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/90000
start_pts=193933
start_time=2.154811
duration_ts=177632
duration=1.973689
bit_rate=94057
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
[/STREAM]
```

### チャプター情報を表示 [-show_chapters]

フォーマットに保存されたチャプターに関する情報を表示します。

```shell-session:例
% ffprobe XXX.mp4 -hide_banner -show_chapters
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'XXX.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2014-10-02 00:22:55
  Duration: 00:02:21.80, start: 0.000000, bitrate: 1120 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 926 kb/s, 30 fps, 30 tbr, 30 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
    Metadata:
      creation_time   : 2014-10-02 00:22:56
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
```

### ログレベルの設定 [-v *ログレベル*]

*ログレベル* に指定できるのは下記の通りで、下にいくほど情報が増えていきます。

- quiet - ログを出力しない
- panic - クラッシュを引き起こす致命的なエラーのみ表示(現在未使用)
- fatal - 致命的なエラーのみ表示
- error - すべてのエラーを表示
- warning - すべての警告、エラーを表示
- info - 警告、エラーを含む実行中の有益な情報を表示
- verbose - infoと同等のレベルの情報をより詳細に表示する
- debug - デバッグ用情報を含むすべての情報を表示
- trace - トレース情報を表示

ちなみにログはstderrに出力されるので、下記のように実行すればffprobeの実行結果とログを分離してファイル出力できます。

```shell-session:例
% ffprobe XXX.ts -show_streams -v error >result.txt  2>log.txt
```

### 出力形式の設定 [-of, -print_format *形式名[=形式オプション]* ]

形式名には下記の通りです。

- default - 文字通りデフォルトです。出力形式を指定しなかった時はこれになります。
- compact - 項目を `キー=値` の形式で表し、各項目間は `|` で分割する。
- csv - CSV形式
- flat - 項目を `streams.stream.0.index=0` の形式で表し、各項目間は改行コードで分割する。
- ini - INI形式
- json - JSON形式
- xml - XML形式

### 人間の見やすい形で表示 [-pretty]

単位をつけたり、時間をHH:MM:SS.MICROSECONDS形式にしたりして、人間の見やすい形にする。
`-unit -prefix -byte_binary_prefix -sexagesimal` のオプションを指定した時と同じ挙動。

例

| | デフォルト | -pretty |
|:-:|:-:|:-:|
| start_time | 100.154811 | 0:01:40.154811 |
| bit_rate | 94057 | 94.057000 Kbit/s |
| sample_rate | 44100 | 44.100000 KHz |

***
オプションの説明だけで結構な量になってしまったので、この記事は一旦これくらいで。
別記事で続ける予定です。