目前常用的视频编码算法基本上都是以运动估计和以块为单位的时-频变换为基础。
运动估计,处理了相邻视频帧中的相同部分。
时-频变换,使得数据块的能量更加集中地分布。常用的时-频变换是DCT变换。
运动估计(Motion Estimation),相邻视频帧之间的内容存在一定的相关性。把图像分成若干块,通过一定的搜索算法,在邻近帧中找到和该块最相似的块,这个过程称为运动估计,二者之间的相对偏移量称为运动矢量。
在编码的过程中,对运动矢量和预测的参差进行编码。通过运动估计减少了帧间的时间冗余。
常用的运动估计的匹配算法有:
常用运动估计的搜索算法有:
1 全匹配法
光栅方式扫描所有像素,找到最匹配的块位置。
2 二维对数法
又称五点搜索,边缘点以原步长继续搜索,中心点或边界点步长减半。
3 三步搜索
又称8点搜索,每次确定下一步的搜索点,并将步长减半。
4 领域搜索
根据邻近已编码MB的位置,确定中心的,如果原点最匹配,停止搜索,如果最匹配点是搜索框边缘,继续以该点为中心进行搜索。
5 其它
菱形搜索
钻石搜索
对数据块进行空域到时域的变换,能量更加集中。
转换公式:
对于一个8x8的数据块(表1)经过DCT后转换成表2:
在DCT的转换过程中,当u=0,v=0时,F(0,0)代表了整个8*8图像块的均值,F(0,0)称为直流系数(DC),其余变换后的63个数,称为交流系数(AC)。交流系数距离直流系数越远,交流系数的频率越高。
量化:目的是使保存数据的比特数降低,手段是把一批输入值对应到一个输出级上,结果降低了数据的精度。
量化示例:
结论:经过量化后的数据,在进行解码还原时势必导致图像的失真。量化的精度,决定了图像还原时的失真程度,精度越高,失真越小,反映在码率上,就是量化精度越高,码率越大。
帧内编码和帧间编码采用的不同量化方式
编码时对量化值进行编码传输。
量化公式:
DCT加量化后的数据,能量都集中在左上角,在进行数据保存时采用Z扫描的顺序进行保存。
经过Z扫描后,直流系数和交流系数的低频部分,会排在新数组的前面,而交流系数的高频部分排到后面,而高频中大部分数的值大多都是0,这样我们就把可以得到一长串的“0”的序列,为下一步的编码做好准备。
原理:信息冗余
常用的熵编码有:
RLE:行程长度编码,是针对交流系数进行编码的,它的编码原理是,使用一个字节的高4位表示连续的0的个数,使用它的低4位表示编码下一个非0系数所需要的位数,跟在后面的是非0系数的值。
Huffman:在变长编码中,对出现概率大的符号赋予短码字,对出现概率小的符号赋予长码字。
其它:CAVLC,CABAC
模拟解码器对已经编码的数据进行解码,解码后的视频数据作为其后编码的视频的参考帧数据