X264码率控制总结1——ABR,CQP,CRF

本文深入探讨了X264视频编码器中的码率控制方法,包括ABR、CQP、CRF及QP的概念、工作原理、参数设置与应用建议。详细分析了每种方法的特性、优先级及其对视频质量、码率和文件大小的影响。重点介绍了如何根据实际需求选择合适的码率控制策略,并讨论了在使用ABR方法时应注意的两个关键设置:帧率(fps)和输出帧pts计算。
1.  X264显式支持的一趟码率控制方法有:ABR, CQP, CRF. 缺省方法是CRF。这三种方式的优先级是ABR > CQP > CRF.

 
  1. if ( bitrate )                rc_method = ABR;  
  2. else if ( qp || qp_constant ) rc_method = CQP;  
  3. else                          rc_method = CRF;      
    bitrate和QP都没有缺省值,一旦设置他们就表示要按照相应的码率控制方法进行编码,CRF有缺省值23,没有任何关于编码控制的设置时就按照CRF缺省值23来编码。        一般的使用建议:    CQP – 一般不推荐使用,在一些算法验证工作中会使用这种模式     CRF – 适合在关注一遍编码质量而输出文件大小或码率不是太紧要的场景下使用,一般网络压片使用CRF。     1 pass ABR – 适用于流媒体或者目标码率受限的实时应用场景。    2 pass VBR – 适用于有目标码率限制而又有时间可以进行二次编码的非实时应用。
 
2. CQP,恒定QP. 无缺省值
        最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的。
        参数qp_constant设置的是P帧的QP。I,B帧的QP根据f_ip_factor, f_pb_factor,计算得到。

 
  1. rc->ip_offset = 6.0 * log2f( h->param.rc.f_ip_factor );  
  2. rc->pb_offset = 6.0 * log2f( h->param.rc.f_pb_factor );  
  3. rc->qp_constant[SLICE_TYPE_P] = h->param.rc.i_qp_constant;  
  4. rc->qp_constant[SLICE_TYPE_I] = x264_clip3( h->param.rc.i_qp_constant - rc->ip_offset + 0.5, 0, QP_MAX );  
  5. rc->qp_constant[SLICE_TYPE_B] = x264_clip3( h->param.rc.i_qp_constant + rc->pb_offset + 0.5, 0, QP_MAX );  
        连续多个B帧时,QP会渐增。        x264 YUV420格式 8比特采样的QP范围是[0, 51]。QP值越小,编码视觉质量越好。QP=0为无失真编码。
        在研究编码算法的时候,一般会选用CQP方法,设定QP为24,28,32,36,40等(一般选4个QP值),编码得到RD曲线,然后比较算法优劣。 
        相同视觉质量时,CQP编码输出的文件会比CRF模式更大。一般而言CRF都能代替CQP方法,不过CQP因为完全不需要预测所以它会运行得更快一些。 
        帧的重要级别为:IDR帧 > I帧 > P帧 > 做参考的B帧 > 不做参考的B帧。QP可以依次增大。  
 
       QPmin,默认值: 0。定义X264可以使用的最小量化值。量化值越小,输出视频质量就越好。
               当QP小于某一个值后,编码输出的宏块质量与原始块极为相近,这时没必要继续降低QP。
               如果开启了自适应量化器(默认开启),不建议提高QPmin的值,因为这会降低平滑背景区域的视觉质量。
       QPmax,默认值: 51。定义X264可以使用的最大量化值。默认值51是H.264规格中可供使用的最大量化值。
               如果想要控制X264输出的最低品质,可以将此值设置的小一些。
               QPmin和QPmax在CRF,ABR方法下是有效的,过低的设置QPmax,可能造成ABR码率控制失败。不建议调整这个参数。
       QPstep,默认值: 4。设置两帧间量化值的最大变化幅度。 
       帧间QP变化,帧内宏块QP不变,输出码率未知,各帧输出视觉质量有变化(高QP低码率的情况下会更明显)。
 
3. CRF,恒定Rate Factor (码率系数)缺省值23
       CQP是把某个量化值作为目标,bitrate是把某个输出文件大小作为目标,而CRF则是把某个输出“视觉质量”作为目标。
       CRF可以提供跟QP一样的视觉质量,但是文件更小,CRF是通过降低那些“less important”帧的质量来达到此目的的。
       “less important”的意思是那些过于耗费码率又难以用肉眼察觉的帧,比如复杂或者高速运行的场景。省下来的码率会分配给其它更有效的帧。
       在X264编码器内部CRF和bitrate采用了相同的调整策略,只是它不遵循一个特定的输出码率。
       它也是通过改变不同重要级别帧(I,P,B类型),以及帧内不同宏块类型(高速运动,复杂纹理,平坦区域)的QP值,以此来调整输出视觉质量。
       和QP的范围一样RF的范围也是[0, 51]。其中0为无损模式,23为缺省,51质量最差。和QP一样的趋势。RF值加6,输出码率大概减少一半;减6,输出码率翻倍。
       从主观上讲,18~28是一个合理的范围,18往往被认为从视觉上看是近似无损的。
       帧间QP变化,帧内宏块QP变化,输出码率未知,各帧输出视觉质量基本恒定。
 
4. ABR, 恒定平均目标码率。想要选择这种码率控制方法,必须先设置bitrate。
       X264中bitrate的单位是Kbps(K bit per second). --bitrate 128指的是设置目标码率为128Kbps, 这样一秒钟的数据量为 128/8比特 = 16K字节。
       如果输入为352x288@15fps,相当于128Kbit/(352*288*15) = 0.086比特每像素。编码后每个像素平均分配不到0.1个比特。
       与ABR相应的技术有CBR,VBR。这些码率控制技术首先都是在音频编码中采用,是解决音频编码采用什么样的比特率最优的问题。

