压制完视频不知道画质损失了多少?想用数据量化两张编码方案的优劣,而不是靠肉眼"玄学"对比? 本文带你从零掌握 VMAF 和 SSIM 两大画质指标的原理与实操,用 FFMetrics 和 FFmpeg 把画质评测变成可量化、可复现的标准化流程。

1. 为什么需要画质指标?

在视频压制领域,“画质好不好"一直是个主观问题。但当我们需要:

  • 对比不同编码器(x265 vs NVENC vs AV1)的压缩效率
  • 校准 RF/CQ 参数,找到画质与体积的最优平衡点
  • 批量检测压制结果是否达标

就需要一套客观、可量化、可复现的画质评分体系。VMAF 和 SSIM 就是目前业界最常用的两个指标,而 FFMetrics + FFmpeg 的组合则是 Windows 平台上最便捷的评测工具链。


2. VMAF 与 SSIM:原理和差异

2.1 SSIM(结构相似性指数)

SSIM(Structural Similarity Index Measure)由德州大学奥斯汀分校的 Zhou Wang 等人于 2004 年提出,是一种基于图像结构信息的全参考画质指标。

核心思想

SSIM 从三个维度衡量两张图像的相似程度:

  • 亮度(Luminance):两张图的平均亮度是否接近
  • 对比度(Contrast):两张图的亮度标准差是否接近
  • 结构(Structure):两张图的亮度归一化后的相关性

三者的加权乘积即为 SSIM 值,取值范围为 0 到 1

  • 1.0:两张图像完全一致(无损)
  • 0.95 以上:极高质量,人眼几乎无法区分
  • 0.90 - 0.95:高质量,正常观看无明显劣化
  • 0.80 - 0.90:中等质量,仔细对比可察觉差异
  • 0.80 以下:画质损失明显

特点

  • 计算速度快:算法简单,CPU 即可快速计算
  • 逐帧评分:输出每帧的 SSIM 值,可绘制画质波动曲线
  • 局限性:不完全符合人眼感知,对时域失真(如运动模糊、块效应)不敏感

2.2 VMAF(视频多方法评估融合)

VMAF(Video Multimethod Assessment Fusion)由 Netflix 于 2016 年开源发布,是目前业界公认最接近人眼主观感受的画质指标。

核心思想

VMAF 不是单一算法,而是一个融合框架。它提取多种底层特征(包括 VIF 细节保真度、DLM 融合失真、时域运动信息等),再通过 SVM(支持向量机)机器学习模型进行加权融合,输出一个 0 到 100 的综合评分。

  • 100 分:理论满分(参考视频自身)
  • 95 分以上:接近"视觉无损”,逐帧放大才能找到差异
  • 90 - 95 分:高质量,正常动态播放几乎无法区分原片
  • 80 - 90 分:中等质量,部分场景可察觉压缩瑕疵
  • 80 分以下:画质损失明显

特点

  • 高度拟合人眼感知:经过大规模主观测试训练,评分与人眼 MOS(Mean Opinion Score)高度相关
  • 支持时域分析:考虑了画面运动信息,对动态场景的评价更准确
  • 计算量大:比 SSIM 慢 5-10 倍,但仍在可接受范围内
  • Netflix 认证:被 Netflix、YouTube 等主流流媒体平台用于编码质量控制

2.3 选哪个?

对比维度SSIMVMAF
拟合人眼感知一般,与主观感受有偏差优秀,高度拟合人眼 MOS
计算速度慢(约为 SSIM 的 5-10 倍)
输出粒度逐帧分数 + 全片均值逐帧分数 + 全片均值
适用场景快速筛查、批量对比精确画质评估、参数校准
行业地位经典指标,广泛使用Netflix 开源,流媒体行业标准
最低可用版本FFmpeg 内置需安装 libvmaf 模型

实操建议:日常快速对比用 SSIM 即可,精确校准参数或需要对外发布画质报告时用 VMAF。两者可以同时计算,互为补充。


3. 工具安装

3.1 FFmpeg 安装

FFmpeg 是底层视频处理引擎,VMAF 和 SSIM 评测都依赖它。

