音声のダイナミックレンジを調べる drmeter

14以上ならレンジがとても広く、8 以上 14 未満 までは普通で、8 未満はレンジが狭いとされている。

基本コマンド

ffmpeg -i input -vn -af drmeter=length=3 -f null -

表示ログの例

[Parsed_drmeter_0 @ 0000000000486580] Channel 1: DR: 12.6
[Parsed_drmeter_0 @ 0000000000486580] Channel 2: DR: 12.9
[Parsed_drmeter_0 @ 0000000000486580] Overall DR: 12.7

公式ドキュメント:FFmpeg Filters Documentation : drmeter

オプション

length[double]
何秒単位で解析するかの設定
既定値:3
範囲:0.01 から 10 まで

可変フレームを検出する vfrdet

可変フレームか固定フレームかを調べることが出来る vfrdet フィルタ。コンソールには総フレーム数と可変フレーム数、 pts 間隔の最大値最小値が表示される。

基本コマンド

ffmpeg -i input -an -vf vfrdet -f null -

表示ログの例

固定フレームなら右に総フレーム数、左に可変フレーム数。

[Parsed_vfrdet_0 @ 000000000295fe80] VFR:0.000000 (0/34046)

可変フレームなら右に総フレーム数とは限らず、左に可変フレーム数かもよく分からない。pts 間隔の最大値最小値。

[Parsed_vfrdet_0 @ 00000000004e7f80] VFR:0.641629 (89787/50149) min: 0 max: 35)

公式ドキュメント:FFmpeg Filters Documentation : vfrdet

pts 間隔を調べるには ffprobe で調べる方法と、mkvtimestamp_v2 で調べる方法があるが、2つの方法が一致するとも限らない。

ffprobe
ffprobe -v error -i input -select_streams v:0 -show_entries packet=pts_time > pts_time.txt

mkvtimestamp_v2
ffmpeg -i input -an -f mkvtimestamp_v2 mkvtimestamp_v2.txt

ffprobe の使い方

動画や音声、画像ファイルを調べるのに ffmpeg で表示される以上のことを調べるときに使う ffprobe の使い方。grep, awk などから正規表現を使って必要なデータを取る方法もあるが、今回はそうでなくオプションを指定して必要なデータを表示する方法を紹介する。出力フォーマット指定ができるので json, xml からパースすれば正規表現で無理に取る必要はない。

ffprobe では vf, af, filter_complex が使えないので lavfi デバイスで読み込み、そこからフィルタを使う。よって映像は rawvideo、音声は pcm_f32le になり元データとは異なるのに注意。

基本コマンド

オプションを何も付けなければ 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

解像度を表示する。
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

コンソールに pkt_pts_time,pict_type だけを表示する。
ffprobe -v error -i input -select_streams v -show_frames -show_entries frame=pkt_pts_time,pict_type -of csv=p=0

パケット毎の 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

pts_time と signalstats フィルタから 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

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

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

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

Continue reading “ffprobe の使い方”

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 で調べる。以前の記事に異なる解像度でも調べられると書いていたが間違いである。同じ解像度でないと調べられない。対応フォーマットは yuv420p, yuv422p, yuv444p, yuv420p10le, yuv422p10le, yuv444p10le になる。外部ライブラリフィルタなので別途インストールが必要である。しかし現在のところ Windows 環境ではおそらくリンクできていない。–disable-w32threads または –enable-pthreads と、–enable-libvmaf を付けるとリンクできる。

現在 ffmpeg 向けには libvmaf v1.3.4 でしか使えないので最新版は使わない。
FFmpeg VMAF v1.3.5 – Segfault · Issue #177 · Netflix/vmaf

Netflix/vmaf at v1.3.4

Linux 向けのバイナリは以下から保存できる。
FFmpeg Static Builds

Window 向けには以下のスクリプトでリンクできる。しかしライブラリのバージョンアップにより頻繁にその影響で途中エラーになる(build フォルダの該当ライブラリを一度削除してインストールし直す)ので極力不要ライブラリはリンクしない方がよい。また 32bit の ffmpeg ではリンクできない。

2018年7月現在このスクリプトで libvmaf を有効するには build/media-suite_compile.sh の https://github.com/Netflix/vmaf.git#tag=v1.3.5 を https://github.com/Netflix/vmaf.git#tag=v1.3.4 に書き換える必要がある。
jb-alvarado/media-autobuild_suite: This Windows Batchscript is for setup a compiler environment for building ffmpeg and other media tools under Windows.

/build/ffmpeg_options.txt は
–enable-libvmaf だけ残し、
/build/mpv_options.txt は
すべて削除して空欄にし、 media-autobuild_suite.ini は以下のようにする。おそらく PC、ネット回線にもよるが1時間あれば Windows 向けのバイナリができあがる。

2つの映像の画質評価をする psnr
2つの映像の画質評価をする ssim
新しい映像の動きの評価 vmafmotion

VMAF の解説記事

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