CBR编码码比特率基本保持恒定在目标比特率,有利于流式播放。 CBR的缺点在于复杂场景码率不够用,简单场景码率浪费,因此编码内容的视觉质量不稳定。通常在较低比特率下,这种质量的变化会更加明显。

VBR编码为简单场景分配较大的QP,为复杂的场景分配较小的QP,得到基本稳定的输出视觉质量。 相对于CBR,在相同文件大小的条件下,VBR的输出结果要比CBR好的多,这有利于媒体下载和本地存储。 VBR的缺点在于输出码流大小不可控。同时对于复杂度恒定的内容(例如新闻播音)没什么优势。

ABR编码为简单场景分配较少的比特,从而留出足量的比特用于生成高质量的复杂部分。使得有限的比特数能够在不同的场景间合理分配,这类似于VBR。 同时ABR分配码率,使得在一定时间内,平均码率趋近于目标码率,这样可以控制输出文件大小,这点类似于CBR。 因此可以认为ABR是CBR和VBR的一种折中优化方案。

       分析视频编码码率控制可以通过三个因素:
       1. 视觉质量稳定性,利于视觉主观质量;
       2. 即时输出码率,相当于每帧编码输出比特数;
       3. 输出视频文件大小可控,利于传输,存储。
       比较这三种码率控制方式如下:
       #        视觉质量稳定性         即时输出码率        输出文件大小
       CBR          不稳定               恒定               可控
       VBR           稳定                变化              不可控
       ABR         基本稳定               变化               可控 (即时码率变化,但一段时期内平均码率趋近目标码率)

       在当前X264版本中(version 142),选用ABR需要注意两个设置,1.fps;2.输出帧pts计算。  
       1. fps。ABR会根据帧率来估算每帧的平均数据量,bitrate/fps为平均一帧数据量。
          当输入视频源为YUV数据,需要显式的指定正确的帧率--fps,否则X264会用缺省的25fps来计算,有可能控制不到设定的目标码率。
       2. pts计算。ABR算法中用到不同帧的pts作为帧间距离,如果没有设置输出帧的pts值,X264会报“non-strictly-monotonic PTS”警告。
          编码出来的视频文件码率很小,根本达不到bitrate的设置,同时视频质量很差,几乎都为马赛克。两种方法解决这个问题:
          a. 设置param.b_vfr_input = 0,这时用fps而不是timebase,timestamps来计算帧间距离
          b. 在解码后主动更新pts, pic_out.i_pts++;
         这两种方式都可以避免ABR码率控制失效的问题。
       
### x265编码器的码率控制方法及参数设置 x265编码器支持三种主要的码率控制模式,分别是ABR(Average Bitrate)、CQP(Constant QP)和CRF(Constant Rate Factor)。以下是每种模式的详细介绍及其参数设置方法: #### 1. ABR模式(平均比特率) ABR模式的目标是通过调整量化参数(QP)来达到指定的平均比特率。该模式适用于实时流媒体传输或存储空间有限的场景。 - **关键参数**: - `--bitrate`:指定目标比特率,单位为kbps。 - `--vbv-bufsize` 和 `--vbv-maxrate`:用于设置视频缓冲区大小和最大比特率,确保符合特定标准(如H.264/AVC或HEVC)的要求[^2]。 - **代码示例**: ```bash x265 --bitrate 5000 --vbv-bufsize 10000 --vbv-maxrate 8000 input.yuv output.hevc ``` #### 2. CQP模式(恒定量化参数) CQP模式下,编码器使用固定的量化参数进行编码,不进行动态调整。这种模式适合对质量要求较高且不关心文件大小的应用场景。 - **关键参数**: - `--qp`:指定固定的量化参数值,范围通常为0到51,值越小质量越高[^3]。 - **代码示例**: ```bash x265 --qp 26 input.yuv output.hevc ``` #### 3. CRF模式(恒定速率因子) CRF模式旨在保持一致的视觉质量,同时允许比特率根据内容复杂度动态变化。这是非实时应用中最常用的模式之一。 - **关键参数**: - `--crf`:指定速率因子值,范围通常为0到51,值越小质量越高[^3]。 - `--qcomp`:控制QP值在帧间的变化程度,默认值为0.6。 - **代码示例**: ```bash x265 --crf 23 input.yuv output.hevc ``` #### 其他重要参数 - **Rate Control Initialization**: 在CRF模式下,`m_rateFactorConstant` 的计算公式如下: ```cpp double baseCplx = m_ncu * (m_param->bframes ? 120 : 80); double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0; m_rateFactorConstant = pow(baseCplx, 1 - m_qCompress) / x265_qp2qScale(m_param->rc.rfConstant + mbtree_offset); ``` 这段代码定义了速率因子的初始值,影响最终的编码质量[^3]。 - **B帧相关参数**: - `--bframes`:指定B帧的数量,增加B帧可以提高压缩效率但可能降低延迟。 - `--b-adapt`:启用自适应B帧插入,进一步优化码率分配。 #### 注意事项 - 不同模式之间的切换需要重新配置编码器,因为它们的工作原理和目标不同。 - 参数选择应根据具体应用场景调整,例如实时直播倾向于ABR模式,而离线转码更适合CRF模式。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值