この記事でわかること
- 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-Builds や John Van Sickle 版 の full ビルドを展開して使う。ディストリのFFmpegは残したままでよい |
| 自分でビルドする | libvmaf をインストールした上で ./configure --enable-libvmaf --enable-version3 |
| Docker を使う | jrottenberg/ffmpeg などの full イメージ |
Windows の gyan.dev の full ビルドには最初から含まれています(本記事の実測はこのビルド、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値の最適値を探す流れ:
- 元の高品質動画(
original.mp4)を用意 - 異なる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の前提条件の静的ビルドか自前ビルドに切り替えてください。
Input link in1 parameters (size 1920x1080, SAR 1:1) do not match the corresponding output link parameters (1280x720, SAR 1:1)
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 のような無参照指標を使います。