固定码率因子(CRF)是 x264 和 x265 编码器的默认质量(和码率控制)设置。取值范围是 0 到 51,这其中越低的值,结果质量越好,同时输出文件越大,越高的值意味着越高的压缩比,但你可能会在值大到某个点的时候注意到明显的质量损失。
对 x264,一般取值在 18 到 28 之间。默认值是 23,你可以先用它开始尝试。
在 ffmpeg
中,可以这样使用:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
对 x265,默认CRF值是 28:
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
如果你不确定设置CRF为多少,可以从默认值开始,根据你对输出文件的主观感觉进行调整。输出质量是否足够好了?不是?那就把CRF调低一点。输出文件太大了?那就选一个更高的CRF。尽管你的具体结果可能会有变化,大体来说CRF数值 +6 会使文件大小减半,-6 会使大小增一倍。
为了达到最优编码效果,你应该主要在离线文件存储中使用CRF编码。
在优先保证画面质量(也不太在乎转码时间)的情况下,使用-crf参数来控制转码是比较适宜的。这个参数的取值范围为0~51,其中0为无损模式,数值越大,画质越差,生成的文件却越小。从主观上讲,18~28是一个合理的范围。18被认为是视觉无损的(从技术角度上看当然还是有损的),它的输出视频质量和输入视频相当。
我们的压缩策略是,在保证可接受视频画质的前提下,选择一个最大的crf值——如果输出视频质量很好,那就尝试一个更大的值;如果看起来很糟,那就尝试一个小一点的值。
让我们先新建以下bat文件:
ffmpeg -y -i %1 -c:v libx264 -preset veryslow -crf 18 -c:a copy out.mp4
意思是:拖动视频文件至以上bat文件上,以“非常慢”的速度重新编码成H.264格式,保存为out.mp4。
其中:
-preset指定的编码速度越慢,获得的压缩效率就越高。
-c:a copy又是什么意思呢?因为音频的码率一般都比较小,我们就不折腾它了,况且解码后重新编码也会损害音质,于是,就将音频数据从源文件中以原有编码格式直接拷入目标文件吧。
-c:v 后面的参数值怎么填吗?或者说FFmpeg到底支持哪些音视频编码格式?执行ffmpeg –encoders看一下吧。另外
-preset取值范围:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo
-tune取值范围:film,animation,grain,stillimage,psnr,ssim,fastdecode,zerolantency
有个小疑问:既然不在乎等待时间,为什么不给-preset指定一个最慢的placebo呢?那是因为:与 veryslow相比,placebo以极高的编码时间为代价,只换取了大概1%的视频质量提升。这是一种收益递减准则:slow 与 medium相比提升了5%~10%;slower 与 slow相比提升了5%;veryslow 与 slower相比提升了3%。
另外,针对特定类型的源内容(比如电影、动画等),还可以使用-tune参数进行特别的优化。但如果你不确定该用哪个选项,还是忽略这个参数吧。对比效果:
执行完一条转码命令之后,调整-crf参数值,分别设为19、20、28、51,重新转码输出为不同的MP4文件。记录数据对比如下:
尝试播放这些文件。发现crf取值为18~28的情况下生成的文件,其画质没有明显的差异,而以-crf 51生成的视频画质已经惨不忍睹了!在实际应用中,多试几个crf值,在画质和压缩比之间找到一个你能接受的平衡点即可。
ffmpeg -y -i %1 -c:v libx264 -preset veryslow -crf 20 -c:a copy out-crf.mp4
上述命令执行截图: