ffprobe の使い方

動画や音声、画像ファイルを調べるのに ffmpeg で表示される以上のことを調べるときに使う ffprobe の使い方。ログのフォーマット指定ができるので json、xml、iniからパースすれば正規表現で無理に取る必要はない。

ffprobe では-vf、-af、-filter_complexなどが使えないので lavfi デバイスで読み込み、そこからフィルタを使う。よって映像は rawvideo、音声は pcm_f32le になり元データとは異なるのに注意。デコーダの指定もできないので一部のピクセルフォーマット、具体的には VP9 の YUVA420 をデコードできない。FFmpeg 8.0 からデコーダを指定できるようになった。

VP9(libvpx-vp9)のエンコード設定について | アルファチャンネル付き動画を読み込む
ffprobe: add -codec:<media_spec> option and -c:<media_spec> variant · FFmpeg/FFmpeg@6711c6a · GitHub

ffmpeg 5.0からcsv出力が直った。
ffprobe: add missing separator when printing side data in compact output · FFmpeg/FFmpeg@131dbb9

ffmpeg 5.1から出力指定の-oが追加され、無指定は今までと同じ標準出力、-oでファイル出力できるようになった。ファイル形式は拡張子から判断しないので-ofで指定する。
ffprobe: add -o option · FFmpeg/FFmpeg@ff07492

基本コマンド

オプションを何も付けなければ ffmpeg と同じ表示になる。
ffprobe -i input

コンテナストリームの情報を表示する。これが基本の出力内容になりこれから必要なものだけを出力したり、パケット単位で出力したりもできる。
ffprobe -i input -show_streams

ffmpeg などで表示される configure オプションやライブラリのバージョンは-hide_bannerで非表示にできる。
ffprobe -hide_banner -i input -show_streams

ffprobe の内容だけが必要なら-v errorを付ける。
ffprobe -v error -i input -show_streams

JSON に出力する。
ffprobe -v error -i input -show_streams -of json > output.json

CSV に出力する。目視なら CSV 出力が読みやすい。
ffprobe -v error -i input -show_streams -of csv > output.csv

解像度を表示する。カンマ区切りで複数指定できる。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=width,height

フレームレート、映像の開始時間、映像の時間を表示する。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=r_frame_rate,start_time,duration

pts_time,pict_typeだけを表示する。
ffprobe -v error -i input -select_streams v:0 -show_frames -show_entries frame=pts_time,pict_type -of csv=p=0

pkt_posを昇順に並び替えることでBフレームのある動画に再生順ではなくデコード順に並び替えられる。
ffprobe -v error -i input -select_streams v:0 -show_frames -show_entries frame=pts_time,pkt_pos,pict_type -of csv=print_section=0

Iフレームの時間だけ表示する。
ffprobe -v error -i input -select_streams v:0 -show_frames -show_entries frame=pts_time,pict_type -of csv=print_section=0 | awk -F',' '/I/ {print $1}'

Iフレームのフレーム番号(0開始)だけ表示する。
ffprobe -v error -i input -select_streams v:0 -show_entries frame=pict_type -of flat | grep -e \\\"I\\\" - |sed -e "s/[^0-9]//g"

キーフレームの時間だけ表示する。
ffprobe -v error -i input -select_streams v:0 -show_entries packet=pts_time,flags -of csv=print_section=0 | awk -F',' '/K/ {print $1}'

Extracting I frames time stamps : ffmpeg
How to get time stamp of closest keyframe before a given timestamp with FFmpeg? – Super User

パケットのKのフレーム番号(0開始)だけ表示する。IDRフレームでないIフレームも含まれる。
ffprobe -v error -i input -select_streams v:0 -show_entries packet=flags -of flat | grep -e K - | sed -e "s/[^0-9]//g"

IDRなキーフレーム番号(0開始)だけ表示する。
ffprobe -v error -i input -select_streams v:0 -show_frames -show_entries frame=key_frame -of flat | grep key_frame=1 - | awk -F '.' '{print $3}'

再生順に表示されるピクチャータイプをテキストに出力する。
ffprobe -v error -i input -show_frames -show_entries frame=pict_type -of csv=print_section=0 > input-pict_type.txt

FFmpegの使用方法より。

  • I:Iフレーム (Intra coded frame)
  • P:Pフレーム (Predicted frame)
  • B:Bフレーム (Bidirectional predicted picture)
  • S:(switch frame)
  • SI:(switching I frame)
  • SP:(switching P frame)
  • BI:(special intra frame)

