エンコードで画質がどれだけ落ちたかは、元の動画と比べて数値で確かめられます。よく使う指標は 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