h264压缩原理

279 阅读3分钟

h264视频对于YUV数据压缩比大约 100 / 1 这么强大的压缩能力,是如何实现的呢?

GOP (group of picture)

GOP原理: 将画面相近的帧编为1组,比如一个连续动作。这时这些帧的大量像素都是相同的。存储这一串连续帧的大小将大大减小

编码帧知识点

编码帧的分类

  • I帧 (intraframe frame):关键帧,自己独立编码解码,和其他帧无关。采用帧内压缩技术
  • P帧 (forward Predicted frame):向前参考帧。压缩时,只参考前面已经处理的帧,采用帧间压缩技术大小占I帧的一半
  • B帧(Bidirectionally predicted frame): 双向参考帧。压缩时,即参考前面已经处理的帧,也参考后面的帧。采用帧间压缩技术占I帧的四分之一大小

B帧虽然压缩率最大,但是对cpu消耗大。所以在音视频转码压缩的情况下多用B帧,但是在音视频通信,实时传输的场景下多用I帧和P帧

IDR帧

  1. IDR帧: 解码器立即刷新帧。
  2. IDR帧属于I帧,每当遇到IDR帧时,解码器就会清空解码器buffer中的内容。
  3. 每个GOP中的第一帧就是IDR

GOP解码流程

image.png 对于上面这张图的解码步骤

  1. 先解第一个I帧
  2. 通过第一个I帧解码第一个P帧
  3. 通过第一个I帧和第一个P帧解码前三个B帧 (B帧之间无关联)
  4. 通过第一个P帧解码第二个P帧
  5. 通过第一个P帧和第二个P帧解码4-6个B帧
  6. 以此类推,完成整GOP的解码

宏块

宏块是视频压缩的基本单元,无论帧内压缩帧间压缩都是以宏块为基本单元。

宏块就是一个n * n的像素块。如果n比较大,则处理速度快,但是压缩率相对较低。反之,处理速度慢,但是压缩效率相对更高。

H264压缩技术

  • 帧内压缩: 解决空域数据冗余问题。独立压缩某一帧的数据,例如图片的背景都是蓝色的,那么整个背景可以用很小的数据量存储。
  • 帧间压缩: 解决时域数据冗余问题。利用其他相关帧的变化进行压缩,例如P帧通过I帧可以压缩计算得到。
  • DCT 整数离散变换: 通过频域将有数据的部分去除
  • CABAC压缩

帧内压缩技术

理论基础: 1.相邻宏块之间的差距不大 2. 人类对色度的感应程度小于亮度(yuv数据可以把亮度和色度分开)

帧内预测:简化宏块中帧的方法

image.png 有9种模式,哪种模式最接近原色度,就选用哪种模式

最后通过残差值补充色差

帧间压缩技术

理论基础

  1. GOP中的各个帧环面近似
  2. 存在参考帧
  3. 运动估计(通过宏块匹配,找到运动矢量)
  4. 运动补偿 (通过残差值补偿估计)

无损压缩

  1. DCT将有用的数据集中过滤

image.png

  1. VLC类似霍夫曼树,用的多的数据块(宏块)用短的字符串标识

image.png

  1. CABAC前期和VLC类似,后续的数据块越来越小

image.png

视频问题分析

视频花屏

如果GOP分组中有P帧或者B帧丢失,则会造成解码错误,产生花屏。I帧丢失则无法解码播放。

视频卡顿

为了避免花屏,当发现丢帧时,播放器丢弃GOP内所有帧,直到IDR帧进行刷新。在这周期中,播放器便会卡顿。

注:本文主要总结自李超老师的音视频课程