王喜民,杨鼎才,闫俊海
(河北省燕山大学信息科学与工程学院,秦皇岛066004)
H.264中码率控制原理如图1所示,码率控制的任务就是在保证缓冲器不产生上溢和下溢的前提下,通过调整一些编码参数(如量化参数)来使编码比特率达到期望值。以便编码器输出码率能够在比特率恒定的通信信道和网络中传输,这种利用信道缓冲器对编码产生的比特数加以控制的技术就是码率控制。
图1 码率控制原理图
在视频编码过程中,编码器和传输信道间的缓冲器起了重要的作用。编码器使缓冲器的占用量保持在50%左右。如果缓冲器发生上溢,则会损失一些数据,相反,如果缓冲器的占用量过低就会浪费带宽。缓冲器的输入端是编码器产生可变的比特流,输出端以恒定的比特率把数据传输到信道上。输入缓冲器和输出缓冲器的数据差值将保存在缓冲器中,为了防止缓冲器上溢,当缓冲器的占用量达到某一个限值时,就跳过下一帧,即该时刻缓冲器没有输入只有输出,从而减小缓冲器的占用量,因此,通过对码率控制中跳帧的适当控制可以较好地缓解由于场景和物体剧烈运动所带来的缓存上溢现象,达到优化图像质量的目的。
这种避免缓存区的溢位,在码率控制策略中,选择跳过一帧或几帧图像不对其编码,就是码率控制中的跳帧技术。
以往的跳帧控制算法中,一般都只是将缓冲器的上限定为80%,并将80%作为跳帧的依据,当缓存容量超过80%,将此帧定为跳帧,相反,当缓存容量低于25%的时候,也将此帧定为跳帧。但是这样处理有其弊端性.事实上,当要编码的图像发生场景变换或者图像物体运动剧烈的时候,由于图像包含更多的信息,必然会造成编码后的比特数上涨,往往会超过缓冲器上阈值的限制,如果就这样简单的将其判为跳帧,会导致运动剧烈的图像丢失,遗漏掉图像中的重要细节,从而使图像质量下降。
跳帧算法中,假定编码的目标比特率为Bit_Rate,视频流的帧率为F,缓存区大小由Buffer_Size表示,缓存区充盈度用缓存中的比特数Buffer_Fullness表示,当缓存区充盈度超过一个阈值Threshold,则跳过当前帧不对其编码,直到当前缓存区充盈度低于门限值之后,再对此时的图像进行编码,通过跳帧的方法可以防止缓存区溢位。在编码第一个I帧之前,将Buffer_Fullness初始化为0。设B为刚刚编码完的第i帧对应的比特数,则跳帧算法为:
Buffer_Size=Bit_Rate*TimeDelay;
FrameSkipped=0;
Buffer_Fullness=Buffer_Fullness+B-Bit_Rate/F;
while(Buffer_Fullness>=Threshold)
{
Buffer_Fullness=Buffer_Fullness-Bit_Rate/F;
FrameSkipped++;
}
其中,FrameSkipped为跳帧数,紧接着上一次编码的第i帧之后将被编码的是第(i+1+FrameSkipped)帧。采用跳帧的目的是通过牺牲图像连续性来换取图像质量的稳定性。根据人眼的视觉特性,偶尔少量的图像跳帧,对视频质量的影响并不大。但是如果发生频繁的连续跳帧,则会引起图像的停滞、跳跃,严重影响视频通信质量。这在码率控制策略中,是要坚决避免的。在常规的码率控制策略中,通常为了避免溢出,当缓存区内比特数超过缓存区空间Bs的80%时,跳过当前帧而不对其作编码,直到其低于临界值后再进行编码。如下式所示:
以往改进算法中大部分采用 MADratio,而MADratio也能够准确的反映出图像的复杂度,但是它却不能预测场景切换帧。因为MADratio算法如下:
对于存在场景切换的视频序列,由于场景切换帧与之前帧的帧间相关性小,场景切换的MADP预测不准确,进而造成 MADratio计算不准确。因此MADratio不能预测场景切换。应该采用的是文献[3]中提到的PSNRdropratio来预测场景切换,并作相关处理。PSNRdropratio的计算在编码器计算完每帧的PSNR值之后进行,其计算步骤如下:
假设当前编码帧j帧被跳过,利用离j帧最近的j-1帧作为j帧的重构帧,计算出 j帧的PSNR,这里记为 PSNRskip,j,然后利用下式可以计算 PSNRdrop,j
PSNRdrop,j=PSNRj-1- PSNRskip,j
其中 PSNRj-1为j-1帧的实际 PSNR
当前编码 j帧的 PSNRdropratio,j,则由下式得到
主动跳帧策略,即在缓存区并未达到空间上限的80%时,为了保留一些信息量较高,相对重要的图像,而主动跳过一些跟上一帧图像相关度较高,相对来说并不十分重要的图像。通过主动跳帧,可以有效的降低缓存区充盈度,从而有效的抑制由于缓存区长期处于高充盈度状态。而引发的图像连续跳帧。预先的主动跳帧,降低了缓存区充盈度,可以有效的防止缓存区达到极度充盈状态:即使跳过1帧或2帧图像仍然不能有效的释放缓存区空间,而需要连续跳过数帧图像。通过实验仿真发现,该主动跳帧策略,可以防止缓存区长期处于临界饱和状态,并且有效的抑制大量图像的连续跳帧。
如果当前编码的P帧图像同时满足以下三个条件,则采用主动跳帧策略,不对该帧编码,而直接编码下一帧图像:
(1)当前GOP的跳帧标志位Skip_Flag为1。在开始一个GOP的编码时,将跳帧标志位置0,一旦在当前GOP中有跳帧发生时,则将Skip_Flag置为1。表示在当前GOP中,通过使用基于预测的拉格朗日最优化方法选择的I帧量化参数进行编码时,仍然不能完全抑止跳帧的发生。在当前GOP的编码中,仍然存在继续跳帧的可能性,因此有必要做好主动跳帧的准备。
(2)当前缓存区充盈度超过缓存区空间的60%。即当前缓存区维持在一个较高的充盈度状态。即使缓存区空间没有达到上限的80%,但是根据上一条件,可以认为当前GOP存在跳帧的可能性。为了避免当缓存区充盈度继续增加之后,而发生对跳帧图像不具选择能力的被动跳帧,因此在缓存区充盈度为60%的时候设置一个判决阈。当这个阈值选择较大,接近80%的时候,则不能有效的通过预判来避免被动跳帧的发生。而当阈值选择较小时,则可能造成过多的图像满足主动跳帧的条件,被主动跳过而不进行编码,但是从实际的编码结果来分析,并不需要有这么多的图像发生主动跳帧,而为后续的相对重要的图像留出缓存区空间。因此这个阈值的选择显得非常重要,如果选择不当,反而会导致使用了主动跳帧策略之后比原来的被动跳帧控制有更多的图像跳帧,对视频序列的连续性造成负面的影响。通过对大量序列的仿真发现,将阈值设置在缓存区空间的60%,能够有效起到提前释放缓存区空间的作用,为此后一些信息量较高、相对重要的图像留出编码空间,使其可以被保留而不被跳帧,同时也有效避免了后续图像发生大量连续的跳帧。
(3)计算当前帧的,通过仿真实验,认为当前帧相对其他的图像来说,复杂度较低,不存在明显的场景切换和快速的局部运动。跳过这一帧图像对此后图像编码质量影响不大,仍然可以根据前一帧图像作为参考帧来进行帧间编码。保证主动跳帧之后,对整个视频序列的主观质量不造成明显的影响。其算法的流程如图2所示。该策略可以通过跳过一些复杂度较低,对于整个序列而言并不重要的图像,来为后面复杂度较高,不能丢失的图像留出缓存区空间。通过主动跳帧,降低了缓存区充盈度,可以有效的防止缓存区达到极度充盈状态:即使跳过1帧或2帧图像仍然不能有效的释放缓存区空间,而需要连续跳过数帧图像。
为了分析提出的主动跳帧策略在防止图像连续跳帧中的作用,在下表中给出了JVT-H017码率控制策略跟采用和未采用主动跳帧策略的低延迟码率控制算法对比实验的结果分析。选用Stefan标准QCIF测试序列。将每一个GOP的长度定为30帧,其结构为 IPPP,不采用 B帧;在编码时,将 Basic Unit的大小定为99个宏块,即一个Basic Unit的大小为一帧图像的大小,相当于是将码率控制算法分为GOP层和帧层;每一个序列各编码150帧图像,编码的帧率为30fps,目标比特为120kbps,缓存区大小为24kbits,相当于允许延时200ms。
图2 主动跳帧策略流程图
表1 三种方法的跳帧结果比较
从表1中可以发现,不论是否采用主动跳帧,该方法在低延迟下都能更好的控制跳帧,这在上文已有详细的对比分析。在此重点针对采用和未采用主动跳帧策略的实验结果,来分析主动跳帧策略的作用。在H017方法中,不但跳帧数目最多,共53帧,而且出现了大量的连续跳帧,其中在第32帧处出现6帧跳帧,然后仅编码完第38帧,在第39时又出现6帧的跳帧,然后编码完第45帧,又立即在第46帧处出现连续的4帧跳帧。这样连续的跳帧严重影响了视频的主观视觉质量,在视频通信中需要极力避免。在未采用主动跳帧时,共跳帧15帧,其中有1次连续跳了4帧图像,1次连续跳了3帧图像。其中在第38帧处,连续跳完2帧之后,仅编码了第42和43帧后又连续出现了3帧跳帧。在采用了主动跳帧后,虽然总体的跳帧数量也为15帧,但是最大的连续图像跳帧为3帧,且仅出现一次。原来在第38帧处连续出现的2帧和3帧连续跳帧,由于在第36帧的主动跳帧,在第38帧时没有图像跳帧,仅在第42帧处连续跳过了3帧图像。有效的抑制了图像的连续跳帧。当然从表1中发现,主动跳帧策略通过分散的预先跳帧来避免连续跳帧的发生。从对比实验结果可以发现,虽然在第76帧发生了主动跳帧,但是其实即使这里没有主动跳帧,其后续的P帧都不会发生跳帧,如果仅在当前的GOP分析,反而增加了图像的跳帧。但是从整体来分析,主动跳帧缓解了缓存区的充盈度,虽然在当前没有明显的体现出减少跳帧的作用,却为下一个GOP留出了更多的缓存区空间,减少其跳帧的可能性,并能提高其编码质量。通过引入主动跳帧之后,该算法在有效维持图像质量的同时,仍可以有效的抑制图像的连续跳帧。
针对传统的跳帧技术,提出了新的主动跳帧策略。该策略在缓存区尚未达到跳帧阈值时,主动跳过一些跟上一帧图像相关度较高,相对来说并不十分重要图像,来降低缓存区的充盈度。通过主动跳帧不但可以为视频中相对重要的图像留出编码空间防止其被跳过,并且能够有效的抑制图像的连续跳帧,提高图像的质量。
[1]S W WU.Improved Rate Control for Low-Delay Communications in H.264/AVC Video Coding Standard[R].National Yet- sen University,July,2004.
[2]Minqiangjiang,Xiaoquanyi,Nan Ling.On Enhancing H264 Rate Control by PSN Based Frame Complexity Estimation[J].IEEE Transactions Consumer Electronics,2003(1):281-286.
[3]刘文尧,龚声蓉.基于H.264的码率控制算法的研究与实现[J].计算机应用与软件,2007(5):28-39.
[4]周骏华,石继刚.一种基于运动复杂度的H.264码率控制跳帧算法[J].浙江工业大学学报,2006(4):13-15.
[5]毕厚杰.新一代视频压缩编码标准 -H.264/AVC[M].北京:人民邮电出版社,2005.