与音频压缩编码不同,视频的压缩编码基本都是有损压缩。H.264是多种视频压缩技术的集大成者,其使用技术的还要追溯到H.261。
宏块
宏块是视频压缩操作的基本单元。无论是帧内压缩还是帧间压缩,它们都是以宏块为单位。
宏块是按像素进行划分的。宏块划分得小,压缩的控制力就大一些,处理速度也会降下来。
宏块还可以划分为子块。
宏块划分尺寸:
帧内预测
理论基础:
- 相邻像素差别不大,可以进行宏块预测。宏块与宏块之间进行比较,而不是像素对比。
- 人对亮度的敏感度超过色度。YUV 很容易将亮度与色度分离。组合上面的点,可以将亮度与色度区分处理。以下的帧内预测,亮度与色度是区分处理的。
H.264将单个宏块内的像素颜色变化规律规范成了公式,编码时只要写此处应用哪个公式就行了。
1. 选择帧内预测模式
帧内预测模式有9种,通过与目标宏块对比选择最适合的模式,将预测的宏块变成预测模式编号。
2. 叠加残差
帧内预测残差值,通过预测出来的与原始图像进行对比得出。
预测模式信息+残差值。预测得出的图像颜色是基于宏块的,平滑度有限,叠加残差值来磨平这些色差。
帧间预测
对每帧图像压缩,压缩比始终有限,因此提出了对一组图片做消除冗余。
- 把强相关的帧进行分组,形成GOP(Group of Pictures)。
- 进行运动估计(宏块查找/匹配 -> 运动矢量)。这是一个过程,通过宏块匹配,得出运动矢量,最终存储的是初始状态和运动矢量。
- 进行运动补偿(解码),补偿的是残差值。
引入基于运动补偿帧间预测算法后,视频中的帧就分为两类:
- 关键帧:完整的静态图像,可以被直接解码。
- 预测帧/参考帧:通过运动补偿算法在关键帧之上计算得到。根据帧的依赖方向还可以分为:
- 预测编码图像帧,P帧(Predictive-coded picture):只能参考前面的关键帧和P帧。
- 双向预测编码图像帧,B帧(Bidirectionally predicted picture):能参考前后的关键帧和P帧,但不能参考前后的B帧。
进入帧间预测编码的常见问题:
- 花屏。GOP分组有帧(P、B)丢失,会造成解码端端图像发生错误,出现马赛克。
- 卡顿。其实是为了避免花屏问题的发生而导致的新的问题,当发现有帧丢失的时候,就丢弃GOP内所有的帧,直到下一个IDR帧重新刷新图像。I帧是按照周期来的,需要一个较长的时间周期才到达下一个I帧。如果在下一个I帧之前不显示后面的图像,视频久静止不动了,出现卡顿。
DCT
DCT,Discrete Cosine Transform,离散余弦变换。帧内编码算法。在图像压缩算法上,H.261使用了DCT算法,把图像从空间域转换到频率域,然后做量化,减少人眼不敏感的高频信息,保留绝大部分低频信息,从而减少图像体积。然后再用高效的数据编码方式把处理后的数据进一步压缩。
DCT将图像分成由不同频率组成的小块,然后进行量化。在量化过程中,舍弃高频分量,剩下的低频分量被保存下来用于后面的图像重建。
DCT具备去相关性和能量集中的特性。DCT本身并不会压缩数据,它为随后的量化之类的操作,提供了一个良好的基础。
DCT在后来的JPEG编码中起主要作用。
CABAC
在编码的最后阶段,即可以去除的冗余信息都去除后,对数据进行无损压缩。H.264除了支持在H.261中就存在的VLC编码外,新增加了两种无损数据压缩编码,一种是VLC的升级版——CAVLC,另一种是复杂程度更高的CABAC(前文参考之适应性二元算术编码,Context-based Adaptive Binary Arithmetic Coding)。
CABAC也是一种熵编码,主要原理也是用长编码替换掉出现频率少的数据,而用短编码替换出现频率高的数据,但它引入了更多统计学优化,并且具有动态适应能力。虽然在解码时需要更多计算,但它能够比CAVLC节省更多的数据量,通常能有10%。
编码树单元
HEVC引入了新的编码树单元(Coding Tree Units)概念,取代掉了存在于视频编码中多年的宏块概念,它的单块面积大了许多,达到了64x64,但仍然保留了可变大小和可分割特性,最小单元为16x16。单个编码树中包含了小的编码单元,它们可以由四分树形式呈现,并很快地可以确定下其中的单元是否可被再分割,内部编码单元最小可以被分割为8x8大小,精细程度仍然是非常高的。
单个编码单元也可以继续被切割、分类,可以成为预测单元(Prediction Units),后者可以指示该单元的预测形式,是画面内预测还是画面间预测或者甚至是根本没有变化、可以被跳过的单元;也可以成为转换单元(Transform Units),它可以做DCT转换或是量化。
编码树单元的引入让HEVC既可以用大面积单元来提高编码效率,也可在需要的时候细化,保留更精细的细节。所谓该粗略的地方就粗略,该精细的地方就精细,HEVC在它的帮助下让码流的效率更高。
趋势
H.261奠定宏块和帧间预测的基础,H.264/AVC是多种压缩技术的集大成者。HEVC主要是针对高清及超清分辨率视频而开发的,相比起前代AVC,它在低码率时拥有更好的画质表现,同时在面对高分辨率视频时,也能提供超高的压缩比,帮助4K视频塞入蓝光光盘。
H.264编码流程
- 帧类型分析 -> I帧、P帧、B帧、GOP
- 划分宏块及其子块
- I帧进行帧内预测,最终存储预测模式、残差(去除空间冗余)
- 选择帧内预测模式
- 叠加残差
- P/B帧进行帧间预测,最终存储帧间预测模式标志位、运动矢量、残差(去除时间冗余)
- 运动估计:宏块查找、匹配 -> 运动矢量
- 运动补偿:叠加残差
- DCT变换、量化,丢弃高频信息(去除空间冗余)
- 滤波,通过滤波修正并提升主观质量
- 熵编码(如:CAVLC、CABAC)压缩最终数据(去除编码冗余)