专利名称:基于低内存消耗查询表的视频压缩码率控制方法
技术领域:
本发明涉及视频传输控制相关的多媒体技术领域,特别是涉及一种基于低内存消耗查询表的视频压缩码率控制方法。
背景技术:
在视频的实时通信中,压缩后的视频码流需要在一个复杂且有不同带宽要求的网络上进行传输。为了在任何时候都能最高效地利用网络资源,并且保证相对较高的视频图像质量,就需要对视频流的码率进行控制。如果视频编码后产生的码流码率过高,则会加重网络的传输压力,造成网络阻塞;另一方面,如果码流在产生的过程中码率发生降低,则会降低视频图像的质量,并造成对网络带宽的不充分利用。因此,需要在视频压缩过程中引入码率控制,用来在视频网络传输时控制和调整编码端输出的码流,满足网络带宽的要求,同时保证一定的视频质量。
目前最简单有效的码率控制方法是基于调节量化参数值QP来进行的,这一类的经典方法主要是通过构建出一个率失真数学模型来确定QP值。然而,这些方法存在以下几个问题1)率失真模型建立在对离散余弦变换的系数等原始信息概率学假设的基础上,该种假设会导致码率控制的偏差。
2)率失真模型一般都和残差宏块的方差有关。然而,在视频编码过程中,为了降低计算复杂度,被使用的常常是绝对误差和SAD而不是方差。因此,基于方差的率失真模型就必须得修改,这是一种启发式的修改,通常依赖于图像特征,效果不一定会好。
3)在率失真模型中,QP值的确定一般是通过最优化方法,例如拉格朗日乘数法来计算得到的。但是,在H.263、MPEG-4等标准中,相邻块的QP值之差会被限定在[-2,2]之中,以防相邻块之间大的质量波动,这样的限制削弱了最优化方法所带来的优势,因而模型对比特数的估计会带来偏差,视频质量也会随之下降。
4)率失真模型引入了大量复杂的浮点运算,计算复杂度急剧上升,也增大了硬件实现的代价。
如果能针对上述问题发掘一些改进的码率控制方法,将能降低计算复杂度,提高码率估计精确度,并且增强对图像特征变化的适应性。
发明内容
本发明的目的在于提供一种基于低内存消耗查询表的视频压缩码率控制方法。
本发明解决其技术问题所采用的技术方案如下一种基于低内存消耗查询表的视频压缩码率控制方法应用对象为前向预测帧P帧,本方法首先执行码率控制方法的预处理过程;然后对每个P帧分配比特数;接下来给P帧中每一宏块分配比特数,其中使用了低内存消耗查询表;在完成当前宏块编码后,需要记录更新值。
1)在码率控制方法的预处理过程中,根据宏块的量化参数值QP、绝对误差和、以及编码宏块纹理信息所用的比特数,简称为纹理比特数,来构建一张码率查询表b[QP][SAD_SEG_NO];绝对误差和的计算如公式(1)所示SAD=Σi=015Σj=015|f(i,j)-g(i,j)|---(1)]]>其中SAD是绝对误差和,f是当前帧的像素函数,g为前一帧的像素函数;码率查询表b[QP][SAD_SEG_NO]中的SAD_SEG_NO表示SAD段的序号;根据一个QP值和SAD_SEG_NO值,就可查表求得纹理比特数b;查询表的具体构建方式如下对于每一个特定的QP值,通常从1到31,利用所用的视频编码器来编码大量的视频序列;对于有相同SAD的宏块,计算出宏块的平均纹理比特数;在执行完这些之后,SAD和纹理比特数的关系就建立起来了,根据结果可以发现,SAD和纹理比特数的关系可以通过分段线性函数来模拟;因此,为了减少查询表的存储消耗,采用间隔选取SAD值的方法,间隔值表示为SAD_STEP;查询表二维数组中第二个参数SAD_SEG_NO即表示SAD段的序号(SAD_SEG_NO=_SAD/SAD_STEP_,__表示取小于该数的最大整数),b[QP][SAD_SEG_NO]表示SAD等于SAD_SEG_NO×SAD_STEP的宏块的平均纹理比特数;在每个SAD段内,SAD和纹理比特数的关系由一个线性函数来模拟,因此记录下SAD段的两个端点的值就足够了;此外,SAD的取值范围设定为0至4000;2)在对每个P帧分配比特数过程中,假设所分配到当前P帧的目标比特数为Btar_p,具体分配方法可参照H.263参考模型TMN8或是MPEG-4参考模型VM7所采用的帧目标比特数分配方法来做;接着将当前P帧做完运动估计之后的残差宏块分成两大类非零宏块,即SAD大于某个预先设定的阀值,量化后极有可能存在非零系数的宏块;全零宏块,即SAD小于该阀值的,量化后极有可能是系数全零的宏块;后者无需进行编码;在本发明的描述中,默认情况下,宏块均指代非零宏块;考虑当前P帧中的第k个宏块,所要分配给第k个宏块的目标纹理比特数btar_k按公式(2)计算btar_k=Btex_rem×SADk/Σi=kNSADi---(2)]]>其中Btex_rem表示当前剩余的用来编码剩余宏块纹理信息的比特数,SADk表示第k个宏块的SAD值,N表示当前帧中所有非零宏块个数,Btex_rem通过公式(3)计算Btex_rem=Brem-Buncode-Bheader-bh-intra‾×Nintra-bh-inter‾×Ninter---(3)]]>其中Brem表示当前剩余的用于编码剩余宏块所有信息的比特数,初始值设为当前P帧的目标比特数Btar_p,Buncode表示用于编码全零宏块中非纹理信息的比特数,Bheader表示用于编码帧的头信息的比特数, 表示用于编码采用帧内编码模式(intra)的宏块头信息的平均比特数,根据当前帧中已编码的intra宏块所花的平均头信息比特数来估计, 表示用于编码采用帧间编码模式(inter)的宏块头信息的平均比特数,根据当前帧中已编码的inter宏块所花的平均头信息比特数来估计,Nintra表示当前帧中剩余intra宏块的数量,Ninter表示当前帧中剩余inter宏块的数量;3)在给P帧中每一宏块分配比特数过程中,分配好第k个宏块目标纹理比特数btar_k后,假设第k个宏块通过运动估计所得到的SAD值为SADk,可根据码率查询表来计算出合适的QP值,使得宏块在用该QP值编码后产生的实际纹理比特数最接近btar_k;详细步骤如下所示第一步确定QP的搜索范围为了减少相邻帧之间的质量波动,QP的搜索范围需要被限制;假设编码前一个P帧所有宏块的平均QP值为 则当前帧宏块QP的搜索范围被限制在[max{QPprev‾-2,1},min{QPprev‾+2,31];]]>需要注意的是,如果当前帧为视频序列中的第一个P帧,则当前帧的搜索范围仍然为[1,31];第二步确定SAD段宏块的SADk落在SAD段[SADm,SADn]内,其中SADm等于SAD_STEP×_SADk/SAD_STEP_,SADn等于SADm+SAD_STEP;第三步对于每个QP值,估计出纹理比特数对于搜索范围内的每个QP值,需要估计出纹理比特数bQP;bQP通过查表并插值获得;插值计算如公式(4)所示bQP=(bn-bm)×(SADk-SADm)/SAD_STEP+bm(4)其中bm表示b[QP][SADm/SAD_STEP],bn表示b[QP][SADn/SAD_STEP];第四步选择合适的QP值在计算出每个QP的bQP值后,要选择一个合适的QP值;所选择出的QP值所对应的bQP和宏块目标纹理比特数btar_k之差最小(min{|bQP-btar_k|});第五步调整QP值上面选择出的QP需要进一步调整;例如,在MPEG-4和H.263中,水平相邻宏块的QP值之差被限制在[-2,2];4)在完成当前宏块编码后,需要记录更新值;但对码率查询表的真正更新是在编完整帧之后做,以便降低计算复杂度,并保证较高准确度的更新;整个过程如下首先额外构建两张表,一张是更新表,定义为Δb[QP][SAD_SEG_NO],用来记录更新值;一张是计数表,定义为C[QP][SAD_SEG_NO],用来计数;更新表和计数表均初始化为0(实际应用中,两张表的尺寸可以减小;考虑最大可能的更新范围,每张表的尺寸可减小为5×(_SADmax/SAD_STEP_-_SADmin/SAD_STEP_+2),其中,5代表QP搜索范围内所有QP值的个数;SADmax和SADmin分别表示当前帧中所有宏块SAD的最大值和最小值;(_SADmax/SAD_STEP_-_SADmin/SAD_STEP_+2)表示对于某个QP值所有可能更新值的个数);对于SAD值为SADk的第k个宏块,在用选择出的QP值编码完后,实际产生的纹理比特数是bact_k;通过对码率查询表插值估计得到的纹理比特数为bQP;则更新值被定义为u=(bact_k-bQP)/2;在编码完每个宏块后,都需按以下操作记录更新值,假设SADk落在SAD段[SADm,SADn]内如果SADk-SADm<SAD_STEP/4,则按公式(5)和(6)进行记录Δb[QP][SADm/SAD_STEP]=Δb[QP][SADm/SAD_STEP]+u(5)C[QP][SADm/SAD_STEP]=C[QP][SADm/SAD_STEP]+1(6)如果SADn-SADk<SAD_STEP/4,则按公式(7)和(8)进行记录Δb[QP][SADn/SAD_STEP]=Δb[QP][SADn/SAD_STEP]+u(7)C[QP][SADn/SAD_STEP]=C[QP][SADn/SAD_STEP]+1(8)其他情况下,则将公式(5)至公式(8)均执行一遍进行记录;在编码完整帧后,对于在更新表中已改变的值(即相应的C[QP][SAD_SEG_NO]为非零),Δb[QP][SAD_SEG_NO]要被重新计算,如公式(9)所示Δb[QP][SAD_SEG_NO]=Δb[QP][SAD_SEG_NO]/C[QP][SAD_SEG_NO](9)在做完公式(9)的操作后就得到了最终的更新表,该更新表就被用来更新码率查询表中相对应位置的元素,具体按公式(10)进行更新b[QP][SAD_SEG_NO]=b[QP][SAD_SEG_NO]+Δb[QP][SAD_SEG_NO] (10)在编码下一帧之前,更新表和计数表需要重新清零。
发明与背景技术相比,具有的有益的效果是本发明是一种内存消耗低、码率估计精确度高的码率控制方法。该方法可用于H.263,MPEG-4和H.264等多种视频压缩标准,并且结合码率控制中不同的帧目标比特数分配方式,可以适用于各种应用场景,如视频会议、视频电话等低时延应用,网络电视、视频监控等对图像质量要求较高的应用。比起传统的基于率失真数学模型构建的码率控制方法,基于低内存消耗查询表的方法有效地提高了视频质量,对码率和跳帧现象的发生也进行了更好的控制。
具体实施例方式
本发明提出的基于低内存消耗查询表的视频压缩码率控制方法是对传统基于率失真模型方法的一种改进。主要按如下步骤进行1.码率控制的预处理过程构建出码率查询表。
2.码率控制实际执行过程对于每个P帧1)参照H.263参考模型TMN8或是MPEG-4参考模型VM7所采用的跳帧控制方法,进行跳帧控制,如果当前帧未被跳过,则进入第2步;否则进入下一帧编码;2)对当前P帧中所有宏块进行运动估计和运动补偿。记录下每个宏块的运动矢量信息和SAD值,并将宏块分成非零宏块和全零宏块两种,非零宏块被进一步分成intra和inter编码模式的宏块;3)参照H.263参考模型TMN8或是MPEG-4参考模型VM7所采用的帧目标比特数分配方法,分配给当前P帧一个目标比特数Btar_p;4)完成对每个宏块进行目标比特数分配的前期准备工作计算Buncode,Bheader,Nintra和Ninter;设置Brem=Btar_p,bh-intra‾=0,]]>bh-inter‾=0;]]>5)对于每一个非零宏块(假设当前是第k个宏块)a)利用公式(3)计算Btex_rem,b)利用公式(2)计算宏块的目标纹理比特数btar_k,c)根据码率查询表计算出宏块的QP值,d)对宏块进行实际编码,e)计算出宏块实际的纹理比特数bact_k,并记录更新值u,f)计算出实际编码宏块头信息的比特数bhd_k,宏块如果采用intra编码模式,则更新 如果采用inter编码模式,则更新 g)宏块如果采用intra编码模式,则将Nintra减1,如果采用inter编码模式,则将Ninter减1,h)更新Brem,更新公式为Brem=Brem-(bact_k+bhd_k);6)更新码率查询表。
本发明已在目前通用的H.263编码器上测试通过,该编码器采用了H.263中如下技术1)参考帧个数1个;2)视频序列编码类型头一帧为I帧,后续帧均为P帧;3)整像素运动估计范围[-16,+16]像素范围;4)运动估计模式16×16像素块模式、8×8像素块模式;5)运动矢量整像素全搜索方式,支持非限制运动矢量搜索;6)编码帧率为10帧每秒;
7)头一个I帧以QP值13进行编码。
本发明方法的试验结果表明用foreman,mthr_dotr,news,suzie等一系列176×144像素格式的视频序列进行测试,结果显示,本发明方法在码率控制、视频质量的提高等方面均表现出良好的效果,同时有效控制了跳帧现象的发生。
权利要求
1.一种基于低内存消耗查询表的视频压缩码率控制方法,其特征在于应用对象为前向预测帧P帧,本方法首先执行码率控制方法的预处理过程;然后对每个P帧分配比特数;接下来给P帧中每一宏块分配比特数,其中使用了低内存消耗查询表;在完成当前宏块编码后,需要记录更新值。
2.根据权利要求1所述的一种基于低内存消耗查询表的视频压缩码率控制方法,其特征在于1)在码率控制方法的预处理过程中,根据宏块的量化参数值QP、绝对误差和、以及编码宏块纹理信息所用的比特数,简称为纹理比特数,来构建一张码率查询表b[QP][SAD_SEG_NO];绝对误差和的计算如公式(1)所示SAD=Σi=015Σj=015|f(i,j)-g(i,j)|---(1)]]>其中SAD是绝对误差和,f是当前帧的像素函数,g为前一帧的像素函数;码率查询表b[QP][SAD_SEG_NO]中的SAD_SEG_NO表示SAD段的序号;根据一个QP值和SAD_SEG_NO值,就可查表求得纹理比特数b;查询表的具体构建方式如下对于每一个特定的QP值,通常从1到31,利用所用的视频编码器来编码大量的视频序列;对于有相同SAD的宏块,计算出宏块的平均纹理比特数;在执行完这些之后,SAD和纹理比特数的关系就建立起来了,根据结果可以发现,SAD和纹理比特数的关系可以通过分段线性函数来模拟;因此,为了减少查询表的存储消耗,采用间隔选取SAD值的方法,间隔值表示为SAD_STEP;查询表二维数组中第二个参数SAD_SEG_NO即表示SAD段的序号(SAD_SEG_NO=_SAD/SAD_STEP_,__表示取小于该数的最大整数),b[QP][SAD_SEG_NO]表示SAD等于SAD_SEG_NO×SAD_STEP的宏块的平均纹理比特数;在每个SAD段内,SAD和纹理比特数的关系由一个线性函数来模拟,因此记录下SAD段的两个端点的值就足够了;此外,SAD的取值范围设定为0至4000;2)在对每个P帧分配比特数过程中,假设所分配到当前P帧的目标比特数为Btar_p,具体分配方法可参照H.263参考模型TMN8或是MPEG-4参考模型VM7所采用的帧目标比特数分配方法来做;接着将当前P帧做完运动估计之后的残差宏块分成两大类非零宏块,即SAD大于某个预先设定的阀值,量化后极有可能存在非零系数的宏块;全零宏块,即SAD小于该阀值的,量化后极有可能是系数全零的宏块;后者无需进行编码;在本发明的描述中,默认情况下,宏块均指代非零宏块;考虑当前P帧中的第k个宏块,所要分配给第k个宏块的目标纹理比特数btar_k按公式(2)计算btar_k=Btex_rem×SADk/Σi=kNSADi---(2)]]>其中Btex_rem表示当前剩余的用来编码剩余宏块纹理信息的比特数,SADk表示第k个宏块的SAD值,N表示当前帧中所有非零宏块个数,Btex_rem通过公式(3)计算Btex_rem=Brem-Buncode-Bheader-bh-intra‾×Nintra-bh-inter‾×Ninter---(3)]]>其中Brem表示当前剩余的用于编码剩余宏块所有信息的比特数,初始值设为当前P帧的目标比特数Btar_p,Buncode表示用于编码全零宏块中非纹理信息的比特数,Bheader表示用于编码帧的头信息的比特数, 表示用于编码采用帧内编码模式(intra)的宏块头信息的平均比特数,根据当前帧中已编码的intra宏块所花的平均头信息比特数来估计, 表示用于编码采用帧间编码模式(inter)的宏块头信息的平均比特数,根据当前帧中已编码的inter宏块所花的平均头信息比特数来估计,Nintra表示当前帧中剩余intra宏块的数量,Ninter表示当前帧中剩余inter宏块的数量;3)在给P帧中每一宏块分配比特数过程中,分配好第k个宏块目标纹理比特数btar_k后,假设第k个宏块通过运动估计所得到的SAD值为SADk,可根据码率查询表来计算出合适的QP值,使得宏块在用该QP值编码后产生的实际纹理比特数最接近btar_k;详细步骤如下所示第一步确定QP的搜索范围为了减少相邻帧之间的质量波动,QP的搜索范围需要被限制;假设编码前一个P帧所有宏块的平均QP值为 则当前帧宏块QP的搜索范围被限制在 需要注意的是,如果当前帧为视频序列中的第一个P帧,则当前帧的搜索范围仍然为[1,31];第二步确定SAD段宏块的SADk落在SAD段[SADm,SADn]内,其中SADm等于SAD_STEP×_SADk/SAD_STEP_,SADn等于SADm+SAD_STEP;第三步对于每个QP值,估计出纹理比特数对于搜索范围内的每个QP值,需要估计出纹理比特数bQP;bQP通过查表并插值获得;插值计算如公式(4)所示bQP=(bn-bm)×(SADk-SADm)/SAD_STEP+bm(4)其中bm表不b[QP][SADm/SAD_STEP],bn表不b[QP][SADn/SAD_STEP];第四步选择合适的QP值在计算出每个QP的bQP值后,要选择一个合适的QP值;所选择出的QP值所对应的bQP和宏块目标纹理比特数btar_k之差最小(min{|bQP-btar_k|});第五步调整QP值上面选择出的QP需要进一步调整;例如,在MPEG-4和H.263中,水平相邻宏块的QP值之差被限制在[-2,2];4)在完成当前宏块编码后,需要记录更新值;但对码率查询表的真正更新是在编完整帧之后做,以便降低计算复杂度,并保证较高准确度的更新;整个过程如下首先额外构建两张表,一张是更新表,定义为Δb[QP][SAD_SEG_NO],用来记录更新值;一张是计数表,定义为C[QP][SAD_SEG_NO],用来计数;更新表和计数表均初始化为0(实际应用中,两张表的尺寸可以减小;考虑最大可能的更新范围,每张表的尺寸可减小为5×(_SADmax/SAD_STEP_-_SADmin/SAD_STEP_+2),其中,5代表QP搜索范围内所有QP值的个数;SADmax和SADmin分别表示当前帧中所有宏块SAD的最大值和最小值;(_SADmax/SAD_STEP_-_SADmin/SAD_STEP_+2)表示对于某个QP值所有可能更新值的个数);对于SAD值为SADk的第k个宏块,在用选择出的QP值编码完后,实际产生的纹理比特数是bact_k;通过对码率查询表插值估计得到的纹理比特数为bQP;则更新值被定义为u=(bact_k-bQP)/2;在编码完每个宏块后,都需按以下操作记录更新值,假设SADk落在SAD段[SADm,DADn]内如果SADk-SADm<SAD_STEP/4,则按公式(5)和(6)进行记录Δb[QP][SADm/SAD_STEP]=Δb[QP][SADm/SAD_STEP]+u(5)C[QP][SADm/SAD_STEP]=C[QP][SADm/SAD_STEP]+1(6)如果SADn-SADk<SAD_STEP/4,则按公式(7)和(8)进行记录Δb[QP][SADn/SAD_STEP]=Δb[QP][SADn/SAD_STEP]+u(7)C[QP][SADn/SAD_STEP]=C[QP][SADn/SAD_STEP]+1(8)其他情况下,则将公式(5)至公式(8)均执行一遍进行记录;在编码完整帧后,对于在更新表中已改变的值(即相应的C[QP][SAD_SEG_NO]为非零),Δb[QP][SAD_SEG_NO]要被重新计算,如公式(9)所示Δb[QP][SAD_SEG_NO]=Δb[QP][SAD_SEG_NO]/C[QP][SAD_SEG_NO](9)在做完公式(9)的操作后就得到了最终的更新表,该更新表就被用来更新码率查询表中相对应位置的元素,具体按公式(10)进行更新b[QP][SAD_SEG_NO]=b[QP][SAD_SEG_NO]+Δb[QP][SAD_SEG_NO](10)在编码下一帧之前,更新表和计数表需要重新清零。
全文摘要
本发明公开了一种基于低内存消耗查询表的视频压缩码率控制方法。首先执行码率控制方法的预处理过程;然后对每个P帧分配比特数;接下来给P帧中每一宏块分配比特数,其中使用了低内存消耗查询表;在完成当前宏块编码后,需要记录更新值。该方法可用于H.263,MPEG-4和H.264等多种视频压缩标准,并且结合码率控制中不同的帧目标比特数分配方式,可以适用于各种应用场景,如视频会议、视频电话等低时延应用,网络电视、视频监控等对图像质量要求较高的应用。比起传统的基于率失真数学模型构建的码率控制方法,基于低内存消耗查询表的方法有效地提高了视频质量,对码率和跳帧现象的发生也进行了更好的控制。
文档编号H04N7/32GK1917646SQ20061005281
公开日2007年2月21日 申请日期2006年8月7日 优先权日2006年8月7日
发明者陈纯, 卜佳俊, 莫林剑, 杨智, 赵梦 申请人:浙江大学