位置:51电子网 » 技术资料 » 其它综合

H.263视频编码的码率控制算法及硬件实现

发布时间:2008/6/5 0:00:00 访问次数:855

  摘 要:提出了一种h.263低码率视频压缩编码的自适应码率控制方法,这种方法可以用fpga来实现,为了达到实时性的要求,对硬件实现的具体方法进行了优化。所提出的码率控制优化方法已在h.263标准的硬件系统中实现。

  关键词:fpga;h.263标准;码率控制;视频压缩;帧层

1 引言

  输出比特速率的控制是影响h.263低速率视频编码的一个重要问题,控制的好坏直接关系到解码图像的质量与编码器输出比特速率的稳定性。itu-th.263[1]建议本身对这部分算法是开放的。到目前为止,已提出了若干种比特速率的控制算法[2~4]。这些算法可以分为两类,一类为前馈比特速率控制,另一类为反馈比特速率控制。前馈控制算法通过对各编码单位编码输出比特数的预测,或用试验迭代的方法,来确定相应的量化步长,其主要弱点是常常需要很大的计算量,使得其应用受到明显的限制,因而很少被采用。相对来说,反馈控制算法的计算量是可以接受的,并已被广泛应用。itu-t相继推出的tmn5模型和tmn8[2]模型就是一种反馈比特速率算法。tmn8是在tmn5的基础上提出的,具有优异的控制效果,很多试验表明,以tmn8实现的系统可以稳定地锁定在既定码率上,码率的上下波动小于10%,并且tmn8模型的算法实现起来也不复杂。

  本文针对h.263视频编码器的结构,根据itu-t视频编码模型tmn-8中标准的码率控制算法,提出了一种采用fpga实现码率控制的硬件方法,码率控制分别在宏块层和图像层进行。首先阐述了h.263的码率控制算法,然后介绍了硬件实现及优化方法,最后给出了仿真的结果。

2 码率控制算法

  h.263系统的码率控制分2个层次实现,一是改变量化步长,二是跳帧。码率控制的过程可以用图1来形象地说明。当控制器检测到发送缓冲器中存放的码流高于或者低于一定的门限时,控制器根据相应的算法改变量化步长,使发送缓冲器中的码流稳定在一定的数量。当编码器产生码流的码率很大,超出了量化器的控制范围,将采用跳帧的方法来解决。

  改变量化步长,是微观的宏块级控制,控制量是量化步长因子q。h.263标准规定:q分为32级,其值分别为0~31。q越小,量化越精细,图像质量就越高,而产生的码流也越长。一个宏块内具有相同的q,所以对于q来说最小的变化单位是宏块。当一个宏块编码结束时,如果截至到目前编码器所产生的码流小于一个门限,那么码率控制模块就根据一定的算法减少q;而对于量化器来说,q变小则量化后的系数中非零系数增多,编码器输出的码流就增加。如果截至到目前编码器所产生的码流大于一个门限,那么码率控制模块就增加q,q变大则量化后的系数中非零系数减少,编码器输出的码流就减少。按照这种方法,在一定程度上使发送给发送缓冲器的码流维持恒定,也就达到了控制码率的目的。改变量化步长实现起来比较复杂。根据统计的码流比特数,通过复杂的计算,在每个宏块结束时,计算下一个宏块的量化步长因子q(qp)。用ptype表示帧类型,帧类型为帧内帧时用i帧表示,否则用p帧表示。

 
  其中,mean_qp为上一帧每个宏块平均的量化步长;bits_prev_pic为上一帧产生的比特数;target_bpf为上一帧结束时计算出来的本帧应该产生的比特数;target_bpf_prev为上一个target_bpf;bits_prev_macro为本帧截至当前宏块所产生的比特数;mbnum为已编码宏块在本帧所有宏块中所占的比例,用小数表示;target_bps是设定的发送码率。

  对于跳帧算法,是实现宏观的帧级控制,控制量是tr。tr以跳帧或不跳帧来达到减少或增加码流的目的。一帧编码结束时,根据当前发送缓冲器内的比特数与跳帧的门限进行比较,判断是否需要跳帧。如果发送缓冲器内的比特数大于跳帧的门限时,说明发送缓冲器已经不能接受更多的码流了,所以接下来的帧不用编码,发送缓冲器用空出的时间来发送码流,减少库存,这样就发生了跳帧;反之,则不需要跳帧。值得注意的是在整个过程中,从发送缓冲器发出的码流一直是按照一定的速率发出的,也就是说码率是恒定的,改变的是发送缓冲器的库存。

  跳帧的控制量是h.263标准码流中帧头的tr。tr是一个8位的指示位,表明了本帧的序号,范围是0~255,当超过255时,从0重新开始。在一般没有跳帧的情况下,tr是连续地从0~255变化。但当发生跳帧时,tr将发生不连续地跳变。如:当前帧的tr是112,在当前帧结束时计算得出下一帧要跳帧,那么等待跳帧结束后的下一帧的tr是115。这样译码器可以知道δtr是3(δtr代表译码器对当前帧的显示次数),那么译码器就将本帧图像显示3次,即跳了2帧。

  跳帧是在每一帧编码结束时发生的。这时,统计完这一帧共产生的比特数(用bits_prev_pic表示)、上一帧结束时发送缓冲器的比特数(用bits_in_buffer表示)。跳帧门限用threshold表示,threshold等于设定的发送码率(target_bps)除以设定的帧频(target_fps)的商,threshold必须是个整数。

  摘 要:提出了一种h.263低码率视频压缩编码的自适应码率控制方法,这种方法可以用fpga来实现,为了达到实时性的要求,对硬件实现的具体方法进行了优化。所提出的码率控制优化方法已在h.263标准的硬件系统中实现。

  关键词:fpga;h.263标准;码率控制;视频压缩;帧层

