この記事でわかること

  • VMAFとは何か、なぜ使うのか
  • FFmpegで libvmaf フィルタを使う方法
  • PSNR・SSIMとの比較
  • VMAFスコアの読み方と目安
  • エンコード設定のチューニングへの活用

動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 5 件を検証スクリプトで実行し、全て成功しました(2026-09-06) 対象 OS: Windows / macOS / Linux(libvmaf ライブラリが必要)


VMAFとは

**VMAF(Video Multi-Method Assessment Fusion)**はNetflixが開発した動画品質指標です。従来のPSNRやSSIMよりも人間の主観的評価と高い相関を示します。

指標 方式 特徴
PSNR ピクセル誤差ベース 計算が簡単だが人間の知覚と相関が低い
SSIM 構造的類似度 PSNRより良いが限界がある
VMAF 機械学習モデル 人間の主観評価に最も近い

VMAFはモデルに基づく画質の推定値です。通常は0〜100の範囲で扱いますが、100点は画素の完全一致を証明せず、特定の点数を一律の放送品質基準にはできません。モデルや視聴条件も関係します。Netflixの公式FAQは、同じ動画同士でも100点を保証しないと説明しています。


実測:VMAF は PSNR・SSIM と逆の順位をつける

VMAF を使う理由は「PSNR や SSIM が人間の見え方と食い違うから」です。実際に測ると、はっきり逆転します。

測定環境: Intel Core i9-14900KF / RTX 4090 / FFmpeg 8.1 / 素材 Big Buck Bunny 1080p30 10秒 24.6Mbps(© Blender Foundation, CC BY 3.0)/ 2026-08-28 測定

