在mpeg-2编码中,并没有规定具体要用哪种编码方式,程序中我们采用的是可变长编码(VLC),VLC是统计编码技术,它的基本思想是:对出现频度较高的数值分配比特数较少的码字,而对出现频度较低的数值分配比特数较多的码字。因为从总体效果看,数据量比用均匀分配比特数的数据量要少。
首先经过DCT和扫描后,DC系数在数组的首位,而我们将DC系数进行可变长编码的时候,并不是直接将DC系数进行编码,二是采用差值的方式,即用现要编码的DC系数减去上一个编码过的DC系数,将差值进行可变长编码。对差分DC系数用两个符号进行编码,符号1和符号2。符号1表示的信息称为“长度”,即为DC系数的幅度进行编码所用的位数,符号2表示DC系数的幅度。
类似地,对每个AC系数也用两个符号进行编码,符号1和符号2。符号1表示两条信息,称为“行程”和“长度”。行程是在之字形矩阵中位于非零AC系数前的连续零值AC系数的个数,长度是对AC系数的幅度进行编码所用的位数。符号2表示了AC系数的幅度。
其实还是利用了查表的方式,程序中有:
这是将DC系数的两个符号压入缓冲区的语句。
而对于AC系数来说,由行程和编码所需的位数来决定符号1,同样是可以通过查表得到。
总之,可变长编码都是利用改进的Huffman编码而来,从而更好的达到压缩的效果。