前言
使用ffmpeg对视频进行压缩,如果都用肉眼去分辨是否合适,会比较主观,同时也会消耗大量时间。我们需要建立一种比较简便易行的视频质量比对方法。
调整参数->压缩视频->质量比对->调整参数,我们建立这么一个自动化压缩参数调优的流程,以争取达到质量与尺寸之间的平衡。
压缩参数
从上一篇文章我们知道,针对视频调优参数比较常用的有下面几个:
- 码率:可以限定码率方式-b:v,进一步可以配合2-pass全局调优;也可以采用固定码率比-crf。
- 分辨率:-s参数针对视频分辨率进行压缩。我们知道用户侧屏幕分辨率是千差万别的,低端机,高端机,平板电脑,宽屏的,折叠的;不同分辨率去适配不同屏幕播放需要,提升用户体验。-s需要指定长x宽,可以使用滤镜系统进行动态适配,-vf scale=720:-2,表示宽度720,高度等比拉伸。
- 帧率:-r参数视频每秒图像数量,一般情况下fps越高,视频尺寸会大;因为编码算法只会针对前后帧差异部分进行编码,以期望达到更高的压缩率。
- 编码器:-c:v选择h264/h265,h265一般情况下比h264在体积上优化30%左右的空间;-profile:v参数中,h264(main)比h264(high)来说,体积上又会大上10%左右。这里涉及2个概念,选用适当编码格式,针对该编码格式进行编码参数调优。
- 更多参数调优可以参考ffmpeg官方doc。
参考一下YouTube和netflix相关的优化参数。我们大概设定以下若干情况组合自动检测优化。
- 针对码率,不同分辨率不一样,720p的话-b:v=640k、921.60k,大家在chrome上测试一下大概的流畅播放kbps。
- 针对分辨率,-vf scale=480:-2、720:-2、1080:-2
- 针对帧率,-r 22、25、30
- 针对编码格式,-c:v libx264、libx265;h264参数-profile:v high、main;h265参数-tag:v hvc1兼容ios系统
质量判断
采用ffmpeg自带的psnr、ssim,再加上奈飞的vmaf质量评价体系作为打分依据。
- psnr评估的是原视频帧与压缩视频帧之间像素值之间均方差,检测的是压缩后引入的噪声情况。用对数表示,单位db,40db+表示基本无损压缩;30sdb+表示压缩质量好;20db+表示压缩质量差;20db-压缩质量太差需要丢弃。这个评分受到分辨率,像素格式,帧率压缩影响较大。
- ssim评估的是原视频帧与压缩视频帧之间像素值3个纬度之间的相似度情况,包括明亮度、对比度、结构相似程度。取值在0~1之间,0.99+表示基本无损压缩;0.95+表示压缩质量好;0.9~0.95之间表示压缩质量差;0.9-因为压缩后相似度太低需要丢弃。这个评分受到分辨率,像素格式,码率压缩影响较大。
- vmaf是奈飞提出的质量评价体系。除了引入psnr和ssim两个评价分之外,还引入自由vif评价方法。取值在0~100之间,90+表示基本无损压缩;75+表示压缩质量好;50+表示压缩质量差;50-需要丢弃。
具体评分计算可以使用ffmpeg的vf进行。
- 计算psnr评分如下命令:
ffmpeg -i ref.mp4 -an -i dst.mp4 -an -lavfi "[0:v]scale=1080:-2:flags=bicubic,setpts=PTS-STARTPTS[reference];[1:v]scale=1080:-2:flags=bicubic,setpts=PTS-STARTPTS[distorted];[distorted][reference]psnr" -f null -
- ref.mp4和dst.mp4分别是比较的两个视频。ref是原视频,dst是压缩后的视频。
- -an参数表示只读取视频部分数据,不需要解析读取音频部分数据。
- -lavfi就是执行后面的vf滤镜。具体写法参考ffmpeg的官网doc。
- [0:v]表示引入输入-i参数的第一个视频,scale是第一个缩放滤镜,逗号表示当前多个滤镜序列,[reference]表示这次滤镜输出。分号表示另外一个滤镜的情况。
- [distorted][reference]psnr表示psnr滤镜,[distorted][reference]这两个表示输入,没有输出。评分会打印在console上。
- 在整体评分计算过程,我们一般是针对压缩后视频进行参数对齐原视频。以保证原视频作为监督参考标准。所以dst.mp4压缩后视频会通过scale滤镜放大到1080p,使用bicubic算法进行填充。
在实际过程中,还可能遇到其他问题,譬如帧率不对齐,需要对齐原视频framerate=30;譬如tb没有对齐,需要设定settb=AVTB。一切以原视频参数为准,将压缩视频通过vf滤镜系统对齐原视频进行比较计算评分。
- 计算ssim评分如下命令:
ffmpeg -i ref.mp4 -an -i dst.mp4 -an -lavfi "[0:v]scale=1080:-2:flags=bicubic,framerate=30,settb=AVTB,setpts=PTS-STARTPTS[reference];[1:v]scale=1080:-2:flags=bicubic,framerate=30,settb=AVTB,setpts=PTS-STARTPTS[distorted];[distorted][reference]ssim" -f null - - 计算vmaf评分如下命令:
ffmpeg -i ref.mp4 -an -i dst.mp4 -an -lavfi "[0:v]scale=1080:-2:flags=bicubic,framerate=30,settb=AVTB,setpts=PTS-STARTPTS[reference];[1:v]scale=1080:-2:flags=bicubic,framerate=30,settb=AVTB,setpts=PTS-STARTPTS[distorted];[distorted][reference]libvmaf=phone_model=1:n_threads=8:n_subsample=4" -f null -
具体vmaf的参数可以参考ffmpeg官网doc,可以下载奈飞指定的质量评价模型参数。也可以使用多线程,多彩样参数加快速度。
评分结果
psnr命令如下:
psnr评分结果如下:
psnr我们选择average的38.225621纬度评分;可以看得出压缩视频质量还比较好。
ssim评分结果如下:
ssim我们选择ALL的0.970689纬度评分;可以看得出压缩视频质量还比较好。
vmaf评分结果如下:
vmaf评分是74.873057,勉强可接受的程度。
结论
以上过程,可以采用编码实现,自动化去进行比对。增加更多的参数调优组合方式,找到最合适的播放体验和视频尺寸的平衡点。