加工(すべて H.264 CRF 23) サイズ PSNR (dB) SSIM VMAF
加工なし 7.12 MB 40.50 0.9749 93.29
わずかにぼかす(gblur=sigma=0.8 4.40 MB 35.32 0.9370 73.57
粒状ノイズを加える(noise=alls=12 55.89 MB 34.09 0.8537 88.41

PSNR と SSIM はどちらも「ノイズの方が劣化が大きい」と判定します。VMAF は正反対で、ぼけの方がはるかに悪いと判定します(73.57 対 88.41)。人間の目は失われた細部に厳しく、残っている粒状感には寛容だからです。PSNR や SSIM だけを見て設定を選ぶと、ぼけた映像を「良い」と誤判定しかねません。

ついでに読み取れる実務的な事実として、ノイズ入りは 55.89MB と元の 29.3MB より大きくなりました。ランダムなノイズは圧縮が効かずビットレートを浪費します。逆にぼかした版は 4.40MB と最小ですが品質は最悪です。「小さくなった=うまく圧縮できた」ではないことが数字で確認できます。

CRF と VMAF の対応(この素材での実測)

CRF サイズ VMAF
18 15.51 MB 96.01
23 7.12 MB 93.29
28 3.38 MB 87.83
32 1.96 MB 79.70
36 1.19 MB 66.97

アニメーション素材での測定値です。実写では同じ CRF でもファイルは大きく、VMAF は低めに出る傾向があります。傾向を掴むための表として読んでください。


libvmafの前提条件

libvmaf フィルタを使うにはFFmpegが libvmaf 対応でビルドされている必要があります:

ffmpeg -filters | grep vmaf

libvmaf が表示されれば対応済みです。何も出力されなければ、そのFFmpegでは以降のコマンドは一切動きません。

apt install ffmpeg では動きません(実測)

これは多くの記事が取り違えている点です。Ubuntu / Debian の apt 版FFmpegは libvmaf 無効でビルドされています。

本サイトのCI(GitHub Actions の Ubuntu ランナー)で apt-get install ffmpeg を実行し、そのまま ffmpeg -version を取った1行目がこれです。

ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers

続く configuration: 行には --enable-libx264--enable-libx265--enable-libvidstab もありますが、--enable-libvmaf は1つも現れません。自分の環境で同じ確認をするならこうです。

ffmpeg -version | grep -o -- "--enable-libvmaf"

何も出力されなければ、そのビルドに libvmaf は入っていません。実際、上記の CI 実行(Ubuntu 24.04 の apt 版 6.1.1-3ubuntu5)ではこの出力は空で、本記事の VMAF コマンドは CI ではスキップ扱いになっています。

そのため ffmpeg -filters | grep vmaf も空を返し、libvmaf を使ったコマンドは No such filter で落ちます。

sudo apt install libvmaf-dev を追加しても解決しません。これはライブラリ側の開発用ヘッダを入れるパッケージで、すでにビルド済みのFFmpegバイナリには何の影響も与えないからです。ここを勘違いすると延々ハマります。

実際に動かす方法

ffmpeg -filters | grep vmaf が空だった場合の選択肢は3つです。

方法 内容
静的ビルドを使う(最短) BtbN/FFmpeg-BuildsJohn Van Sickle 版 の full ビルドを展開して使う。ディストリのFFmpegは残したままでよい
自分でビルドする libvmaf をインストールした上で ./configure --enable-libvmaf --enable-version3
Docker を使う jrottenberg/ffmpeg などの full イメージ

Windows の gyan.devfull ビルドには最初から含まれています(本記事の実測はこのビルド、FFmpeg 8.1 で行っています)。essentials ビルドには含まれないので注意してください。

どの方法でも、導入後にもう一度 ffmpeg -filters | grep vmaf を実行して表示を確認するのが確実です。


libvmaf フィルタの基本コマンド

重要:libvmaf は参照動画(オリジナル)と歪み動画(エンコード後)の2つの入力が必要です。

# libvmafは参照動画と比較動画の2入力が必要です
# このコマンドはlibvmaf対応のFFmpegビルドが必要です
ffmpeg -i distorted.mp4 -i reference.mp4 \
  -filter_complex "[0:v][1:v]libvmaf" \
  -f null /dev/null
  • distorted.mp4:エンコード後(比較対象)の動画
  • reference.mp4:元の高品質動画(参照)
  • -f null /dev/null:出力ファイル不要(スコアのみ表示)

JSONレポートを保存する

# VMAFスコアをJSONファイルに保存する例
ffmpeg -i distorted.mp4 -i reference.mp4 \
  -filter_complex "[0:v][1:v]libvmaf=log_fmt=json:log_path=vmaf_result.json" \
  -f null /dev/null

PSNR・SSIMと同時に計算する

# VMAF + PSNR + SSIM を同時に計算する例
ffmpeg -i distorted.mp4 -i reference.mp4 \
  -filter_complex "[0:v][1:v]libvmaf=feature=name=psnr|name=float_ssim:log_fmt=json:log_path=metrics.json" \
  -f null /dev/null

name=ssim ではなく name=float_ssim です。 直感に反しますが、name=ssim を指定すると problem during vmaf_use_feature: ssim で落ちます。libvmaf 側の実装名がそのまま feature 名になっているためで、SSIM 系は float_ssim / float_ms_ssim を使います。psnr はそのままで通ります。

実測で確認した feature 名は次のとおりです(FFmpeg 8.1 / libvmaf)。

指定 結果
name=psnr 通る
name=psnr_hvs 通る
name=float_ssim 通る
name=float_ms_ssim 通る
name=ssim エラー

解像度が異なる場合:どちらをスケールするかでスコアが変わる

参照動画と歪み動画の解像度が違う場合、解像度を揃えないと libvmaf はスコアを返しません。問題はどちら側を揃えるかで、これによって結果が大きく変わります。

同一の 720p ファイル(1080p 原本から H.264 CRF 23 で作成)を、2通りの方法で測った実測値です。

方法 VMAF
歪み側を 1080p へ拡大して比較(推奨) 82.23
参照側を 720p へ縮小して比較 92.76

同じファイルで 10.5 ポイントも違います。

推奨は前者です。視聴者は 1080p の画面で見るので、720p にした時点で失われた情報は「失われたまま」評価されるべきです。参照側を 720p に落とすと、その失われた情報を参照側からも捨ててしまうため、スコアが実態より高く出ます。Netflix が VMAF の運用で歪み側のアップスケールを前提にしているのもこのためです。

# 推奨:歪み側を参照解像度に合わせる(scale2ref)
ffmpeg -i distorted_720p.mp4 -i reference_1080p.mp4 -lavfi "[0:v]setpts=PTS-STARTPTS[d];[1:v]setpts=PTS-STARTPTS[r];[d][r]scale2ref=flags=bicubic[ds][rs];[ds][rs]libvmaf" -f null -

scale2ref は参照側の解像度を自動で読み取って歪み側を合わせるため、解像度を数値でハードコードせずに済みます。

なお FFmpeg 7.1 以降では実行時に scale2ref is deprecated, use scale=rw:rh instead という警告が出ます(FFmpeg 8.1 で確認)。警告であって失敗ではなく、スコアは正常に返ります。当面はこのままで問題ありません。

スコアは stderr に出力されます。 ffmpeg は成功時でも VMAF スコアを標準エラー出力へ書くので、| grep で抜き出すときは 2>&1 が必要です。ここを見落とすと「スコアが取得できない」と誤解します。


VMAFスコアの読み方

比較結果 確認すること
同条件の別設定より低い 文字・顔・動きのある区間で差を確認する
高いが見た目に違和感がある フレームの同期、拡大縮小、モデル、画面の向きを再確認する
ほぼ同じスコア 容量・処理時間・実際の視聴品質も比較して選ぶ

固定の点数だけで「放送に十分」「誰にも差が見えない」とは判断しません。平均スコアが高くても、一部のフレームに目立つ劣化が残ることがあります。


エンコード設定のチューニングへの活用

VMAFを使ってCRF値の最適値を探す流れ:

  1. 元の高品質動画(original.mp4)を用意
  2. 異なるCRF値でエンコードして比較
# CRF 23 でエンコード後にVMAFスコアを計算する例
ffmpeg -i original.mp4 -c:v libx264 -crf 23 encoded_crf23.mp4
# その後に上記のlibvmafコマンドでスコアを確認

よくあるエラーと対処法

No such filter: 'libvmaf' / Filter libvmaf not found

FFmpegが libvmaf 対応でビルドされていません。同じパッケージマネージャーで入れ直しても直りません(apt 版は最初から無効ビルドのため)。libvmafの前提条件の静的ビルドか自前ビルドに切り替えてください。

2つの入力の解像度・SAR(サンプルアスペクト比)が一致していない。scale フィルタで合わせる。

Segfault または core dumped

libvmafのバージョンとFFmpegのバージョンが不一致の場合に発生することがある。両方を最新にアップデートする。


関連記事


一次ソース: ffmpeg.org/ffmpeg-filters.html#libvmaf / github.com/Netflix/vmaf


よくある質問

VMAF と PSNR / SSIM はどう違う?

VMAF は人間の視覚に近い品質指標です。PSNR は数学的なピクセル差、SSIM は構造的類似性を測りますが、どちらも人間の知覚と必ずしも一致しません。VMAF は機械学習で人間評価に揃えています。

VMAF スコアの目安は?

90 以上が「ほぼマスター品質」、80〜90 が「ストリーミング高品質」、70〜80 が「許容できる」、60 未満は「明らかな劣化」と覚えると判断しやすいです。

計算が遅い

-threads 4 のようにスレッド数を指定するか、入力解像度を下げて評価することで高速化できます。サンプリング(select=not(mod(n\,30)))で 1/30 のフレームだけ評価する方法もあります。

4K 用のモデルを指定する必要はある?

はい、4K 動画には model=path=vmaf_4k_v0.6.1.json を明示する方が正確です。デフォルトモデルは 1080p 視聴を想定しています。

リファレンス動画が無いと VMAF は使えない?

VMAF は参照付き品質指標なので、オリジナル(高品質)と圧縮版の両方が必要です。参照無しなら NIQE / BRISQUE のような無参照指標を使います。