Video compression picture types – Wikipedia
x264 – Get frame type for specific frame using ffmpeg – Stack Overflow

nb_read_packets だけを表示する。1スタートの総パケット数なのでそのままの意味になる。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=nb_read_packets -count_packets -of csv=p=0

メタデータを元としたnb_framesだけを表示する。1スタートの総フレーム数なのでそのままの意味になる。処理が速い。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=nb_frames -of csv=p=0

デコードしたすべてのフレーム数nb_read_framesも表示する。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=nb_frames,nb_read_frames -count_frames -of default=noprint_wrappers=1:nokey=0

ffprobe – FFMPEG nb_frames vs nb_read_frames – Stack Overflow

-skip_frame nokeyを使ってキーフレームの時間だけ表示する。
ffprobe -v error -i input -select_streams v:0 -skip_frame nokey -show_entries frame=pts_time -of csv=print_section=0

-tで指定して特定時間時点のフレーム数を取得する。
ffmpeg -t 10 -i input -nostats -c:v copy -f null - 2>&1 | grep -Po "frame= *\K[0-9]*?(?= )"

video – How to get frame number given a timestamp using ffmpeg – Stack Overflow

字幕コーデックを表示する。
ffprobe -v error -i input -select_streams s -show_entries stream=index,disposition=forced,stream_tags=language,codec_name -of csv=nk=1:p=0

再生時に強制表示しているのを調べるにはDISPOSITION:default=1を確認する。
ffprobe -v error -i input -select_streams s -show_entries stream

Print subtitles type with ffprobe : ffmpeg

フォーマット(コンテナ)の時間。-sexagesimalをつければ読みやすくなる。
ffprobe -v error -i input -show_entries format=duration -of default=noprint_wrappers=1:nokey=1

ビデオストリームの時間だけを表示する。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1

ffmpeg – Difference between duration from mvhd box and ffprobe for mp4 file – Stack Overflow

映像のtimebaseを表示する。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=time_base -of csv=print_section=0

デコードできるフレーム数、時間を調べるにはログの最後の行(frame=34047 fps=3280 q=-0.0 Lsize=N/A time=00:23:40.05 bitrate=N/A speed= 137x)を見る。
ffmpeg -i input -f null -

パケット毎のpts_time,dts_time,size,flags(フレームタイプ, K_ がキーフレーム)を開始から10秒間 log.txt に出力する。
ffprobe -v error -i input -select_streams v:0 -show_entries packet=pts_time,dts_time,size,flags -read_intervals "%+10" > log.txt

トラック別の音声のチャンネルレイアウトと言語を調べる。
ffprobe -v error -i input -select_streams a -show_entries stream=channel_layout:stream_tags=language -of json > log.json

pts_timesignalstatsフィルタから YMIN を開始から1秒間 YMIN.txt に出力する。
ffprobe -v error -f lavfi -i movie=input.mp4,signalstats -show_entries packet=pts_time -show_entries packet_tags=lavfi.signalstats.YMIN -read_intervals "%1" > YMIN.txt
ffprobe -v error -f lavfi -i movie=input.mp4,signalstats -show_entries packet=pts_time -show_entries packet_tags=lavfi.signalstats.YMIN -read_intervals "%1" -of csv > YMIN.csv

YUV のデータを数値で表示する signalstats

複数のpacket_tags=lavfi.XXXをつなげるにはカンマ,でつなげる。
ffprobe -v error -f lavfi -i movie=input.mp4,signalstats -show_entries packet=pts_time -show_entries packet_tags=lavfi.signalstats.YMIN,lavfi.signalstats.YMAX -read_intervals "%1" > YMIN-YMAX.txt
ffprobe -v error -f lavfi -i movie=input.mp4,signalstats -show_entries packet=pts_time -show_entries packet_tags=lavfi.signalstats.YMIN,lavfi.signalstats.YMAX -read_intervals "%1" -of csv > YMIN-YMAX.csv

packet_tagsの数値をフィルタするにはmetadata、ametadatフィルタを使う。
ffprobe -v error -f lavfi -i movie=input.mp4,scdet,metadata=select:key=lavfi.scd.score:value=10:function=greater -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.scd.score -of csv > output.csv

すべてのメタデータを一度に出力するには-show_entries frame=pkt_pts_time:frame_tagsをつける。
ffprobe -v error -f lavfi -i movie=input.mp4,signalstats -select_streams v:0 -show_entries frame=pkt_pts_time:frame_tags -read_intervals "%1" > signalstats.txt

