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帧
IDR帧: 解码器立即刷新帧。IDR帧属于I帧,每当遇到IDR帧时,解码器就会清空解码器buffer中的内容。- 每个
GOP中的第一帧就是IDR帧
GOP解码流程
对于上面这张图的解码步骤
- 先解第一个
I帧 - 通过第一个
I帧解码第一个P帧 - 通过第一个
I帧和第一个P帧解码前三个B帧(B帧之间无关联) - 通过第一个
P帧解码第二个P帧 - 通过第一个
P帧和第二个P帧解码4-6个B帧 - 以此类推,完成整GOP的解码
宏块
宏块是视频压缩的基本单元,无论帧内压缩和帧间压缩都是以宏块为基本单元。
宏块就是一个n * n的像素块。如果n比较大,则处理速度快,但是压缩率相对较低。反之,处理速度慢,但是压缩效率相对更高。
H264压缩技术
帧内压缩: 解决空域数据冗余问题。独立压缩某一帧的数据,例如图片的背景都是蓝色的,那么整个背景可以用很小的数据量存储。帧间压缩: 解决时域数据冗余问题。利用其他相关帧的变化进行压缩,例如P帧通过I帧可以压缩计算得到。DCT 整数离散变换: 通过频域将有数据的部分去除CABAC压缩
帧内压缩技术
理论基础: 1.相邻宏块之间的差距不大 2. 人类对色度的感应程度小于亮度(yuv数据可以把亮度和色度分开)
帧内预测:简化宏块中帧的方法
有9种模式,哪种模式最接近原色度,就选用哪种模式
最后通过残差值补充色差
帧间压缩技术
理论基础
- GOP中的各个帧环面近似
- 存在参考帧
- 运动估计(通过
宏块匹配,找到运动矢量) - 运动补偿 (通过
残差值补偿估计)
无损压缩
DCT将有用的数据集中过滤
VLC类似霍夫曼树,用的多的数据块(宏块)用短的字符串标识
CABAC前期和VLC类似,后续的数据块越来越小
视频问题分析
视频花屏
如果GOP分组中有P帧或者B帧丢失,则会造成解码错误,产生花屏。I帧丢失则无法解码播放。
视频卡顿
为了避免花屏,当发现丢帧时,播放器丢弃GOP内所有帧,直到IDR帧进行刷新。在这周期中,播放器便会卡顿。
注:本文主要总结自李超老师的音视频课程