この記事でわかること

  • SSIM・PSNRフィルタで映像品質を測定するコマンド
  • SSIM値・PSNR値の読み方と品質基準の目安
  • 2つの動画ファイルを比較する方法(参照動画 vs エンコード済み)
  • 複数のエンコード設定を比較する実践的な使い方
  • 結果をCSVファイルに保存する方法

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


実測: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 を変えたときの各指標

設定 サイズ 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 55.89 MB 34.09 0.8537 88.41
720p へ縮小(scale=1280:-2 3.40 MB 34.67 0.9286 82.23

注目すべきはぼかしとノイズの行です。

  • PSNR と SSIM は「ノイズの方が劣化が大きい」と判定します(PSNR 34.09 < 35.32、SSIM 0.8537 < 0.9370)。
  • VMAF は正反対の判定です(88.41 > 73.57)。ノイズの方が大幅に良い、としています。

人間の目は、細部が失われる「ぼけ」を強く嫌う一方、細部が残っている「粒状ノイズ」にはかなり寛容です。VMAF はこの知覚特性を学習しているため逆転が起きます。PSNR や SSIM だけを見てエンコード設定を選ぶと、ぼけた映像を「良い」と誤判定しかねません。

もう一点、実務で効く事実があります。ノイズを加えた版はファイルサイズが 55.89MB と、元の 29.3MB より大きくなりました。粒状ノイズはランダムなので圧縮が効かず、ビットレートを浪費します。撮影時のノイズが多い素材が異様に大きくなるのはこれが理由です。逆にぼかした版は 4.40MB と小さくなります——細部を捨てているので当然ですが、品質は最も悪いという結果です。「小さくなった=うまく圧縮できた」ではないことが数字で確認できます。

どれを使うべきか

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

SSIM と PSNR の概要

指標 意味 単位 高いほど良い
PSNR ピーク信号対雑音比 dB
SSIM 構造的類似度 0〜1

PSNR(Peak Signal-to-Noise Ratio): ピクセル値の差を数値化。シンプルで計算が速いが、人間の視覚特性は反映されない。

SSIM(Structural Similarity Index): 輝度・コントラスト・構造の3要素で比較。人間の主観的な画質評価に近い。


SSIM を測定するコマンド

オリジナル動画とエンコード後の動画を比較します:

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

出力の読み方

[Parsed_ssim_4 @ ...] SSIM Y:0.976575 U:0.972029 V:0.972912 All:0.974869 (15.99)
フィールド 説明
Y 輝度(Luma)チャンネルのSSIM
U / V 色差チャンネルのSSIM
All 総合SSIM値
(18.51) SSIM値をdBに変換した値

SSIM品質の目安

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_4 @ ...] PSNR y:39.646141 u:43.146276 v:43.196002 average:40.500074 min:35.281647 max:48.126266

PSNR品質の目安(dB)

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

結果をCSVファイルに保存

フレームごとの数値をCSVに出力してグラフ化できます:

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

CRF値の比較実験

CRF18・CRF23・CRF28の3段階を同一ソースから作成して比較する例:

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

関連記事


動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 10 件を検証スクリプトで実行し、全て成功しました(2026-09-06) 一次ソース: ffmpeg.org/ffmpeg-filters.html#ssim / ffmpeg.org/ffmpeg-filters.html#psnr / trac.ffmpeg.org/wiki/QualityGuide