Windows 安装

  1. 访问 FFmpeg 官方下载页,选择 Windows 构建版(推荐 gyan.devffmpeg-release-essentials.zip
  2. 解压到任意目录(例如 C:\ffmpeg
  3. C:\ffmpeg\bin 添加到系统 PATH 环境变量
  4. 打开命令提示符,验证安装:
ffmpeg -version

输出版本号即表示安装成功。

确认 libvmaf 支持

VMAF 功能需要 FFmpeg 编译时包含 --enable-libvmaf。gyan.dev 的构建版已内置支持,可通过以下命令确认:

ffmpeg -filters 2>&1 | findstr vmaf

如果输出包含 libvmaf,表示 VMAF 滤镜可用。

3.2 VMAF 模型文件

VMAF 需要加载预训练模型文件(.json)。大多数 FFmpeg 构建版已内置模型,路径通常为:

  • Windows(gyan.dev 构建):C:\ffmpeg\bin\model\ 目录下
  • Linux(系统包):/usr/share/model/vmaf_v0.6.1.json

如果找不到模型文件,可从 Netflix vmaf GitHub 手动下载,放置到任意目录后在命令中指定路径。

3.3 FFMetrics 安装

FFMetrics 是 Windows 平台上的图形化画质评测工具,底层调用 FFmpeg 计算 VMAF/SSIM/PSNR,提供直观的结果展示。

  1. 访问 FFMetrics 官方页面 或者搜索 FFMetrics 下载
  2. 下载最新版压缩包,解压到任意目录
  3. 双击 FFMetrics.exe 即可运行,无需安装

注意:FFMetrics 依赖 FFmpeg,需要确保系统已正确安装 FFmpeg 并配置好 PATH 环境变量。部分 FFMetrics 版本支持在设置中手动指定 FFmpeg 路径。


4. FFMetrics 图形化使用教程

FFMetrics 提供了最直观的画质评测体验,适合不想记命令行参数的用户。

4.1 基本界面

打开 FFMetrics 后,界面分为三个区域:

  • 顶部工具栏:添加文件、开始评测、导出结果
  • 文件列表区:显示待评测的视频文件
  • 结果展示区:显示 VMAF / SSIM / PSNR 评分

4.2 单文件画质评测

这是最常见的场景:对比一个压缩后的视频与原始视频的画质差异。

  1. 添加参考文件(原始视频):点击 Reference 按钮,选择原始未压缩或高质量源文件。
  2. 添加失真文件(压缩后视频):点击 Distorted 按钮,选择待评测的压缩视频。
  3. 选择评测指标:在设置中勾选 VMAFSSIM 和/或 PSNR
  4. 点击 Start:开始计算,进度条会实时更新。
  5. 查看结果
    • 均值分数:全片平均 VMAF / SSIM / PSNR 值
    • 最小/最大帧分数:最差画质帧和最佳画质帧的评分
    • 百分位分布:例如 P1(最差 1% 帧的平均分)、P5、P25 等
    • 画质曲线图:逐帧分数的时间轴折线图,可直观看到画质波动

4.3 批量对比评测

FFMetrics 支持同时加载多组参考-失真文件对,非常适合批量对比不同编码方案:

  1. 添加多组文件对(例如同源分别用 x265 RF22、RF24、NVENC CQ28 压制的三个文件)
  2. 选择相同的参考文件
  3. 点击 Start,所有文件会依次计算
  4. 结果以表格形式并排展示,可直接导出为 CSV

4.4 结果解读

VMAF 结果

  • Mean:全片平均分,这是最重要的指标
  • Median:中位数,如果与 Mean 差距大,说明画质波动剧烈
  • P1 / P5:最差帧的评分,反映画质下限。P1 低于 80 分可能意味着存在画质"破底"的场景
  • Harmful:VMAF 低于某个阈值(默认 50)的帧占比,表示严重影响观看体验的比例

SSIM 结果

  • Mean:全片平均 SSIM 值(0-1 范围)
  • Min:最低帧 SSIM,反映最差情况
  • 曲线波动:SSIM 曲线的波动幅度反映编码质量的稳定性

4.5 导出报告

FFMetrics 支持将评测结果导出为:

  • CSV 文件:包含逐帧分数,可用 Excel 进一步分析
  • 图表截图:画质曲线的可视化图表

5. FFmpeg 命令行评测教程

命令行方式适合自动化脚本、CI/CD 集成和高级用户。

5.1 SSIM 计算

ffmpeg -i distorted.mp4 -i reference.mp4 -lavfi ssim -f null -

参数说明

  • -i distorted.mp4:失真文件(压缩后的视频)
  • -i reference.mp4:参考文件(原始视频)
  • -lavfi ssim:使用 SSIM 滤镜进行对比
  • -f null -:不输出文件,仅计算指标

输出示例

[Parsed_ssim_0 @ 0x...] SSIM Y:0.971234 (15.387641) U:0.985678 (18.504321) V:0.983456 (17.802109) All:0.978901 (16.774532)
  • Y / U / V:亮度通道和两个色度通道的 SSIM 值
  • All:综合 SSIM 值(最常用的参考值)
  • 括号内数字:对应的质量因子(dB),值越大越好

5.2 逐帧 SSIM 输出到文件

ffmpeg -i distorted.mp4 -i reference.mp4 -lavfi ssim="stats_file=ssim_log.csv" -f null -

新增参数 stats_file=ssim_log.csv 会将每帧的 SSIM 值写入 CSV 文件,格式如下:

n:1 Y:0.9756 U:0.9891 V:0.9867 All:0.9821 (17.41)
n:2 Y:0.9723 U:0.9878 V:0.9845 All:0.9798 (16.95)
...

可用 Excel 或 Python 绘制画质波动曲线。

5.3 VMAF 计算

ffmpeg -i distorted.mp4 -i reference.mp4 -lavfi libvmaf -f null -

输出示例

[VMAF score: 93.456789]

5.4 指定 VMAF 模型和参数

ffmpeg -i distorted.mp4 -i reference.mp4 -lavfi "libvmaf=model_path='C\\:/ffmpeg/bin/model/vmaf_v0.6.1.json':log_path=vmaf_log.json:log_fmt=json" -f null -

关键参数

  • model_path:VMAF 模型文件路径(Windows 路径中冒号需转义为 \\:
  • log_path:逐帧评分输出文件路径
  • log_fmt:输出格式,支持 json(推荐)、csvsubxml

5.5 VMAF 4K 模型

对于 4K 分辨率内容,Netflix 提供了专门的 4K 模型,评分更准确:

ffmpeg -i distorted.mp4 -i reference.mp4 -lavfi "libvmaf=model_path='vmaf_4k_v0.6.1.json'" -f null -

5.6 同时计算 VMAF 和 SSIM

可以在同一命令中同时计算两个指标:

ffmpeg -i distorted.mp4 -i reference.mp4 -lavfi "[0:v][1:v]ssim=stats_file=ssim_log.csv;[0:v][1:v]libvmaf=log_path=vmaf_log.json:log_fmt=json" -f null -

5.7 指定输入帧率和分辨率

如果两个视频的帧率或分辨率不同,需要先进行缩放对齐:

ffmpeg -i distorted.mp4 -i reference.mp4 -lavfi "[0:v]scale=1920:1080[a];[1:v]scale=1920:1080[b];[a][b]libvmaf" -f null -

注意:VMAF 要求参考视频和失真视频的分辨率、帧率完全一致。如果不一致,FFmpeg 会报错或产生无意义的结果。


6. 实战案例

6.1 案例一:对比 x265 不同 RF 值的画质

场景:用同一源文件分别以 RF=20、RF=22、RF=24、RF=26 压制 4 个 1080p 视频,评测哪个 RF 值是画质与体积的最优平衡点。

步骤

  1. 用 FFmpeg 或 HandBrake 压制 4 个文件
  2. 用 FFMetrics 加载参考文件和 4 个失真文件
  3. 同时勾选 VMAF 和 SSIM
  4. 运行评测,得到结果

6.2 我的实测跑分

以下是我使用 FFMetrics 对实际素材进行画质评测的截图,供参考:

FFMetrics VMAF 评测结果截图

FFMetrics SSIM 评测结果截图

FFMetrics 画质曲线图

6.3 案例二:对比 x265 与 NVENC 的压缩效率

场景:同一源文件分别用 x265 RF=24 和 NVENC CQ=28 压制,两者体积接近(约 1.7GB),哪个画质更好?

命令行方案

ffmpeg -i source_x265_rf24.mp4 -i source_nvenc_cq28.mp4 -lavfi "[0:v]scale=1920:1080[a];[1:v]scale=1920:1080[b];[a][b]libvmaf=log_path=compare_vmaf.json:log_fmt=json" -f null -

运行后检查 compare_vmaf.json 中的 pooled_metrics 字段,对比两者的 VMAF 均值。

6.4 案例三:画质监控脚本

在批量压制流水线中,自动检测输出视频是否达标:

@echo off
set THRESHOLD=90.0

ffmpeg -i %1 -i %2 -lavfi "libvmaf=log_path=vmaf_result.json:log_fmt=json" -f null - 2>vmaf_output.txt

for /f "tokens=2 delims=:," %%a in ('findstr "vmaf" vmaf_output.txt') do set VMAF_SCORE=%%a

if %VMAF_SCORE% LSS %THRESHOLD% (
    echo [FAIL] VMAF score %VMAF_SCORE% below threshold %THRESHOLD%
) else (
    echo [PASS] VMAF score %VMAF_SCORE% meets threshold %THRESHOLD%
)

7. 常见问题与注意事项

7.1 参考视频和失真视频的格式要求

VMAF 和 SSIM 都是**全参考(Full-Reference)**指标,必须同时提供参考视频和失真视频。两个视频的以下属性必须一致:

  • 分辨率:必须完全相同,否则需要先缩放
  • 帧率:必须完全相同
  • 帧数:建议完全相同;如果不同,FFmpeg 会在较短的视频结束后停止计算
  • 色彩空间:建议一致,否则结果可能不准确

7.2 封装格式的影响

评测时建议使用无损或近无损的中间格式(如 .yuv.mkv),避免封装格式引入额外的解码差异。实际操作中,使用 .mp4.mkv 也能得到可靠的结果,但不要对两个使用不同容器格式的文件评测(例如 .mp4 vs .mkv)。

7.3 运行时间

VMAF 计算较慢,典型的 1080p 2 小时视频在中等性能 CPU 上可能需要 20-60 分钟。SSIM 通常快 5-10 倍。批量评测时建议使用脚本并行处理。

7.4 不要跨分辨率对比

VMAF 和 SSIM 的评分与分辨率直接相关。4K 视频的 VMAF=92 和 1080p 视频的 VMAF=92 代表完全不同的画质水平,不能直接比较。如果需要跨分辨率对比,应将所有视频统一缩放到同一分辨率后再评测。

7.5 VMAF 分数不是万能的

VMAF 是目前最好的客观画质指标,但仍然存在局限性:

  • 不覆盖所有失真类型:对色偏、帧丢失等失真不敏感
  • 模型版本差异:不同版本的 VMAF 模型(v0.6.1、v0.6.1neg 等)评分不通用,对比时必须使用同一模型
  • 场景依赖:低复杂度内容(如访谈、网课)的 VMAF 评分普遍偏高,不代表压缩质量真的更好

8. 速查表

8.1 FFmpeg 常用命令速查

用途命令
SSIM 基本评测ffmpeg -i dist.mp4 -i ref.mp4 -lavfi ssim -f null -
SSIM 输出逐帧 CSVffmpeg -i dist.mp4 -i ref.mp4 -lavfi ssim="stats_file=out.csv" -f null -
VMAF 基本评测ffmpeg -i dist.mp4 -i ref.mp4 -lavfi libvmaf -f null -
VMAF 输出 JSON 日志ffmpeg -i dist.mp4 -i ref.mp4 -lavfi libvmaf=log_path=out.json:log_fmt=json -f null -
VMAF + SSIM 同时计算ffmpeg -i dist.mp4 -i ref.mp4 -lavfi "[0:v][1:v]ssim;[0:v][1:v]libvmaf" -f null -
指定 VMAF 模型路径ffmpeg -i dist.mp4 -i ref.mp4 -lavfi "libvmaf=model_path='path/to/model.json'" -f null -
分辨率不一致时缩放ffmpeg -i dist.mp4 -i ref.mp4 -lavfi "[0:v]scale=W:H[a];[1:v]scale=W:H[b];[a][b]libvmaf" -f null -

8.2 评分参考标准

VMAF 分数SSIM 值主观感受建议用途
95+0.98+接近视觉无损珍贵素材无损/近无损存档
90 - 950.95 - 0.98高质量,正常观看无感知高质量收藏、影视压制
80 - 900.90 - 0.95中等质量,仔细对比可察觉日常观看、一般收藏
< 80< 0.90画质损失明显不推荐,除非存储极度受限

9. 总结

画质评测不是"玄学",而是可以量化、可以复现的标准化流程。VMAF 拟合人眼感知,适合精确校准;SSIM 计算快速,适合批量筛查。FFMetrics 提供了图形化的便捷体验,FFmpeg 命令行则为自动化和脚本化提供了无限可能。

在实际压制工作中,建议先用 FFMetrics 对关键参数组合进行精确评测,确定最优参数后再批量应用,避免反复试错浪费时间。