0%

视频压缩技术

与音频压缩编码不同,视频的压缩编码基本都是有损压缩。H.264是多种视频压缩技术的集大成者,其使用技术的还要追溯到H.261。

宏块

宏块是视频压缩操作的基本单元。无论是帧内压缩还是帧间压缩,它们都是以宏块为单位。

宏块是按像素进行划分的。宏块划分得小,压缩的控制力就大一些,处理速度也会降下来。

宏块还可以划分为子块。

宏块划分尺寸:

帧内预测

理论基础:

  • 相邻像素差别不大,可以进行宏块预测。宏块与宏块之间进行比较,而不是像素对比。
  • 人对亮度的敏感度超过色度。YUV 很容易将亮度与色度分离。组合上面的点,可以将亮度与色度区分处理。以下的帧内预测,亮度与色度是区分处理的。

H.264将单个宏块内的像素颜色变化规律规范成了公式,编码时只要写此处应用哪个公式就行了。

1. 选择帧内预测模式

帧内预测模式有9种,通过与目标宏块对比选择最适合的模式,将预测的宏块变成预测模式编号。

2. 叠加残差

帧内预测残差值,通过预测出来的与原始图像进行对比得出。

预测模式信息+残差值。预测得出的图像颜色是基于宏块的,平滑度有限,叠加残差值来磨平这些色差。

帧间预测

对每帧图像压缩,压缩比始终有限,因此提出了对一组图片做消除冗余。

img
  1. 把强相关的帧进行分组,形成GOP(Group of Pictures)。
  2. 进行运动估计(宏块查找/匹配 -> 运动矢量)。这是一个过程,通过宏块匹配,得出运动矢量,最终存储的是初始状态和运动矢量。
  3. 进行运动补偿(解码),补偿的是残差值。

引入基于运动补偿帧间预测算法后,视频中的帧就分为两类:

  • 关键帧:完整的静态图像,可以被直接解码。
  • 预测帧/参考帧:通过运动补偿算法在关键帧之上计算得到。根据帧的依赖方向还可以分为:
    • 预测编码图像帧,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)。

img

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编码流程

img
img
  1. 帧类型分析 -> I帧、P帧、B帧、GOP
  2. 划分宏块及其子块
  3. I帧进行帧内预测,最终存储预测模式、残差(去除空间冗余)
    1. 选择帧内预测模式
    2. 叠加残差
  4. P/B帧进行帧间预测,最终存储帧间预测模式标志位、运动矢量、残差(去除时间冗余)
    1. 运动估计:宏块查找、匹配 -> 运动矢量
    2. 运动补偿:叠加残差
  5. DCT变换、量化,丢弃高频信息(去除空间冗余)
  6. 滤波,通过滤波修正并提升主观质量
  7. 熵编码(如:CAVLC、CABAC)压缩最终数据(去除编码冗余)

参考

欢迎关注我的其它发布渠道