1 引言

  输出比特速率的控制是影响h.263低速率视频编码的一个重要问题,控制的好坏直接关系到解码图像的质量与编码器输出比特速率的稳定性。itu-th.263[1]建议本身对这部分算法是开放的。到目前为止,已提出了若干种比特速率的控制算法[2~4]。这些算法可以分为两类,一类为前馈比特速率控制,另一类为反馈比特速率控制。前馈控制算法通过对各编码单位编码输出比特数的预测,或用试验迭代的方法,来确定相应的量化步长,其主要弱点是常常需要很大的计算量,使得其应用受到明显的限制,因而很少被采用。相对来说,反馈控制算法的计算量是可以接受的,并已被广泛应用。itu-t相继推出的tmn5模型和tmn8[2]模型就是一种反馈比特速率算法。tmn8是在tmn5的基础上提出的,具有优异的控制效果,很多试验表明,以tmn8实现的系统可以稳定地锁定在既定码率上,码率的上下波动小于10%,并且tmn8模型的算法实现起来也不复杂。

  本文针对h.263视频编码器的结构,根据itu-t视频编码模型tmn-8中标准的码率控制算法,提出了一种采用fpga实现码率控制的硬件方法,码率控制分别在宏块层和图像层进行。首先阐述了h.263的码率控制算法,然后介绍了硬件实现及优化方法,最后给出了仿真的结果。

2 码率控制算法

  h.263系统的码率控制分2个层次实现,一是改变量化步长,二是跳帧。码率控制的过程可以用图1来形象地说明。当控制器检测到发送缓冲器中存放的码流高于或者低于一定的门限时,控制器根据相应的算法改变量化步长,使发送缓冲器中的码流稳定在一定的数量。当编码器产生码流的码率很大,超出了量化器的控制范围,将采用跳帧的方法来解决。

  改变量化步长,是微观的宏块级控制,控制量是量化步长因子q。h.263标准规定:q分为32级,其值分别为0~31。q越小,量化越精细,图像质量就越高,而产生的码流也越长。一个宏块内具有相同的q,所以对于q来说最小的变化单位是宏块。当一个宏块编码结束时,如果截至到目前编码器所产生的码流小于一个门限,那么码率控制模块就根据一定的算法减少q;而对于量化器来说,q变小则量化后的系数中非零系数增多,编码器输出的码流就增加。如果截至到目前编码器所产生的码流大于一个门限,那么码率控制模块就增加q,q变大则量化后的系数中非零系数减少,编码器输出的码流就减少。按照这种方法,在一定程度上使发送给发送缓冲器的码流维持恒定,也就达到了控制码率的目的。改变量化步长实现起来比较复杂。根据统计的码流比特数,通过复杂的计算,在每个宏块结束时,计算下一个宏块的量化步长因子q(qp)。用ptype表示帧类型,帧类型为帧内帧时用i帧表示,否则用p帧表示。

 
  其中,mean_qp为上一帧每个宏块平均的量化步长;bits_prev_pic为上一帧产生的比特数;target_bpf为上一帧结束时计算出来的本帧应该产生的比特数;target_bpf_prev为上一个target_bpf;bits_prev_macro为本帧截至当前宏块所产生的比特数;mbnum为已编码宏块在本帧所有宏块中所占的比例,用小数表示;target_bps是设定的发送码率。

  对于跳帧算法,是实现宏观的帧级控制,控制量是tr。tr以跳帧或不跳帧来达到减少或增加码流的目的。一帧编码结束时,根据当前发送缓冲器内的比特数与跳帧的门限进行比较,判断是否需要跳帧。如果发送缓冲器内的比特数大于跳帧的门限时,说明发送缓冲器已经不能接受更多的码流了,所以接下来的帧不用编码,发送缓冲器用空出的时间来发送码流,减少库存,这样就发生了跳帧;反之,则不需要跳帧。值得注意的是在整个过程中,从发送缓冲器发出的码流一直是按照一定的速率发出的,也就是说码率是恒定的,改变的是发送缓冲器的库存。

  跳帧的控制量是h.263标准码流中帧头的tr。tr是一个8位的指示位,表明了本帧的序号,范围是0~255,当超过255时,从0重新开始。在一般没有跳帧的情况下,tr是连续地从0~255变化。但当发生跳帧时,tr将发生不连续地跳变。如:当前帧的tr是112,在当前帧结束时计算得出下一帧要跳帧,那么等待跳帧结束后的下一帧的tr是115。这样译码器可以知道δtr是3(δtr代表译码器对当前帧的显示次数),那么译码器就将本帧图像显示3次,即跳了2帧。

  跳帧是在每一帧编码结束时发生的。这时,统计完这一帧共产生的比特数(用bits_prev_pic表示)、上一帧结束时发送缓冲器的比特数(用bits_in_buffer表示)。跳帧门限用threshold表示,threshold等于设定的发送码率(target_bps)除以设定的帧频(target_fps)的商,threshold必须是个整数。

相关IC型号

热门点击

 

推荐技术资料

罗盘误差及补偿
    造成罗盘误差的主要因素有传感器误差、其他磁材料干扰等。... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!