Netflixが使っているエンコードされる前と後の動画の品質評価に使われている VMAF(Video Multimethod Assessment Fusion)スコアをffmpegで調べる。以前の記事に異なる解像度でも調べられると書いていたが間違いである。同じ解像度でないと調べられない。対応フォーマットは yuv420p、yuv422p、yuv444p、yuv420p10le、yuv422p10le、yuv444p10leになる。外部ライブラリフィルタなので別途インストールが必要で--enable-libvmafを付ける。--enable-version3つけなくてもよくなった。vmaf v2.0.0以降をリンクしたffmpegではn_threadsでスレッド数を指定しないと処理速度が上がらない。

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)の回帰分析と組み合わせた結果になる。

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

2018年8月11日、v1.3.9 対応のコミットが追加された。これに伴いマルチスレッド対応で高速になり、v1.3.4を使う必要がなくなった。

Windows用にはGyan ffmpegで配布している。
FFmpeg Windows Builds – gyan.dev

Linux用は以下で配布している。
FFmpeg Static Builds

モデルデータはGithubで配布している。
vmaf/model at master · Netflix/vmaf

VapourSynthで使う場合。
VMAF – Video Multi-Method Assessment Fusion – Doom9’s Forum
HomeOfVapourSynthEvolution/VapourSynth-VMAF: Video Multi-Method Assessment Fusion

基本コマンド

従来の画質評価をするssim, psnrフィルタと違って、入力するファイルの順番が異なるのに注意。VMAFスコアを調べるのが最初に入力する動画でなければならない。
ffmpeg -i 調べたい動画 -i 元の動画 -filter_complex libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4 -an -f null -

コンテナフォーマットが異なる、例えばMP4とMKVなどを比較する。
ffmpeg -i encoded.mp4 -i original.mkv -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -f null -

最終的な品質評価になる VMAFスコアは 100 が最高画質。配信向けには 80 程度を目標とするビットレートになるようにする(下の運用方法を参照)。ログファイルに書いてある adm2, vif_scalex スコアは VMAFスコアの元となり 0(最低画質)から 1(最高画質)。motion2 は 0(動かない映像)から 20(ものすごく動く映像)。

解像度が同じでオプションを明記する場合。
ffmpeg -i encoded.mp4 -i original.mp4 -filter_complex "libvmaf=model_path=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:enable_transform=0:phone_model=0:psnr=0:ssim=0:ms_ssim=0:pool=mean:n_threads=4" -an -f null -
ffmpeg -i encoded.mp4 -i original.mp4 -filter_complex "libvmaf=vmaf_v0.6.1.json:log.xml:xml:0:0:0:0:0:mean:4" -an -f null -

YUVの動画を比較する場合。動画はMP4などの圧縮した形式と、展開したYUVの形式とでは処理速度に大きな変化は見られなかった。
ffmpeg -video_size 1280x720 -pixel_format yuv420p -framerate 30 -i encoded.yuv -video_size 1280x720 -pixel_format yuv420p -framerate 30 -i original.yuv -filter_complex libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4 -an -f null -

エンコードが終わるとコンソールの最後に以下のような結果が表示される。ログファイルで出力する場合はフレーム毎に指定オプション内容が出力される。Exec FPS は処理速度。

Exec FPS: 4.940972
VMAF score = 96.147066

解像度が異なる場合

解像度が異なる VMAFスコアを調べるには、調べたい動画をフィルタでオリジナルの解像度にリサイズしてから調べる。

リサイズする前が 1920×1080、リサイズした後が 1280×720 で、scaleフィルタを使う。VMAFスコアを調べるのに縮小リサイズしたときのアルゴリズムと一致させなくてもよい。
ffmpeg -i original-1080p.mp4 -filter_complex scale=1280:720:flags=spline -c:a copy resized-720p.mp4
ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex "scale=1920:1080:flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -f null -

scale2refフィルタを使うと解像度指定しなくても揃えられる。
ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex "[0:v][1:v]scale2ref=flags=bicubic[0v][1v];[0v][1v]libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -f null -
ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex "scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -f null -

