生活中有时需要压缩转码视频,这时视频压缩前后的画质对比除了肉眼主观评价之外,还可以借助VMAF评分进行量化对比,从而确定视频压缩参数。VMAF((Video Multimethod Assessment Fusion,视频多方法评估融合)是Netflix与南加州大学、南特大学以及德克萨斯大学奥斯汀分校联合开发的开源视频质量评价指标,通过转码视频和原视频每一帧画面对比评分,最后给出所有帧的平均分即为转码视频的画质质量。本文将介绍VMAF在Windows平台下FFmpeg环境中的使用。
测试环境:(系统:Windows 11 22H2;CPU:i5 8400;GPU:RX574;FFmpeg:gyan.dev 5.1.2-essentials_build)
一、1080P画质对比
FFmpeg已集成的VMAF默认模型(vmaf_v0.6.1.json)主要针对1080p及以下分辨率的视频,可直接使用。本文只针对同1080p、同帧率下转码视频与原视频对比进行了测试,转码分辨率与原分辨率不一致的情况请看🔗此文。
在包含有ffmpeg.exe的bin文件夹中右键打开终端,同时在此文件夹放入对比视频,执行如下指令即可执行对比评分。
.\ffmpeg -i zhuan.mp4 -i yuan.mp4 -lavfi libvmaf=log_fmt=json:log_path=output.json -f null -
其中zhuan.mp4
为转码视频,yuan.mp4
为原视频。命令执行后输出的为所有帧的平均分,日志文件output.json
包含有每一帧的单独评分。另外整个对比时间较长,建议使用短片段进行对比,我这里的情况是2分钟时长的视频对比耗时6分钟。
在此次测试中我将一个H264视频转为H265视频,尽管在转码时勾选了帧率同步源视频,但转码的帧率由原视频的29.970 (29970/1000) FPS变为了29.970 (30000/1001) FPS。使用vidcoder、handbrake、shanaEncoder进行软压、硬压也是同样的情况,最后使用FFmpeg 预设slow h265软压得到的视频帧率才保持一致。这帧率问题我只能说,我看不懂,但我大受震撼。


对于此类帧率不同的视频,直接执行上述命令会报错:
Application provided invalid, non monotonically increasing dts to muxer in stream 0
需执行如下命令才能正常运行。
.\ffmpeg -r 29.97 -i zhuan.mp4 -r 29.97 -i yuan.mp4 -lavfi "[0:v]setpts=PTS-STARTPTS[main];[1:v]setpts=PTS-STARTPTS[ref];[main][ref]libvmaf=log_fmt=json:log_path=output.json" -f null -
其中-r 29.97
为指定帧率,setpts
为同步两视频的PTS (presentation timestamp)。因为FFmpeg在此过程中主要依赖timestamp,所以帧率和PTS正确很重要。
二、4K画质对比
FFmpeg也集成了VMAF的4K画质模型(vmaf_4k_v0.6.1.json),不过需要在执行命令中指定。最终的执行命令示例如下:
.\ffmpeg -i zhuan.mp4 -i yuan.mp4 -lavfi libvmaf=model=version=vmaf_4k_v0.6.1:log_fmt=json:log_path=output.json -f null -
三、手机屏幕画质对比
由于上述两个模型主要是针对模拟客厅电视环境下的视频质量评价,而对于手机屏幕及笔记本电脑,VMAF提供了手机画质模型,执行命令示例如下:
.\ffmpeg -i zhuan.mp4 -i yuan.mp4 -lavfi libvmaf=model=version=vmaf_v0.6.1\\:enable_transform=true:log_fmt=json:log_path=output.json -f null -
相当于指定1080p模型(vmaf_v0.6.1
)同时开启变换enable_transform=true
。4k视频指定4k模型(vmaf_4k_v0.6.1)即可。
四、VMAF评分
VMAF分值在0~100之间,越大越好,20分对应极差,100分对应极好。
网上他人的说法,98分以上和原片几乎无法区分,95分以上基本没有差异,93~95分能感知到差异但可接受,91分以下通常差异比较明显。我没找到这些说法的官方来源,不过补充一个来自官方的有趣信息:当原视频与原视频对比时,VMAF不一定能到100分,不过足够接近,类似的情况也会出现在其他机器学习项目上。有位老哥得到了98.7分。
你可能会遇到一种情况:视频整体看着还可以,但评分较低。这可能是其中有些帧的vmaf分较低,从而拖累了整体平均分。你可以查看日志文件output.json
里哪些帧的分值较低,用ffmpeg抽取对应帧进行对比。这里附上抽取指定(编号)帧的命令(第一帧的编号为0):
.\ffmpeg -i zhuan.mp4 -vf "select=eq(n\,0)" -vframes 1 %03d.png
另外,同一个视频在手机屏幕上会有更高的VMAF分数。一个示例的结果如下:
从图上得知,当VMFA分达到最大值后进一步增加编码码率不会有感知改善;在手机端,720P到1080P的分辨率提升为用户带来的主观视觉质量提升十分有限。
参考文章:
4、
5、