エンコードで画質がどれだけ落ちたかは、元の動画と比べて数値で確かめられます。よく使う指標は PSNR・SSIM・VMAF の3つです。PSNR と SSIM は、FFmpeg の psnr フィルタと ssim フィルタで測れます。VMAF は、人が見たときの評価を学習させた指標です。

実測:3つの指標は同じ順位をつけない

下の表の値は、すべて次の環境で測ったものです。PSNR・SSIM と VMAF は、同じ映像に逆の判定を出すことがあります。3つの指標を使い分けるのは、そのためです。

項目 内容
CPU / GPU Intel Core i9-14900KF / NVIDIA RTX 4090
FFmpeg 8.1(gyan.dev full build)
素材 Big Buck Bunny 1920x1080 / 30fps / 10.0秒 / H.264 24.6Mbps / 29.3MB
素材の権利 © Blender Foundation, CC BY 3.0
測定日 2026-08-28

CRF を変えたときの各指標

CRF は x264 の画質の設定で、数字が大きいほど強く圧縮します。CRF だけを変えて測った結果です。

設定 サイズ PSNR (dB) SSIM VMAF
CRF 18 15.51 MB 43.48 0.9868 96.01
CRF 23 7.12 MB 40.50 0.9749 93.29
CRF 28 3.38 MB 37.40 0.9506 87.83
CRF 32 1.96 MB 34.91 0.9163 79.70
CRF 36 1.19 MB 32.60 0.8656 66.97

圧縮を強めていくだけなら、3つの指標はそろって同じ方向に動きます。この場合は、どれを使っても結論は変わりません。

劣化の「種類」を変えると順位が入れ替わる

同じ 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:allf=t) 55.89 MB 34.09 0.8537 88.41
720p へ縮小(scale=1280:-2) 3.40 MB 34.67 0.9286 82.23

見てほしいのは、ぼかしとノイズの2行です。

  • PSNR と SSIM は、ノイズの方が劣化が大きいと判定します(PSNR 34.09 < 35.32、SSIM 0.8537 < 0.9370)。
  • VMAF は逆で、ノイズの方がずっと良いと判定します(88.41 > 73.57)。

人の目は、細部が消える「ぼけ」を強く嫌います。一方で、細部が残っている「粒状ノイズ」にはかなり寛容です。VMAF はこの見え方の特徴を学習しているので、判定が逆になります。PSNR や SSIM だけでエンコード設定を選ぶと、ぼけた映像を「良い」と判断してしまうおそれがあります。

ファイルサイズにも差が出ました。ノイズを加えた版は 55.89MB で、元の 29.3MB より大きくなっています。粒状ノイズはランダムなので圧縮が効かず、そのぶんビットレート(1秒あたりのデータ量)を無駄に使います。ノイズの多い撮影素材がやけに大きくなるのは、これが理由です。逆に、ぼかした版は 4.40MB まで小さくなりました。細部を捨てているので小さくなるのは当然ですが、品質はいちばん悪い結果です(VMAF 73.57)。ファイルが小さくなったことは、うまく圧縮できた証拠になりません。

どれを使うべきか

目的 推奨
同じコーデック・同じ加工で CRF だけ比較 PSNR か SSIM で十分(速い)
コーデックやフィルタをまたいで比較 VMAF(PSNR/SSIM は順位を誤ることがある)
ぼけ・ノイズなど劣化の質が異なるものの比較 VMAF 一択
数式が単純で説明責任が要る場面 PSNR(定義が明快)

SSIM と PSNR の概要

指標 意味 単位 高いほど良い
PSNR ピーク信号対雑音比 dB ○
SSIM 構造的類似度 なし(範囲は -1〜1) ○

PSNR(Peak Signal-to-Noise Ratio)は、元の映像との画素値の差を数値にしたものです。計算は単純で速いですが、人の目の感じ方は反映されません。

SSIM(Structural Similarity Index)は、明るさ・コントラスト・構造の3つの観点で元の映像と比べます。PSNR より人の見え方を意識した指標ですが、上の実測(ぼかしとノイズの比較)では PSNR と同じ判定になり、VMAF とは逆でした。

SSIM を測定するコマンド

元の動画とエンコード後の動画を比べます。1つ目の -i に元の動画、2つ目の -i にエンコード後の動画を指定します。

ffmpeg -i original.mp4 -i encoded.mp4 -lavfi ssim -f null /dev/null

出力の読み方

[Parsed_ssim_0 @ ...] SSIM Y:0.973778 (15.813298) U:0.976095 (16.215171) V:0.978007 (16.577234) All:0.974869 (15.997893)

ふつうは All の値を見ます。

フィールド 説明
Y 明るさ(輝度、Luma)の SSIM
U / V 色(色差)の SSIM
All 全体の SSIM
( ) 内の数値 直前の SSIM の値を dB に換算した値(All:0.974869 なら 15.997893)

SSIM品質の目安

All の値の目安です。

SSIM値 品質評価
0.999以上 ほぼ完璧(無劣化に近い)
0.99〜0.999 非常に高品質
0.95〜0.99 高品質(通常許容範囲)
0.90〜0.95 中程度(圧縮が感じられる)
0.90未満 低品質(明確な劣化あり)

PSNR を測定するコマンド

ffmpeg -i original.mp4 -i encoded.mp4 -lavfi psnr -f null /dev/null

出力の読み方

[Parsed_psnr_0 @ ...] PSNR y:39.400769 u:43.911871 v:44.567457 average:40.500074 min:37.949515 max:44.301873

average が全体の PSNR(dB)です。y・u・v は明るさと色ごとの値、min と max はフレームごとの値の最小と最大です。

PSNR品質の目安(dB)

average の値の目安です。

PSNR値 品質評価
40dB以上 非常に高品質
35〜40dB 高品質(通常許容範囲)
30〜35dB 中程度
30dB未満 低品質

SSIM と PSNR を同時に測定

ffmpeg -i original.mp4 -i encoded.mp4 -lavfi "[0:v][1:v]ssim;[0:v][1:v]psnr" -f null /dev/null

1回の実行で、SSIM と PSNR の両方の結果が表示されます。

フレームごとの結果をファイルに保存

stats_file で指定したファイルに、フレームごとの数値を1行ずつ書き出せます。形式は CSV ではなく、n:1 Y:0.978873 U:0.978659 V:0.979648 All:0.978967 (16.770895) のような「キー:値」の並びです。グラフにしたいときに使います。

ffmpeg -i original.mp4 -i encoded.mp4 -lavfi "ssim=stats_file=ssim_stats.log" -f null /dev/null

CRF値の比較実験

同じ元動画から CRF 18・23・28 の3本を作り、それぞれを元動画と比べる例です。SSIM が高いほど、元の動画に近い画質です。

ffmpeg -i input.mp4 -c:v libx264 -crf 18 -an crf18.mp4
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -an crf23.mp4
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -an crf28.mp4
ffmpeg -i input.mp4 -i crf18.mp4 -lavfi ssim -f null /dev/null
ffmpeg -i input.mp4 -i crf23.mp4 -lavfi ssim -f null /dev/null
ffmpeg -i input.mp4 -i crf28.mp4 -lavfi ssim -f null /dev/null

関連記事