之前多多少少接触过一些编解码参数,CRF 参数也用过,但是最近在和朋友们聊天时,说到使用 FFMPEG 过程中碰到 CRF 参数,以及具体作用流程,这个之前一直没有跟踪过,也没有详细记录过,所以吊起了自己的好奇心,于是决定搞清楚一下,便开始了这次 CRF 的神奇之旅。CRF 简介:
恒定速率因子(CRF,Constant Rate Factor)是一种编码模式,可以向上或向下调整文件数据速率以达到选定的质量级别,而不是特定的数据速率。
如果要保持最佳质量,而又不怎么担心文件大小,这时候就可以使用 CRF 速率控制模式。 这是大多数情况下建议的速率控制模式。当输出文件的大小不太重要时,此方法允许编码器尝试为整个文件实现期望目标视频质量的文件输出,即所谓的一次编码便可在预期视频质量下获得最大的视频压缩效率。CRF 模式主要原理是在编码过程中通过动态调整每帧视频的 QP 值,以便可以获得保持所需视频质量水平比特率。
但是 CRF 缺点是不能告知编码器期望获得特定大小的文件或不超过特定大小或比特率。同时需要注意的是采用 CRF 时不建议直接用来编码视频以进行流媒体传输。
通常建议一般使用两种速率控制模式:恒定速率因子(CRF)或 2-pass ABR。 速率控制决定每个帧将使用多少位。 这将确定文件大小以及质量分配方式。CRF 实操演示
通过 FFMPEG 二进制文件尝试用参数 CRF 进行压缩,如下图所示:
FFMPEG 采用 CRF 分别为 18、24 进行压缩,以及和源文件的比较。
ffmpeg -i test.mp4 -c:v libx264 -crf 18 test18.mp4
实际转码中
转码结束后,会显示具体的编码相关信息,包括 ref,crf 值,qp 量化步长等,以及 I 帧、P 帧、B 帧所占比重。还包含了音频相关信息如下图:
用命令 ffmpeg -i test.mp4 -c:v libx264 -crf 24 test24.mp4,进行 CRF=24 的转码,转码结果如下图所示:
转码后分别对三个文件进行参数查看,并形成对比,其结果如下图所示:
上述参数只能大概了解三个视频基本信息,之后通过 Elecard eye 专业工具查看该变化产生原因的直观图,三个文件码流分析结果:
三个文件对比情况总结如下:
可以看出: