ffprobeの使い方
ffmpeg NVENC の画質と最適設定 の -rc-lookahead の調査でビットレートを調べるのに bat で ffprobe を使ったので使い方をまとめてみました。
まず format と stream の全項目を表示して必要な項目名を調べる
ffprobe.exe -v error -i %1 -show_entries format
ffprobe.exe -v error -i %1 -show_entries stream
次に必要な項目を表示させる
ffprobe.exe -v quiet -i %1 -show_entries format=nb_streams,format_name,duration,size -of default=noprint_wrappers=1 -pretty
ffprobe.exe -v quiet -i %1 -show_entries stream=index,codec_name,codec_type,bit_rate -of default=noprint_wrappers=1 -pretty
format= stream= の後に表示したい項目を , 区切りで記述
結果は
nb_streams=2
format_name=mov,mp4,m4a,3gp,3g2,mj2
duration=0:30:01.133000
size=250.733060 Mibyte
index=0
codec_name=h264
codec_type=video
bit_rate=1.030972 Mbit/s
index=1
codec_name=aac
codec_type=audio
bit_rate=128.003000 Kbit/s
項目の値を変数に入れる場合は for /f を使う
for /f "usebackq delims=" %%i in (`ffprobe.exe -v error -i %1 -select_streams v:0 -show_entries stream^=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 -pretty`) do set a=%%i
echo bitrate %a%
結果は
bitrate 1.030972 Mbit/s
-select_streams v:0 で video ストリーム を選択
-of default^=noprint_wrappers^=1:nokey^=1 で bit_rate の値のみ表示 ^はエスケープ
delims=" は区切り文字無効、-pretty 対策、デフォルトだとスペース区切りなので単位がなくなる
この方法は一項目のみに対応
もう一つは tokens を使う方法、複数項目にも対応できる
for /f "usebackq tokens=1,2 delims==" %%i in (`ffprobe.exe -v error -i %1 -select_streams v:0 -show_entries stream^=bit_rate -pretty`) do if %%i==bit_rate set a=%%j
delims== = を区切り文字にする
tokens=1,2 1番目(%i)項目名と2番目(%j)値を指定
for /f のオプション
tokens= 何番目のトークンを取り出すか指定
delims= トークンの区切り文字を指定
eol= この文字から始まる行を無視
skip= 先頭から指定された行数、スキップする
usebackq コマンドの出力を対象にする
`コマンド` 内ではエスケープが必要な記号があるので注意が必要 ^= ^, ^| など
ffprobeのオプション
-hide_banner バナーなし
-v error エラーのみ表示
-v quiet 表示なし
-select_streams ストリームの選択 0 1 or v:0 a:0
-sexagesimal 時:分:秒 で表示
-pretty 人間の見やすい形にする
-of default=noprint_wrappers=1 項目名=値 を表示
-of default=noprint_wrappers=1:nokey=1 値のみ表示
複数項目を一度に取り込む場合はこんな感じ
for /f "usebackq tokens=1,2 delims==" %%i in (`ffprobe.exe -v error -i %1 -select_streams v:0 -show_entries stream^=width^,height^,sample_aspect_ratio^,display_aspect_ratio`) do if %%i==width (set width=%%j) else (if %%i==height (set height=%%j) else (if %%i==sample_aspect_ratio (set SAR=%%j) else (if %%i==display_aspect_ratio set DAR=%%j)))
echo 画像サイズ width=%width% height=%height% SAR=%SAR% DAR=%DAR%
最後の ))) の数が違うと bat が落ちるので注意
-rc-lookahead の調査に使った動きの激しい部分のビットレートを調べる bat
@echo off
cd /d %~dp0
if "%~1"=="" echo 入力ファイルなし&goto end
rem call では 引数は変数に入れる必要あり
set in=%~1
rem 切り出し範囲
set ss=-ss 60
set t=-t 10
echo "%~nx1">> bitrate.txt
set bv=1000k
set rc=0&call :sub
set rc=5&call :sub
set rc=10&call :sub
set rc=20&call :sub
set rc=40&call :sub
:end
pause
exit /b
:sub
set out=h264_%bv%_rc%rc%
ffmpeg.exe -y %ss% -i "%in%" %t% -vf yadif -s 1280x720 -c:v h264_nvenc -b:v %bv% -b_ref_mode 1 -rc-lookahead %rc% -an -sn "%out%.mp4"
rem ビットレート取得
for /f "usebackq tokens=1,2 delims==" %%i in (`ffprobe.exe -v error -i "%out%.mp4" -select_streams v:0 -show_entries stream^=bit_rate`) do if %%i==bit_rate set a=%%j
set /a a=%a% / 1000
echo %out% %a% Kbps>> bitrate.txt
exit /b