在VBV模式下,x264允许每个MB有不同的QP值,其他模式下,整帧的QP值是固定的。
2pass:
这里是参考x264 overview自己理解的。
在1pass之后,我们就知道了编码的视频每一帧的数据,这就可以在2pass阶段从整个编码文件的全局、宏观角度上为每一个编码帧分配bit。在1pass编码完成后,2pass的流程如下:
1. 在P帧之间分配的相对bit数是独立于总体bit数的,给P帧分配的bit数是依赖于经验公式的,即bit=帧复杂度的0.6次方。对于P帧来说,帧复杂度是在某些固定QP下计算的。对于I和B帧来说,计算帧复杂度的QP是由P推导出的。
2. 将1的结果进行缩放,以满足需求的file-size。
3. 开始编码,并在编码完每一帧之后,更新future QP以解决在size上的错误预测(这叫做long-term compensation)。如果第二次始终偏离预测的size,那么将offset施加到所有的future QP上。在long-term compensation之外,还有short-term compensation(使用real file size减predicted filesize而不是二者的比值)以防止x264在begin和end附近偏离所需file size太远。(begin时可能long-term compensation的数据比较少,end时可能long-term compensation来不及反应)
CRF(Constant Rate Factor):
转载于:ffmpeg与x264编码指南_暂时为空-CSDN博客_ffmpeg ultrafast
该方法在输出文件的大小不太重要的时候,可以使整个文件达到特定的视频质量。该编码模式在单遍编码模式下提供了最大的压缩效率,每一帧可以按照要求的视频质量去获取它需要的比特数。不好的一面是,你不能获取一个特定大小的视频文件,或者说将输出位率控制在特定的大小上。
量化比例的范围为0~51,其中0为无损模式,23为缺省值,51可能是最差的。该数字越小,图像质量越好。从主观上讲,18~28是一个合理的范围。18往往被认为从视觉上看是无损的,它的输出视频质量和输入视频一模一样或者说相差无几。但从技术的角度来讲,它依然是有损压缩。
若Crf值加6,输出码率大概减少一半;若Crf值减6,输出码率翻倍。通常是在保证可接受视频质量的前提下选择一个最大的Crf值,如果输出视频质量很好,那就尝试一个更大的值,如果看起来很糟,那就尝试一个小一点值。
注释:本文所提到的量化比例只适用于8-bitx264(10-bit x264的量化比例 为0~63),你可以使用x264 --help命令在Output bit depth选项查看输出位深,在各种版本中,8bit是最常见的。
它与 ABR 相同,只是缩放因子是用户定义的常数并且不进行overflow compensation
CQP(Constant QP):
转载于:x264的码率控制 - 知乎
并添加了自己的理解。
CQP(Constant QP) 恒 定QP(Quantization Parameter),追求量化失真的恒定,瞬时码率会随场景复杂度而波动,该模式基本被淘汰(被 CRF 取代),只有用”-qp 0”来进行无损编码还有价值。此外,这是一种1pass方法。
ABR(Aerage Bitrate):
转载于:x264的码率控制 - 知乎
并添加了自己的理解。
平均码率,追求整个文件的码率平均达到指定值。瞬时码率也会随着场景复杂度波动,但最终要受平均值的约束。它是一种1pass方法,在不知道未来帧的时候进行码控,这种方法不能准确的到目标file size。
The steps given below are numbered to match the corresponding steps in 2pass.
1. This is the same as in 2pass, except that instead of estimating complexity from a previous encode, we run a fast motion estimation algorithm over a half-resolution version of the frame, and use the Sum of Absolute Hadamard Transformed Differences (SATD) of the residuals as the complexity. Also, the complexity of the following GOP is unknown, so I-frame QPs are based on the past.
2. We do not know the complexities of future frames, so we can only scale based on the past. The scaling factor is chosen to be the one that would have resulted in the desired bitrate if it had been applied to all frames so far.
3. Long and short term compensation is the same as in 2pass. By tuning the strength of compensation, it is possible to obtain quality ranging from close to 2pass (but with file size error of ±10%) to lower quality with reasonably strict file size.
CBR(Constant Bitrate):
转载于:x264的码率控制 - 知乎
前面几个模式都属于可变码率(瞬时码率在波动),即VBR(Variable Bitrate);恒定码率与之相对,即码率保持不变。x264 并没有直接提供 CBR 这种模式,但可以通过在 VBR 模式的基础上做进一步限制来达到恒定码率的目标。CRF 和 ABR 模式都能通过--vbv-maxrate --vbv-bufsize来限制码率波动。
VBV-compliant constant bitrate (CBR)
是一种1pass模式,用于real-time streaming。它使用与 ABR 相同的复杂度估计来计算bit size。用于实现所需file size的缩放因子基于局部平均值(取决于 VBV 缓冲区大小)而不是所有past frames。overflow compensation与 ABR 中的算法相同,但在每行宏块而不是每帧之后运行。
X264 中对于码率控制方法有三种:X264_RC_CQP、X264_RC_CRF、X264_RC_ABR。默认情况是选择 CRF 方法,是在 x264_param_default函数里设置的,通过参数i_rc_method确定是哪一种码控方法。
Preset预设:
预设是一系列参数的集合,这个集合能够在编码速度和压缩率之间做出一个权衡。一个编码速度稍慢的预设会提供更高的压缩效率(压缩效率是以文件大小来衡量的)。这就是说,假如你想得到一个指定大小的文件或者采用恒定比特率编码模式,你可以采用一个较慢的预设来获得更好的质量。同样的,对于恒定质量编码模式,你可以通过选择一个较慢的预设轻松地节省比特率。
如果你很有耐心,通常的建议是使用最慢的预设。目前所有的预设按照编码速度降序排列为:ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo。缺省预设为medium,请忽略 placebo因为它是毫无用处的(参看下面的问答)。你可以使用--preset来查看预设列表,也可以通过x264 --fullhelp来查看预设所采用的参数配置。
你可以基于输入内容的独特性通过使用--tune来改变参数设置。当前的 tune包括:film,animation,grain,stillimage,psnr,ssim,fastdecode,zerolantency。假如你的压制内容是动画,你可以使用animation,或者你想保留纹理,那就是用grain。如果你不确定使用哪个选项或者说你的输入与所有的tune皆不匹配,你可以忽略--tune 选项。你可以使用--tune来查看tune列表,也可以通过x264 --fullhelp来查看tune所采用的参数配置。(注意,这里tune选项未必符合当前的需求,例如animation选项,x264时代的动画和现在流行的动画是完全不同的两种风格,因此使用animation选项来编码现在流行的动画不一定是合适的。)
另外一个可选的参数是--profile,它可以将你的输出限制到一个特定的 H.264 profile,该选项可以被忽略除非你的播放设备只支持某种profile。所有profile 包括:baseline、main、high、high10、high422、high444 。注意使用--profile选项和无损编码是不兼容的。
另一个参考:
x264码率控制介绍、配置及应用_Ronater的博客-CSDN博客