一 码率控制性
实际上h264标准并没有码率控制这一块内容,也就是说这个是x264自己实现的,和h264无关。当然我们自己也可以实现一种码率控制算法来控制编码码率。
二 x264码率控制
x264码率控制主要分为三种
ABR = average bitrate平均码率,编码出来的视频码率在一个恒定值左右波动
CRF=constant Rate Factor 缺省值23,恒定质量编码(运动/纹理复杂场景,码率上升。静态/纹理简单的画面,码率下降)
CQP=constant quantization parameter 固定的量化参数,会随着视频运动情况 码率会上升和下降。但是码率不可控,码率大小取决于残差大小。
三 x264码率控制源码分析
当设置了bitrate的时候,x264选取的ABR码率控制方式,当设置了固定qp的时候,x264选择的是CQP码率控制方式。当仅仅设置了maxbitrate-minbitrate的时候,x264选择的是CRF码率控制方式。
x264码率控制主要是通过宏块树和qcompress两种方法控制的。
qcompress码率控制作用强的时候,宏块树弱。(qcomp参数默认0.6,qcomp越大,qcomp控制码率越强,是比较老的码率控制方式)
意思就是qcomp降低高复杂度场景的质量,节约出来的码率用来提升低复杂度场景的质量!!!主要是因为高复杂场景就算损失一点质量也是难以视觉察觉的
,除非要帧帧去截图比较差不多。而且高复杂高动态场景分码率太多就太浪费了,而且从PSNR的好看角度来看也应该分配更少的码率给那些相对于静态
场景的区域。看来qcomp=0.60(mbtree=0)保持不变就好了,除非对那些复杂帧使用了高斯模糊(大概是降噪降细节降码率)防止局部码率波动过大
的情况下可以改变下qcomp的取值。
四 源代码
double q;
if( h->param.rc.b_mb_tree )
{
double timescale = (double)h->sps->vui.i_num_units_in_tick / h->sps->vui.i_time_scale;
q = pow( BASE_FRAME_DURATION / CLIP_DURATION(rce->i_duration * timescale), 1 - h->param.rc.f_qcompress );
}
else
q = pow( rce->blurred_complexity, 1 - rcc->qcompress );
//分别是mb_tree 宏块树和qcompress两种方法码率控制,计算出来q。
qcompress根据模糊复杂度计算出q。
四 实际使用
测试发现其实在复杂运动场景,qcomp调大一些画面会看得感觉更清晰一些,但是运动得时候块效应更严重