视频编码质量测试

前言

视频编码例如H.264和HEVC都推荐使用CRF作为存档的压缩方式。那么CRF到底要多少才近乎无损呢?这其实是个复杂的问题。在H.264中推荐的是CRF18,更小的CRF没有意义,那么HEVC应该是多少好?

视频质量的评估有客观和主观两种方式:客观只要用ffmpeg之类的用特定的算法计算即可,例如SSIM和PSNR;而主观一般需要一些人进行评估主观感受,统计得出结果。而现在,一种新的方式正在兴起,即用机器学习来让计算机完成主观测试。较为著名的开源项目是Netflix/vmaf。

结果仅供个人使用和参考,没有任何保证其正确性。

素材

各250帧左右。

  • Big Buck Bunny 1080p 24fps
  • Ducks Take Off 2160p 50fps

接近无损的效果

我使用C++版本的vmaf不必自行编译,AUR里就有,命令为(仅作参考)vmafossexec yuv420p 1920 1080 bbb.yuv out.yuv /usr/share/model/vmaf_v0.6.1.pkl。ffmpeg已经添加了vmaf支持,但是只有手动编译才能得到这个功能,还是算了吧。

SSIM和PSNR可由ffmpeg测得:ffmpeg -s 1920x1080 -i out.yuv -s 1920x1080 -i bbb.yuv -lavfi "ssim;[0:v][1:v]psnr" -f null -

以下参数都是越大越好。

素材 编码 QP 比特率 vmaf1080p ssim psnr fps
bbb x264 18 8654 kbps 99.460196 0.988299 45.827595 7.63
bbb x265 18 6985 kbps 99.470472 0.988605 45.856020 2.84
bbb nvenc 21 11894 kbps 99.450931 0.982844 44.584883 74.3
bbb vp9 21 8524 kbps 99.452915 0.987216 45.609412 2.24
bbb av1
编码 命令行
x264 ffmpeg -s 1920x1080 -r 24 -i bbb.yuv -c:v libx264 -crf 18 -preset slow -tune animation x264crf18.mp4
x265 ffmpeg -s 1920x1080 -r 24 -i bbb.yuv -c:v libx265 -crf 18 -preset slow x265crf18.mp4
nvenc ffmpeg -s 1920x1080 -r 24 -i bbb.yuv -c:v h264_nvenc -qp 21 nvencqp21.mp4
vp9 ffmpeg -s 1920x1080 -r 24 -i bbb.yuv -c:v libvpx-vp9 -crf 21 -b:v 0 -threads 4 vp9crf21.webm

nvenc: NVIDIA的硬件编码器,我落后的开普勒核心的只支持H.264 8bit yuv420。速度比x264都快很多,1080p轻松超过实时。使用-qp指定质量。

vp9: Google与HEVC竞争的编码,需要-threads手动指定线程数,而且用CRF时必须设置-b:v 0

av1(vp10): 几个月前才正式发布的下一代编码,目前处于实验阶段,不过ffmpeg已经支持av1。暂不支持多线程,编码是最慢的,需要开启实验选项才能使用。