メタデータをコンソールに表示する metadata, ametadata
lavfi デバイスで読み込む方法は movie, amovie 入力の設定内容を参照。
packet_tagsで使えるフィルタは meta | ニコラボで検索。

16進数 ASCII のテキスト(show_data.txt)にリダイレクトする。コンソールにそのまま表示するとデータ量が多くおそらく固まるので必ずリダイレクトさせる。
ffprobe -v error -i img.png -show_packets -show_data > show_data.txt

チャプターをXML形式で出力する。
ffprobe -i input -show_chapters -of xml > chapters.xml

複数ファイルの処理に便利な右クリックメニューの「送る」に登録する。エクスプローラで「shell:sendto」を開いてバットファイルを置く。

for %%f in (%*) do (
  echo %%f
  ffprobe -v error -f lavfi -i movie=%%~xnf,scdet,metadata=select:key=lavfi.scd.score:value=10:function=greater -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.scd.score -of csv > %%~xnf.csv
)

レジストリを書き換えて右クリックのメニューに登録する。
windows – FFmpeg converting by a context menu entry – Super User
kachurovskiy/VideoContextMenu: Common ffmpeg actions in Windows Explorer context menu

ffmpegから標準入力する。適宜コピーするストリームを指定する。
ffmpeg -ss 10 -i input -t 10 -c copy -an -sn -dn -f nut - | ffprobe -f lavfi -i movie=pipe\\:0,idet -show_entries packet_tags=lavfi.idet.multiple.current_frame -of json > foo.json

HDRに関わるCLL、MDCVのメタデータを出力する。
ffprobe -v error -i input -show_frames -show_entries frame=side_data_list -read_intervals %+#1 -of json

公式ドキュメント : ffprobe Documentation
公式のWiki : FFprobeTips – FFmpeg

Continue reading “ffprobe の使い方”

ffmpeg 4.0 リリース

2018年11月2日 4.0.3 がリリースされた。アップデート内容は修正ばかりで新しいフィルタは入ってない。てっきり 4.1 が先にリリースするかと思ったがまだこなかった。

Changelog: update release version 4.0.3 – ffmpeg.git/commitdiff
git.videolan.org Git – ffmpeg.git/shortlog : n4.0.3

Continue reading “ffmpeg 4.0 リリース”

2018年3月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2018年からカテゴリタグの割合は今までと変わらないが、1枠30分の割合が少なくなったので来場者数とコメント数の6000以上を除かないすべての放送を対象にした。それに伴い平均値は除外した。来場者数はTS視聴可能時間が来れば増え、TS来場者数を含まずに計算することは困難な仕様なので、翌日(当日)の朝に前日の6時から当日の6時までを取得している。

全放送を対象にしたので改めて以前の放送のデータを使って調べ直している。

Continue reading “2018年3月のニコ生統計”

個別チャンネルの値を映像の場所毎に確認できる datascope

YUV(A) や RGB(A)、GRAY の数値を16進数で映像にオーバーレイして確認できるdatascopeフィルタの使い方。数値ではなく映像で表示するフィルタにhistogramフィルタがあるがdatascopeフィルタの方が直感的に任意の場所の数値が読み取れる。ただし表示できる範囲は全画面ではなく1px毎に表示されるので全体の変化を大まかに調べるのには向かない。

ffmpeg でヒストグラムを表示する

基本コマンド

ffplay input -vf datascope=s=1280x720:x=0:y=0:mode=0:axis=0

チャンネル数の数だけ 1px に表示される数が変わる。上から順番にチャンネルが割り振られる。チャンネルが増えるだけ表示できる解像度が狭くなる。

Continue reading “個別チャンネルの値を映像の場所毎に確認できる datascope”

ffmpeg で音楽CDをリップする libcdio の使い方

libcdio で手軽に音楽CDを再生したり、リッピングすることができるが、個別に時間指定しないとトラック毎にファイルが出力されないので他のプログラムと併用しないとあまり実用的ではない。

Zeranoe は非対応なので「お気に入りの動画を携帯で見よう」から保存する。
FFmpegダウンロード お気に入りの動画を携帯で見よう

Continue reading “ffmpeg で音楽CDをリップする libcdio の使い方”

ffplay で時間とフレーム数を表示する

drawtextフィルタを使って時間とフレーム数を表示する方法。ただしこの方法は固定フレームでしか使えない。30000/1001 などの部分を動画のフレーム数で指定する。表示される内容は左から秒時間、hms時間、フレーム数、フレーム数を5で割った余り、ピクチャータイプ

