视频编码质量测试
前言
视频编码例如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。暂不支持多线程,编码是最慢的,需要开启实验选项才能使用。