一种视频编码码率控制方法
技术领域
本发明涉及一种视频编码码率控制方法。
背景技术
由于信道带宽和编码传输实时性,以及编解码器对缓冲区的要求,码率控制在编码器中至关重要,一个好的码率控制方案,在网络实时传输和视频质量控制,以及编解码器的成本控制上,能够发挥积极的作用。码率控制通过动态地调整编码参数,使得输出码率符合目标码率的要求,影响码率的主要因素有:编码模式、帧率、量化参数QP(取值为0~51)和编码帧复杂度。量化参数QP大小的选取是影响码率最关键的因素。QP越小,说明大部分细节内容就能被保留,图像比较精细,但当前帧的码率升高;QP越大,说明一些细节信息就会丢失,图像失真增加、视频图像质量下降,但当前帧的码率降低。其关系可以由图1,图2所示。在编码的码率控制过程中,根据目标码率和当前已经编码的图像,预测即将编码的图像复杂程度,选取合适的量化参数QP,成为码率控制的关键技术。
尽管码率控制算法本身不是视频编码的标准部分,但基于其在实际视频编码系统中的重要作用,各种视频编码标准都推荐了相应的码率控制算法,如MPEG-2的TM5、H.263的TMN8等。这些算法已经比较成熟,并在具体应用中取得了不错的效果。随着新的编码标准压缩率越来越高,伴随着的是编码复杂度也越来越高。因此,对于图像的复杂程度的估算的难度也越来越大,选择适当的量化参数也就变得十分困难,即便选取了比较合适的QP参数,但是由于一帧当中的图像细节各有不同,粗糙的QP选择也会使得在同一帧图像中,细节表现很差,观看者主观视觉上得不到优秀的体验。现有标准的经典码率控制算法很难直接应用于越来越先进的视频编码器。
发明内容
本发明所要解决的技术问题是,针对现有技术不足,提供一种视频编码码率控制方法。
为解决上述技术问题,本发明所采用的技术方案是:一种视频编码码率控制方法,包括以下步骤:
1)在编码当前帧图像的过程中,计算当前帧图像每一个宏块的特征值Taint;
2)计算与当前帧图像同类型的上一帧图像的预测复杂度complex_predict_F1和复杂程度complex_prospect_F1;
3)利用上一帧图像的预测复杂度complex_predict_F1和复杂程度complex_prospect_F1计算当前帧图像的复杂程度complex_predict_F;
4)结合当前帧图像的复杂程度complex_predict_F、虚拟参考编码器以及目标码率,计算当前帧图像的帧级别的量化参数QP_INDEX;
5)当QP_INDEX≥2时,把当前帧图像的帧级别的量化参数QP_INDEX值变化成一个等差数列的QP_INDEX值表:(QP_INDEX-2,QP_INDEX-1,QP_INDEX,QP_INDEX+1,QP_INDEX+2),从而量化当前帧图像的宏块;所述等差数列的QP_INDEX值表如下:
QP_INDEX-2 |
Taint值最小的10%的宏块 |
QP_INDEX-1 |
Taint值较小的20%的宏块 |
QP_INDEX |
Taint值大小处于中间的40%的宏块 |
QP_INDEX+1 |
Taint值较大的20%的宏块 |
QP_INDEX+2 |
Taint值最大的10%的宏块 |
当QP_INDEX=0时,把当前帧图像的帧级别的量化参数QP_INDEX值变化成一个等差数列的QP_INDEX值表:(QP_INDEX,QP_INDEX+1,QP_INDEX+2,QP_INDEX+3,QP_INDEX+4),从而量化当前帧图像的宏块;所述等差数列的QP_INDEX值表如下:
QP_INDEX |
Taint值最小的10%的宏块 |
QP_INDEX+1 |
Taint值较小的20%的宏块 |
QP_INDEX+2 |
Taint值大小处于中间的40%的宏块 |
QP_INDEX+3 |
Taint值较大的20%的宏块 |
QP_INDEX+4 |
Taint值最大的10%的宏块 |
当QP_INDEX=1时,把当前帧图像的帧级别的量化参数QP_INDEX值变化成一个等差数列的QP_INDEX值表:(QP_INDEX-1,QP_INDEX,QP_INDEX+1,QP_INDEX+2,QP_INDEX+3),从而量化当前帧图像的宏块,实现宏块级别的码率控制;所述等差数列的QP_INDEX值表如下:
QP_INDEX-1 |
Taint值最小的10%的宏块 |
QP_INDEX |
Taint值较小的20%的宏块 |
QP_INDEX+1 |
Taint值大小处于中间的40%的宏块 |
QP_INDEX+2 |
Taint值较大的20%的宏块 |
QP_INDEX+3 |
Taint值最大的10%的宏块 |
优选地,宏块的特征值Taint的计算过程包括以下步骤:
1)把一个宏块分为16个小块,每一个小块即是一个4x4的矩阵,每一个4x4的矩阵和对应的参考块取绝对差值后,进行哈达玛变换,形成一个系数矩阵,因此一个宏块会有16个4x4的系数矩阵,把每一个4x4的系数矩阵的AC系数分为AC高频块、AC低频块,同时把16个小块的DC系数组成一个4x4的DC系数矩阵,将所述DC系数矩阵分为DC高频块、DC低频块;
2)分别将一个宏块内的所有AC高频块系数相加,并将所有AC高频块的和相加,得到AC高频和SUM_AC_H,同理得到AC低频和SUM_AC_L;将所述DC高频块中的所有系数相加,得到DC高频和SUM_DC_H,同理得到DC低频和SUM_DC_L;
3)利用下式计算宏块的特征值Taint:
Taint=(SUM_AC_Lx0.5+SUM_AC_H)/(SUM_DC_L+SUM_DC_Hx0.5)。
上述宏块的特征值Taint的计算方法简单,且能准确估计特征值。
优选地,complex_prospect_F1计算公式为:complex_prospect_F1=cabac_bitsxQP_INDEX;其中,cabac_bits为所述上一帧图像熵编码后产生的bit数;当前帧图像的复杂程度complex_predict_F的计算方法为:
若当前帧图像是某种类型帧的第一帧,则complex_predict_F=complex_prospect_F1;否则,对于I帧、P帧、B帧三种不同类型的图像,利用下式计算当前帧图像的复杂程度complex_predict_F:
I帧:complex_predict_F=(complex_predict_F1+complex_prospect_F1)/2;
P帧:complex_predict_F=(3*complex_predict_F1+complex_prospect_F1)/M;
B帧:complex_predict_F=(7*complex_predict_F1+complex_prospect_F1)/N;
其中,M=2~6;N=5~12。
本发明的复杂程度计算方法简单易实现,能准确估计图像的复杂程度,从而使得码率控制更加精确,
优选地,M=4;N=8;更准确地估算P帧和B帧类型下的图像的复杂程度。
与现有技术相比,本发明所具有的有益效果为:本发明编码帧的每一个宏块mb根据其特征值被分到不同区间,对应着不同的量化参数,实现比较精确的宏块级别码率控制;通过前一帧的complex_prospect_F1和complex_predict_F1来预测当前帧的复杂程度,算法简单,容易实现,而且complex_predict_F1在预测的权重上更大,对于码率的收敛效果更好;本发明方法实现简单,且对于运动场景有着比较好的关联度,能直接应用于视频编码器。
附图说明
图1为码率与量化参数的关系;
图2为码率与图像复杂度的关系;
图3为本发明一实施例AC高频块示意图;
图4为本发明一实施例AC低频块示意图;
图5为本发明一实施例DC高频块示意图;
图6为本发明一实施例DC低频块示意图;
图7为本发明一实施例QP计算和复杂度预测的流程。
具体实施方式
本发明方法具体实现过程如下:
(1)在编码当前帧的过程中,对每一个宏块,根据以下的计算方法,计算宏块的特征值Taint。计算方法:
1)把一个宏块分为16个block,每一个block即是一个4x4的矩阵,每一个4x4的矩阵和对应的参考块取绝对差值后,进行哈达玛变换,形成一个系数矩阵,因此一个宏块就会有16个4x4的系数矩阵。把每一个4x4的矩阵的AC系数按照图3、图4分为AC高频块、AC低频块。同时把16个小块的DC系数组成一个4x4的DC系数矩阵,将所述DC系数矩阵分为DC高频块、DC低频块;
2)分别将一个宏块内的所有AC高频块系数相加,并将所有AC高频块的和相加,得到AC高频和SUM_AC_H,同理得到AC低频和SUM_AC_L;将所述DC高频块中的所有系数相加,得到DC高频和SUM_DC_H,同理得到DC低频和SUM_DC_L;
3)宏块的Taint值:
Taint=(SUM_AC_Lx0.5+SUM_AC_H)/(SUM_DC_L+SUM_DC_Hx0.5)。
(2)当前编码帧F的预测复杂度complex_predict_F得到以后,结合HRD以及目标码率,便可以参与F的帧级别的QP_INDEX的计算;
(3)当前编码帧F的复杂程度是由上一个同类型帧F1的信息预测而得。所需的F1的信息有两个:第一,是F1的实际编码过程中获得的预测复杂度complex_predict_F1;第二,是从F1的前一同类型的编码帧F2直接预测得到的复杂程度complex_prospect_F1。
(4)F1的complex_prospect_F1值的计算方法。首先得到F1熵编码后产生bit数cabac_bits,再由F1的帧级QP_INDEX的值,计算出F1的complex_prospect_F1:complex_prospect_F1=cabac_bitsxQP_INDEX;
(5)当前编码帧F的预计复杂度complex_predict_F是由同类型的前一编码帧F1的complex_prospect_F1和complex_predict_F1得出,如果是该类型帧的第一帧,则complex_predict_F=complex_prospect_F1,否则具体计算方式如下:
I帧:complex_predict_F=(complex_predict_F1+complex_prospect_F1)/2;
P帧:complex_predict_F=(3*complex_predict_F1+complex_prospect_F1)/4;
B帧:complex_predict_F=(7*complex_predict_F1+complex_prospect_F1)/8;
(6)当QP_INDEX≥2时,把当前帧图像的帧级别的量化参数QP_INDEX值变化成一个等差数列的QP_INDEX值表:(QP_INDEX-2,QP_INDEX-1,QP_INDEX,QP_INDEX+1,QP_INDEX+2),从而量化当前帧图像的宏块;所述等差数列的QP_INDEX值表如下:
QP_INDEX-2 |
Taint值最小的10%的宏块 |
QP_INDEX-1 |
Taint值较小的20%的宏块 |
QP_INDEX |
Taint值大小处于中间的40%的宏块 |
QP_INDEX+1 |
Taint值较大的20%的宏块 |
QP_INDEX+2 |
Taint值最大的10%的宏块 |
当QP_INDEX=0时,把当前帧图像的帧级别的量化参数QP_INDEX值变化成一个等差数列的QP_INDEX值表:(QP_INDEX,QP_INDEX+1,QP_INDEX+2,QP_INDEX+3,QP_INDEX+4),从而量化当前帧图像的宏块;所述等差数列的QP_INDEX值表如下:
QP_INDEX |
Taint值最小的10%的宏块 |
QP_INDEX+1 |
Taint值较小的20%的宏块 |
QP_INDEX+2 |
Taint值大小处于中间的40%的宏块 |
QP_INDEX+3 |
Taint值较大的20%的宏块 |
QP_INDEX+4 |
Taint值最大的10%的宏块 |
当QP_INDEX=1时,把当前帧图像的帧级别的量化参数QP_INDEX值变化成一个等差数列的QP_INDEX值表:(QP_INDEX-1,QP_INDEX,QP_INDEX+1,QP_INDEX+2,QP_INDEX+3),从而量化当前帧图像的宏块,实现宏块级别的码率控制;所述等差数列的QP_INDEX值表如下:
QP_INDEX-1 |
Taint值最小的10%的宏块 |
QP_INDEX |
Taint值较小的20%的宏块 |
QP_INDEX+1 |
Taint值大小处于中间的40%的宏块 |
QP_INDEX+2 |
Taint值较大的20%的宏块 |
QP_INDEX+3 |
Taint值最大的10%的宏块 |
量化参数计算和复杂度预测的流程如图7。