3.5 熵编码
熵编码把一系列用来表示视频序列的元素符号转变为一个用来传输或是存储的压缩码流.输入的符号可能包括量化的变换系数(像上面所说的运行级或零树),运动向量(对于每个运动补偿块的向量值x和y),标记(在序列中用来表示重同步位的点),头(宏块头,图象头,序列的头等)以及附加信息(对于正确解码来说不重要的信息).在这一节中,我们将介绍一些预测性的预编码的方法(用来表示编码帧中的区域关系)在之后接着介绍两种被广泛使用的熵编码技术----修改后的哈夫曼编码和算术编码.
3.5.1 预测编码
在图象的某些区域中,某些符号是高度相关的.比如说,相邻的intra编码块的平均值或DC值是非常相近的,相邻的运动向量可能会有相似的x和y值,等等.编码效率可以由从前面编码的数据预测当前块或宏块的元素,并编码它们之间的差异值来进行提高.一个块或宏块的运动向量指明了在之前编码的帧的预测参考值的编移量.相邻块或宏块的向量经常是相关的因为物体的运动可能会经过帧的一个很大的区域.这对于很小的块或有大量运动物体的运动来说尤其是如此的.运动向量的压缩可以由从之前的编码向量来预测每个运动向量来改进.一个对于当前宏块X的向量的简单的预测是水平相邻的宏块A,三个或更多的之前编码的向量可以被用来预测宏块X的向量(比如A,B和C).预测的和实际运动向量的差值被编码并传输.
量化参数或量化器步长控制了压缩效率和图象质量的平衡量.在实时的视频编解码中,在一个编码帧中修改量化是必要的(例如改变压缩率来使编码码率与传输信道码率相适应).在相邻的宏块中很小的改变参数值就是足够的了.修改了的量化参数必须告诉解码器,而我们不把新的量化参数值传输走,而是传输一个差异值(比如+1,-1或+2,-2)来表示这个参数值变化了多少.因为用来编码差异值要比编码整个量化参数来说要使用更少的位.
3.5.2 变长编码
一个变长的编码器把输入符号映射到一系列的码字(VLC).每个符号映射到一个码字,而码字有变化的长度但是必须包括整数个位.经常出现的符号用短的VLC来表示,而不常出来的符号用长的VLC来表示.对于大量压缩符号来说,这样的操作会让压缩率提高.
3.5.2.1 哈夫曼编码
哈夫曼编码向每个VLC进行赋值的方法是基于对于不同的符号的出现机率的不同来定的.根据Huffman在1952年提出的原始设想,计算每个符号的出现机率是必要的,用这个结果来构造一系列的变长的码字.
如果分布机率值是准确的,那么哈夫曼编码提供了一种对于原始数据来说很有效的压缩方法.然而,为了达到最优化的压缩,对于不同序列的不同的码表是需要的.
3.5.2.2 预计算的哈夫曼编码
哈夫曼编码过程对于视频的编解码有两个不利的地方.首先,解码器必须使用在编码器设置的相同的码字来进行解码.传输这些信息到解码端会加大传输内容,并降低压缩效率,尤其对于短的视频序列来说.第二,对于大的视频序列的可能性值表在视频数据编码之前是不能得到的,这就会造成一些在编码过程的延时.由于这些原因,近来的图形和视频编码标准基于通常的视频序列的统计模型进行编码,用来解决这个问题.
变换系数(TCOEF)
MPEG-4视频部分使用量化系数的3D编码,它们使用每个码字来表示一个(run,level,last)的组合.总共102个特定的(run,level,last)组合有VLC值.在每个码字的last位是's',用来指明符号的解码系数符号(0表示正,1表示负).
一个包含超过八个0的run值的码字是无效的,这样任何以000000000开始的码字都表示码流中有错误.所有的其他序列都可以被用有效的编码值来进行解码.注意最小的码被赋给小的run和小的level值中,因为它们发生的机率比较大.
运动向量差(MVD)
差值编码的运动向量被编码为一对VLC,一个是对于x值的,一个是对于y值的.注意最短的码表示小的运动向量差值(比如MVD=0表示简单的码值1).这些码表与哈夫曼值是非常相似的,因为每个符号都被赋给了唯一个码字.通常用的符号被赋了短码字,在单独的一个表中,没有码字的前缀是同其他码字相同的.
3.5.2.3 其他的变长编码
与哈夫曼和基于哈夫曼的编码一样,一些其他的VLC方法被用在了视频编码的程序中.基于哈夫曼编码的一个很大的不利是它们对于传输错误是敏感的.在VLC序列的错误会导致解码器损失同步信息,并不能正确地进行解码,这样就导致了使解码处于混乱状态.一个预定义的编码表的缺点在于解码端和编码端必须保存同样的码表.一个可代替它的方式是用如果输入的符号已知时可自生成码的方法,比如说指数Golomb编码法.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jasonme/archive/2005/04/10/341902.aspx