Continue reading “ffplay で時間とフレーム数を表示する”

2018年2月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2018年からカテゴリタグの割合は今までと変わらないが、1枠30分の割合が少なくなったので来場者数とコメント数の6000以上を除かないすべての放送を対象にした。それに伴い平均値は除外した。来場者数はTS視聴可能時間が来れば増え、TS来場者数を含まずに計算することは困難な仕様なので、翌日(当日)の朝に前日の6時から当日の6時までを取得している。

全放送を対象にしたので改めて以前の放送のデータを使って調べ直している。

Continue reading “2018年2月のニコ生統計”

新しい映像の品質評価 libvmaf

Netflixが使っているエンコードされる前と後の動画の品質評価に使われている VMAF(Video Multimethod Assessment Fusion)スコアをffmpegで調べる。以前の記事に異なる解像度でも調べられると書いていたが間違いである。同じ解像度でないと調べられない。対応サブサンプリングは4:2:0、4:2:2、4:4:4になり、エンコード前後でピクセルフォーマットが異なるときは21入力目の参照元のファイルのピクセルフォーマットに変換される。外部ライブラリフィルタなので別途インストールが必要で--enable-libvmafを付ける。--enable-version3つけなくてもよくなった。vmaf v2.0.0以降をリンクしたffmpegではn_threadsでスレッド数を指定しないと処理速度が上がらない。

2022年1月24日のコミットでlibvmaf v2.0.0に対応しオプション指定を刷新した。`compute_vmaf()` is deprecated and will be removedのエラーは出なくなり、複数モデルのスコアを同時に調べられるようになっている。

Dynamic optimizer — a perceptual video encoding optimization framework | by Netflix Technology Blog | Netflix TechBlogより。

3. It relies on existing image quality metrics (VIF, DLM), properly modified to cover multiple scales of resolution, as well as the amount of motion between consecutive video frames in a video sequence as features that are input in a machine-learned set of weights. The final score is the result of combining these elementary features in a support vector machine (SVM) regressor.
3. VMAFは、既存の画質評価指標(VIF、DLM)を、複数の解像度に対応するように適切に修正したものと、連続するフレーム間の動きの量を、機械学習した重みをセットに入力する特徴を利用している。最終的なスコアは、これらの初歩的な特徴をサポートベクターマシン(SVM)の回帰分析と組み合わせた結果になる。

Continue reading “新しい映像の品質評価 libvmaf”

情熱のある番組の配信形式が変わる

今週の放送分から brightcove から boltdns に代わり master.m3u8 だと低ビットレートの 1080p になるのでこれを 720p に変更する。ダウンローダは youtube-dl と ffmpeg を使い2つとも同じフォルダに置いておく。-Fで調べたフォーマットを-fで指定する。音声フォーマットは 3つあるが、上から順にビットレートが 64k, 96k, 128k になるので3番目を指定する。master.m3u8 の調べ方は F12 で開発ツールを開き F5 でリロードし、動画を再生し、ネットワークタブに mas を入力すると master.m3u8 が見つかる。

youtube-dl: Download Page
Download FFmpeg

フォーマットの調べ方
youtube-dl "master.m3u8 の URL" -F

調べたフォーマットを-fで複数指定して保存する
youtube-dl "master.m3u8 の URL" -f 2005+audio-2-en__Main_ -o "output.mp4"

ffmpeg 単体のコマンド例
ffmpeg -i "master.m3u8 の URL" -map 0:5 -map 0:4 -c copy "output.mp4"
ffmpeg -i "master.m3u8 の URL" -map p:2 -c copy "output.mp4"

追記 2018年6月13日
放送局のサイトよりも GYAO! のほうがビットレートが高く、手軽だった。

自炊マンガの色補正

白くなるところが真っ白になってなかったり、黒になるところが真っ黒になってないところを ffmpeg で補正する。方法はコントラストを上げて白はより白く、黒はより黒くする。今回は白黒ページの色補正だけでリサイズ(解像度を変える)、クロップ(指定範囲で切り取る)、デノイズは行わない。

自炊したときに JPG(PNG、BMP、TIFFでも可能)で出力したときに使える方法であり、PDFは ffmpeg では扱えない。一般的に Photoshop や GIMP を使う方法がよく紹介されているが、これらは一度 RGB にデコードして再度JPG出力するときに YUV に変換するので処理が遅くなりがちであるが、以下の方法は RGB 変換を挟まないので処理が早い。

Continue reading “自炊マンガの色補正”