PTSも揃える。
ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref=flags=bicubic[0v][1v];[0v][1v]libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -f null -
ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -f null -

比較する動画の解像度に合わせる scale2ref

解像度については以下の(Computing VMAF at the Right Resolution、Picking An Upsampling Algorithm、Interpreting VMAF Score When Resolution Is Not 1080p)を参照。

VMAF: The Journey Continues – Netflix TechBlog – Medium

要約すると、vmaf_v0.6.1の学習モデルは1080pを使いそれ以外の解像度を参照するとVMAFスコアが一層高くなり。またエンコード前の映像が1080p未満でさらに縮小リサイズしたときも同様にVMAFスコアが高くなる。

元の映像が1080pではないときはscaleフィルタで1080pに変更することでモデルに合わせた評価になる。

ffmpeg -i resized-576p.mp4 -i original-720p.mp4 -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS,scale=-2:1080:flags=bicubic[1v];[0v][1v]scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -f null -

動画時間が異なる場合

2ファイル入力するフィルタの挙動設定 framesyncに対応しているのでエンコード後の動画がオリジナルよりも後の時間が短い場合はオプションにshortest=1:repeatlast=0を追加すると短い方で終了する。

ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4:shortest=1:repeatlast=0" -an -f null -

動画時間よりも先に出力を停止するなら出力オプションの-tを使う。コマンドは100秒で出力を止める例。任意のフレーム数なら-vframesを指定する。
ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -t 100 -f null -

中断して途中からやり直す場合

PCを終了させるなど処理を中断したときに途中からやり直す方法。フレームぴったりに開始するにはtrimフィルタを使って中断したフレームまでデコードし直してから再開する。開始フレーム位置は正常終了させて出力したvmafのログファイルを見て、Frameの最後の行と同じ値を指定する。すると再開後の最初のフレームが中断前と一致するのでこの行だけ削除して以降のフレームを残す。Frameの値がリセットされるので表計算ソフトなどで振り直す。

ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex "[0:v]trim=start_frame=50246,setpts=PTS-STARTPTS,settb=1/AVTB[0v];[1:v]trim=start_frame=50246,setpts=PTS-STARTPTS,settb=1/AVTB[1v];[0v][1v]scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4" -an -f null -

trim フィルタの使い方

エンコードと並列してvmafフィルタも使う場合

teeでファイル出力と標準出力に分割して、改めてエンコードしているファイルを標準入力する。Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)のエラーが出るのでnut入力の前に-thread_queue_sizeを指定している。

ffmpeg -i input -map 0 -c:v libx264 -an -flags +global_header -f tee "output.mp4|[f=nut]pipe:" | ffmpeg -thread_queue_size 1024 -i pipe: -i input -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=log.xml:log_fmt=xml:n_threads=4:n_subsample=1:phone_model=0:psnr=0:ssim=0:ms_ssim=0:shortest=1:repeatlast=0" -f null -

1つの出力内容を複数に振り分ける tee

リサイズアルゴリズムの注意点

-sでのリサイズと、-vfscaleフィルタを使い-flagsを指定しない場合はbicubicが使われるが、-filter_complexscaleフィルタを使い-flagsを指定しない場合はbilinearが使われて、-vf, -filter_complexで使われるアルゴリズムが異なるのに注意する。拡大リサイズするときにリサイズ品質が高いほどよいとは限らないとされているので一般的なbicubicが勧められている。

(Picking An Upsampling Algorithm)を参照
VMAF: The Journey Continues – Netflix TechBlog – Medium

リサイズする scale
Zライブラリを使ったリサイズフィルタ zscale

モデル名の変更

2020年11月22日からモデルの名前が変わっている。
vmaf/model at master · Netflix/vmaf
Feature/rename integer models by li-zhi · Pull Request #722 · Netflix/vmaf

v2.0.0よりfloatモデルへ

モデル名の変更に続いてfloatモデルが公開されたがffmpegはまだ対応していないので使えない。さらに処理スレッドのn_threadsが自動設定ではなくなったので適宜スレッド数を指定する。

