ffmpeg 6.0から使える予定の-stats_enc_pre、-stats_enc_post、stats_mux_preの使い方。フレーム数やPTS、DTS、サンプル数、サイズ、平均ビットレートなどがストリームごとに調べられる。従来は-vstats -vstats_file foo.txtでエンコードログを出力できたが、一層パースしやすい形で出力できる。
基本コマンド
入力ファイルの{fidx} {sidx} {n} {t}を調べる。
ffmpeg -i input -stats_enc_pre stats_enc_pre.txt -stats_enc_pre_fmt "{fidx} {sidx} {n} {t}" -f null -
エンコードしたファイルの{fidx} {sidx} {n} {t} {size} {br} {abr}を調べる。
ffmpeg -i input -stats_enc_post stats_enc_post.txt -stats_enc_post_fmt "{fidx} {sidx} {n} {t} {size} {br} {abr}" output
ストリームを限定するならstream_specifierを指定するか、-mapで1つだけを取り出すか、-vn、-anなどを併用する。
映像の0番目(最初のストリーム)を指定する。音声があれば音声もデーコードするので遅くなる。
ffmpeg -i input -stats_enc_pre:v:0 stats_enc_pre_video.txt -f null -
-map、-anを併用する例。
ffmpeg -i input -stats_enc_pre:v:0 stats_enc_pre_audio.txt -map a:0 -f null -
ffmpeg -i input -stats_enc_pre:v:0 stats_enc_pre_audio.txt -an -f null -
stream_specifierを指定すれば映像と音声を別ファイルのログに出力できる。
ffmpeg -i input -stats_enc_post:v:0 stats_enc_post_video.txt -stats_enc_post:a:0 stats_enc_post_audio.txt output
オプション間のスペースをカンマ区切りにするとログもカンマ区切りになる。
ffmpeg -i input -stats_enc_pre stats_enc_pre.csv -stats_enc_pre_fmt "{fidx},{sidx},{n},{t}" -f null -
公式ドキュメント:ffmpeg Documentation : Advanced options
オプション
ログはフレーム、またはパケットごとに改行し、複数ストリームはインターリーブして出力される。fidx、sidxで区別できるが、別のログファイルにするならstream_specifierで指定する。このインターリーブの正確な順序は指定されていないので、同じコマンドを実行しても同じ結果になる保証はない。
書き込むタイミングの違い
- -stats_enc_pre:生のビデオまたはオーディオフレームに関する情報をエンコーダに送る直前に書き込む
- -stats_enc_post:エンコードしたパケットに関する情報をエンコーダから受け取ったときに書き込む
- -stats_mux_pre:パケットがマルチプレクサに送る直前にパケットに関する情報を書き込む
指定形式
- -stats_enc_pre[:stream_specifier] path (output,per-stream)
- -stats_enc_post[:stream_specifier] path (output,per-stream)
- -stats_mux_pre[:stream_specifier] path (output,per-stream)
- -stats_enc_pre_fmt[:stream_specifier] format_spec (output,per-stream)
- -stats_enc_post_fmt[:stream_specifier] format_spec (output,per-stream)
- -stats_mux_pre_fmt[:stream_specifier] format_spec (output,per-stream)
既定値
- pre-encoding:{fidx} {sidx} {n} {t}
- post-encoding:{fidx} {sidx} {n} {t}
フォーマットの指定内容
- fidx:出力ファイルのインデックス番号。0開始
- sidx:出力ストリームファイルのインデックス番号。0開始
- n:フレーム番号。Pre-encodingではエンコーダに送ったフレーム数。Post-encodingではエンコーダから受け取ったパケット数
- ni:出力フレームまたはパケットに対応する(つまり、デコーダによる出力)の入力フレーム数。利用できないときは-1
- tb:num/denで表されるエンコーダタイムベース。マルチプレクサが使用するタイムベースとは異なるときがあることに注意
- tbi:num/denで表されるptsiのエンコーダタイムベース。ptsiが有効なら使える。使えなければ0/1になる
- pts:フレームまたはパケットのプレゼンテーションタイムスタンプ(整数)。表示時間はtbと乗算すると求まる
- ptsi:niのPTS。表示時間はtbiと乗算すると求まる。利用できないときは(2^63 – 1 = 9223372036854775807)と表示される
- t:nの表示時間。ptsとtbを乗算したもの
- ti:niの表示時間。ptsiとtbiを乗算したもの。利用できないときはinfと表示される
- dts:パケットのデコードタイムスタンプ。タイムベースと乗算するとPTSが求まる
- dt:フレームまたはパケットのデコードタイムスタンプ。dtsとtbを乗算したもの
- sn:これまでにエンコーダーに送ったオーディオサンプル数。音声でPre-encoding限定
- samp:フレーム内のオーディオサンプル数。音声でPre-encoding限定
- size:エンコードされたパケットのバイトサイズ
- br:現在のビットレート(bps)
- abr:これまでのストリーム全体の平均ビットレート(bps、現時点で判断できないときは-1)
設定可否
-stats_enc_pre_fmt | -stats_enc_post_fmt | -stats_mux_pre_fmt | |
fidx | 〇 | 〇 | 〇 |
sidx | 〇 | 〇 | 〇 |
n | 〇 | 〇 | 〇 |
ni | 〇 | 〇 | 〇 |
tb | 〇 | 〇 | 〇 |
tbi | 〇 | 〇 | 〇 |
pts | 〇 | 〇 | 〇 |
ptsi | 〇 | 〇 | 〇 |
t | 〇 | 〇 | 〇 |
ti | 〇 | 〇 | 〇 |
dts | 〇 | 〇 | |
dt | 〇 | 〇 | |
sn | 〇 | ||
samp | 〇 | ||
size | 〇 | 〇 | |
br | 〇 | 〇 | |
abr | 〇 | 〇 |