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