ffmpeg support for v2.0 API and Homebrew · Issue #753 · Netflix/vmaf

gyan FFmpegBtbN FFmpegともにffmpeg 4.4時点ではfloatモデルでも`compute_vmaf()` is deprecated and will be removedのエラーはでるがvmaf計算自体はできるようになっていた。floatモデルは精度は高いが処理は遅く、通常のモデルは精度は低くくなるが処理は速い。

ffmpeg -f lavfi -i testsrc2=d=1:s=1920x1080 -filter_complex split[1],scale=1280:720[0v];[0v][1]scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1.json:log_path=def.xml:log_fmt=xml:n_threads=1 -f null -
VMAF score: 82.599982

ffmpeg -f lavfi -i testsrc2=d=1:s=1920x1080 -filter_complex split[1],scale=1280:720[0v];[0v][1]scale2ref=flags=bicubic,libvmaf=vmaf_float_v0.6.1.json:log_path=float_def.xml:log_fmt=xml:n_threads=1 -f null -
VMAF score: 82.611668

ffmpeg -f lavfi -i testsrc2=d=1:s=1920x1080 -filter_complex split[1],scale=1280:720[0v];[0v][1]scale2ref=flags=bicubic,libvmaf=vmaf_v0.6.1neg.json:log_path=def_neg.xml:log_fmt=xml:n_threads=1 -f null -
VMAF score: 81.817564

ffmpeg -f lavfi -i testsrc2=d=1:s=1920x1080 -filter_complex split[1],scale=1280:720[0v];[0v][1]scale2ref=flags=bicubic,libvmaf=vmaf_float_v0.6.1neg.json:log_path=float_neg.xml:log_fmt=xml:n_threads=1 -f null -
VMAF score: 81.843339

ffmpeg -f lavfi -i testsrc2=d=1:s=3840x2160 -filter_complex split[1],scale=1280:720[0v];[0v][1]scale2ref=flags=bicubic,libvmaf=vmaf_float_4k_v0.6.1.json:log_path=float_4k.xml:log_fmt=xml:n_threads=1 -f null -
VMAF score: 71.844223

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

オプション

