本文主要是介绍H.264 MPEG4 AVC Tutorial 学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概述 |
| |||||||||||||||||||
技术概览 | 主要包括如下5个部分:
| |||||||||||||||||||
运动估计与帧内估计(Estimation) | 运动估计的基本思想是将图像序列的每一帧分成许多互不重叠的宏块,并认为宏块内所有像素的位移量都相同,然后对每个宏块到参考帧某一给定特定搜索范围内根据一定的匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。视频压缩的时候,只需保存运动矢量和残差数据就可以完全恢复出当前块。
| |||||||||||||||||||
变换(Transform)及逆变换 | 变换就是将结果由空间域转化为频域。前面的运动估计或帧内估计虽然数据有大幅减少,但还有优化的空间。可以将残差数据做整数离散余弦变换(DCT),去掉数据的相关性,进一步压缩数据。 经历了整数离散余弦变换(DCT)之后: H.264/MPEG-4 AVC采用4×4 DCT-like整数变换。相对于MPEG-2和MPEG-4基于浮点系数的8×8 DCT变换,整数系数能够消除浮点系数固有的舍入误差,进而消除浮点系数引起的drifting artifacts。同时,H.264/MPEG-4 AVC较小的块大小也减少了blocking阻塞和ringing artifacts。 | |||||||||||||||||||
量化(Quantization)及逆量化 | 量化的原则是在不降低视觉效果的前提下尽量减少图像编码长度,减少视觉恢复中不必要的信息。 从整数变化阶段得到的系数需要被量化,用以减少整数系数的整体精度,并趋向于消除高频系数,保持感知质量。 一般的标量量化器原理如下: Zij=round(Yij/Qstep) 其中,Yij表示一个宏块经过整数DCT转换后的系数,Zij是输出的量化系数,Qstep是量化步长。量化步长决定了量化器的编码压缩率以及图像精度。如果量化步长较大,则量化值Zij动态范围较小,其相应的编码长度较小,但反量化会损失较多的图像细节信息;如果量化步长较小,则量化值Zij动态范围较大,其相应的编码长度较大,但图像损失较少。 H.264编码器根据图像值实际动态范围自动改变量化步长值,在编码长度和图像精度之间折衷,达到整体最佳效果。在H.264中,使用量化参数QP(Quantization Parameter)来标识量化步长的序号,亮度编码的量化步长Qstep共有52个值,QP为0-51;色度编码的量化步长Qstep共有39个值,QP为0-39。QP取最小值0 时,表示量化最精细;相反,QP取最大值51/39时,表示量化是最粗糙的。亮度编码的QP每增加6,量化步长Qstep增加一倍。亮度编码的量化步长信息如下表:
| |||||||||||||||||||
环路滤波器(LoopFilter)
| H.264 / MPEG-4 AVC定义了一种去块滤波器(de-blocking filter ),其对16×16宏块和4×4块边界进行操作。 在宏块的情况下,滤波器旨在去除可能由具有不同估计类型(例如,运动与帧内估计)的相邻宏块和/或不同的量化尺度产生的伪像。 在块的情况下,滤波器旨在去除可能由变换/量化引起的伪像和相邻块之间的运动矢量差异。 循环滤波器通常使用内容自适应非线性滤波器来修改宏块/块边界的任一侧上的两个像素。 | |||||||||||||||||||
熵编码(EntropyCoding) | 在进行熵编码之前,必须对4x4量化系数进行序列化。 根据这些系数是否是原始的运动估计或帧内估计,选择不同的扫描模式来创建串行化流。 扫描模式将系数从低频到高频排列。 然后,由于较高频率的量化系数趋向于零,所以使用游程长度编码来分组尾随零,导致更有效的熵编码。 熵编码将表示运动矢量、量化系数和宏块头的符号映射到实际位中,熵编码通过将较少数量的比特分配给频繁使用的符号和较大数量的比特到较不频繁使用的符号来提高编码效率。 |
这篇关于H.264 MPEG4 AVC Tutorial 学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!