調べる内容を増やすほど処理速度が遅くなる。

  • model_path[string]
    SVM(Support Vector Machines)で使われるモデルのパス指定。配布バイナリのffmpegを使う場合にはvmaf_v0.6.1.jsonをffmpegと同じ場所に置いておくのが楽。2021年以降のバージョンは.pklの代わりに.jsonを読み込む。4Kモデルのvmaf_4k_v0.6.1は4Kテレビで画面の高さの1.5倍の距離から見たときの主観的な品質を予測し、4K映像をリサイズせずにエンコードしたのを評価するときに使う。参照。NEG(No Enhancement Gain)モデルは純粋に圧縮利得を評価するのに使い、通常のモデルはフィルタや特定のコーデックでエンコードしたのを含めて評価する。floatモデルは精度は高いが処理は遅く、通常のモデルは精度は低くいが処理は速い。NEGモデルについての参照。パス指定について参照
    既定値:”vmaf_v0.6.1.json”(インストールされているパス)
    Windowsの指定例:model_path=”D\\:/mypath/vmaf_v0.6.1.json”
  • log_path[string]
    出力されるログファイルのパス指定。拡張子はlog_fmtと同じのを指定する
    既定値:無指定(指定するとフレーム毎のログファイルが出力される)
  • log_fmt[string]
    ログファイルのフォーマット指定。csvjsonxmlが指定できる
    既定値:xml
  • enable_transform[boolean]
    VMAFスコアの計算で transform を有効にする
    同一ファイルの VMAFスコアが 100 になる。有効にしないと 100 にならない
    既定値:0
  • phone_model[boolean]
    電話モデルを呼び出してノートPCやTVに適した通常より高い VMAFスコアを計算する。携帯電話などのモバイル端末は画面サイズが大きくなく視聴距離が近いためにビットレートを高くしてもそれほど高画質に見えないからである。モバイル向けのSD解像度に使うとよいかもしれない。適宜視聴環境に合わせて有効にする。詳細は ここを参照
    既定値:0(ノートPC、TV向け)
  • psnr[boolean]
    psnr も一緒に計算する。60 が最高画質
    既定値:0
  • ssim[boolean]
    ssim も一緒に計算する。1 が最高画質
    既定値:0
  • ms_ssim[boolean]
    ms_ssim も一緒に計算する。1 が最高画質
    既定値:0
  • pool[string]
    VMAFスコアの計算方法。mean、min、harmonic_mean(調和平均)が指定できる
    既定値:”mean”
  • n_threads[int]
    VMAFスコアを計算するのに使うスレッド数の指定
    既定値:0(自動設定、v2.0.0以降は手動指定
    範囲:0 から UINT32_MAX まで
  • n_subsample[int]
    VMAFスコアを計算するのに使うフレームサブサンプリング間隔の指定。1より大きな値はそれだけ解析を間引くので処理速度が速くなるが正確さとのトレードオフになる。ログファイルのFrameは元のフレーム順になっているので間引く前後のフレーム位置で迷うことはない
    既定値:1
    範囲:1 から UINT32_MAX まで
  • enable_conf_interval[boolean]
    信頼区間を有効にする
    既定値:0

enable_transformの挙動について

ffmpeg -f lavfi -i color=s=32x32:d=1 -filter_complex split,libvmaf=vmaf_v0.6.1.json:enable_transform=0 -an -f null -
Exec FPS: 694.752857
VMAF score: 96.616337
ffmpeg -f lavfi -i color=s=32x32:d=1 -filter_complex split,libvmaf=vmaf_v0.6.1.json:enable_transform=1 -an -f null -
Exec FPS: 574.159669
VMAF score = 100.000000

VMAFの解説記事

運用方法

Download Handout: Fine-Tuning Adaptive Group With Objective Quality Metrics – Streaming Learning Centerから
http://streaminglearningcenter.com/wp-content/uploads/2018/11/Objective_Quality_Metrics_2018.pdf より、スコアが93あれば2DとVR用の映像では元映像と区別が付かないとされる。

The results indicate that if a video service operator were to encode video to achieve a VMAF score of about 93 then they would be confident of optimally serving the vast majority of their audience with content that is either indistinguishable from original or with noticeable but not annoying distortion

引用元PDF:https://www.realnetworks.com/sites/default/files/vmaf_reproducibility_ieee.pdf

ビットレートを少しづつ下げつつ、解像度も下げたときに高解像度と低解像度のスコアが逆転する低解像度のビットレートを最適値とする方法。ただしこの方法をとると一番大きい解像度のビットレートが決められない。また実写とアニメ映像とでは必要ビットレートも変わってくる。

netflix_vmaf_approach

Tying Metrics to Predicted Subjective Ratings
MOS PSNR SSIM SSIMplus VMAF
Scoring 1-5 0-100 0-1 0-100 0-100
No artifact threshold NA 45dB 0.99 100 93
Artifacts present NA 35dB 0.5 NA NA
Excellent 5 45+ 0.99+ 80-100 80-100
Good 4 38 .95-.99 60-80 60-80
Fair 3 30 .88-.98 40-60 40-60
Poor 2 24 .50-.88 20-40 20-40
Bad 1 <15 <.5 <20 <20
Just noticeable difference NA NA NA NA 6
Device ratings No No No Multpile Standard, Phone, 4K
Ownership Open source Open source Open source Proprietary Open source

vifだけを計算する場合

ffmpeg 4.4から使える予定のフィルタにvifがある。こちらもlibvmafフィルタと同様に処理が遅いがlibvmafのリンクが必要ないので手軽に使える。2つの映像は同じ解像度、ピクセルフォーマットでなければならない。メタデータに出力できるのでffprobe連携しやすい。

ffprobe の使い方
Visual Information Fidelity – Wikipedia

オプション設定はなし。出力値は0から1までの小数。framesyncに非対応なので動画時間は揃える必要がある。
ffmpeg -i 調べたい動画 -i 元の動画 -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref=flags=bicubic,vif" -an -f null -

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

メタデータ出力内容。

  • lavfi.vif.scale.0
  • lavfi.vif.scale.1
  • lavfi.vif.scale.2
  • lavfi.vif.scale.3

ffprobe連携例。出力時間は-read_intervalsで指定。
ffprobe -f lavfi -i movie=enc.mp4,settb=1/AVTB,setpts=PTS-STARTPTS[0];movie=orig.mp4,settb=1/AVTB,setpts=PTS-STARTPTS[1];[0][1]scale2ref=flags=bicubic,vif -show_entries packet_tags=lavfi.vif.scale.0 -read_intervals "%1" > vif.scale.0.txt

追記
コメントで指摘のあった部分を追記修正。2018年3月13日
media-autobuild_suiteで有効化できないのに言及。2018年7月12日、2018年7月13日
v1.3.9に対応。2018年8月12日
運用方法を追加。2019年1月26日
リサイズの説明を追記。2019年12月2日
Zeranoeで対応バイナリ配布開始。2020年4月30日
scale2refフィルタの利用例を追加。2020年7月19日
モデル名の変更に言及。scale2refフィルタの入力順を訂正。2020年12月27日
モデルファイルの形式を.pklから.jsonに変更。2021年1月5日
n_threadsに言及。2021年2月13日
動画時間が異なる場合の項目を追加。2021年3月5日
中断して途中からやり直す場合の項目を追加。2021年3月15日
vifフィルタの項目を追加。2021年3月21日
NEG、floatモデルに言及。2021年6月23日
エンコードと並列してVMAFフィルタも使う項目を追加。2021年7月30日

7 thoughts on “新しい映像の品質評価 libvmaf

  • Tac

    色々と参考にさせていただいております。ありがとうございます。
    最近libvmafを試していたので、いくつかコメントします。
    間違いなどあったらすみません。

    ●以下の自動ビルドスクリプトでlibvmafを有効にしたWindows用のffmpegバイナリがビルドできました。
      https://github.com/jb-alvarado/media-autobuild_suite
     VMAFが使いたかっただけなので、”Choose ffmpeg and mpv optional libs: “で
     1(Yes)を選び、ffmpeg_options.txtで–enable-avisynthと–enable-libvmafだけ残し、
     他はdisableにしたり消したりして最低限にしたのですが、
     mpv_options.txtの方も不要なものはここでちゃんと無効にしておかないと、
     mpvのビルドをNoにした場合でもmpv用ライブラリをビルドしにいってしまい
     無駄に時間がかかってしまうので注意。
     ビルドしたのは3/5で、各コミットは以下のとおりです。
      media-autobuild_suite r2654 5f3980c4def9d3a818b94b5cc4eb514ad078f0cb
      ffmpeg 69995a94d8409a704361dce9bc16ede7f88bdf1a
      vmaf r683 7426b6fb090b5754bad0c6c428d7dbc2303d980c

    ●libvmafは現状ではpthread依存のようで、ffmpegに–disable-w32threadsが必要なようですが、
     Zeranoe氏はpthreadだと遅くなるということで避けたいらしく、
     当面はlibvmafはZeranoe版バイナリには入らない模様です。
      https://ffmpeg.zeranoe.com/forum/viewtopic.php?p=13039#p13039

    ●i7-4702MQで1080p/2157framesのSSIMやVMAFを計算させると
     -lavfi ssimなら150fps出るのに、-lavfi libvmafは2.8fpsしか出ませんでした。
     また、ssimでは実行中のメモリ使用量も200MB以下なのですが、
     libvmafでは最大6GBくらいになってかなり重くなりました・・・。
     バグなのか仕様なのかビルドの問題なのか不明ですが
     もうちょっと軽く動くようになると嬉しいですね。

    ●VMAFは基本的にオリジナルソース(=reference)を固定した上で、それを元にして
     リサイズやエンコードした複数の配信用ファイル(=distorted,main)のVMAFスコアを測り、
      「同じビットレートならどれが一番VMAFスコアが高いか」
     を調べて、最適な配信用ファイルを決めるといった形で使うものだと思います。

    ●したがって、リサイズしたもののVMAFスコアを測る場合は、
     リサイズしたものをオリジナル解像度に戻した上で
     VMAFスコアを測るのが一般的ではないかと思います。
     コマンド的には
      ffmpeg -i resized720p_x265_2000kbps.mp4 -i original1080p.mp4 -filter_complex scale=1920:1080:flags=print_info+lanczos,libvmaf=model_path=model/vmaf_v0.6.1.pkl -an -f null –
     といった形の方が順序的にも意味的にもわかりやすいのではないかと思います。

    ●YUVの動画比較のところでoriginal.yuvとreference.yuvという
     表現(どちらもオリジナルを指す)が混在してしまっているので、
      original.yuv → encoded.yuv
      reference.yuv → original.yuv
     といった表現に変えるとわかりやすくなると思います。
     (referenceって一般的にはあまりなじみが無い表現かなーと)

    ●enable_transformは、「transformを計算する」というより
      「VMAFスコアの計算でtransformを有効にする」
     という説明の方がよいかと思います。
     (どういう処理なのかは自分もよくわかってないですが
      同一ファイルのVMAFスコアが100.0になったりするようです。)

    ●poolの harmonic mean の指定は harmonic_mean のようです。

  • Tac

    メモリリークの情報と更新ありがとうございます。
    メモリリークの件は調べていませんでした。

    ●修正後の記事のリサイズの部分ですが、
      ・「リサイズする場合」というタイトルは「解像度が異なる場合」が良いかも。
      ・VMAF計測時のリサイズアルゴリズムは特に縮小時と同じにする必要はなく
       好きなもの(視聴時に期待できるもの)を選択すればよい。
       (高性能なアルゴリズムにすればスコアも上がる)
      ・エンコードする前の動画(オリジナル)をリサイズするのではなく、
       エンコード後の動画をオリジナルサイズにあわせてリサイズする。
      ・VMAF計測時のコマンドでscaleの引数が1280:720になっているが1920:1080のはず。
       (このままだと解像度違いでエラーになる)
     ということで、以下のような感じが良いかもしれません。
     (splineとlanczosにしているのはなんとなくです)

    ——————————————————————–
    解像度が異なる場合

    解像度が異なる場合に VMAF スコアを調べるには、調べたい動画をフィルタでオリジナルの解像度にリサイズしてから調べればよい。

    オリジナルが 1920 x 1080、エンコード後が 1280 x 720 の場合。

    ffmpeg -i original-1080p.mp4 -filter_complex scale=1280:720:flags=spline -acodec copy resized-720p.mp4

    ffmpeg -i resized-720p.mp4 -i original-1080p.mp4 -filter_complex “scale=1920:1080:flags=lanczos,libvmaf” -an -f null –
    ——————————————————————–

    ●SSIMとは違って [encoded][original] と [original][encoded] の結果が異なるので、
     「順序は必ず “-i 調べたい動画 -i オリジナル” にする必要がある」という注意書きもあると良いかなと思いました。

    • admin

      コメント確認しました。スレッドも確認しましたが HEVC の100倍遅いと言われている AV1 ですがそれどころじゃないくらい遅くて今のところ全く実用的ではないですね。

       AV1(libaom-av1)で1920×1080の10フレームだけをエンコードしてみた結果。http://mevius.5ch.net/test/read.cgi/avi/1515759816/378

       他のエンコーダとの速度比較などhttp://mevius.5ch.net/test/read.cgi/avi/1515759816/392

      • Tac

        AV1はまだ最適化もされてませんから遅すぎてテストもままならないですね・・・。
        なおZeranoe版ffmpegではlibaomのビルドミスがあり、
        ffmpeg-20180404-53688b6までは本来よりも更に遅い結果(最大で5.7倍くらい)となります。
        そのため検証するならそれ以降のビルド(このコメントを書いている時点ではまだ未リリース)を使う必要があります。
         https://ffmpeg.zeranoe.com/forum/viewtopic.php?f=5&t=5601#p13513

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)