上一节简单介绍了什么是封装格式以及音视频编码的几种方式,从本节开始,着重介绍H.264的编解码原理。
说到H.264,首先不得不提到作为奠基鼻祖的H.261,其主要的贡献有:
1.帧内编码
第一次根据帧内的像素趋于统一而采用帧内预测编码技术
2.帧间编码(运动补偿)
使用以宏块为基础的运动补偿预测编码技术,从当前宏块参考帧中产生最佳匹配宏块
3.环路滤波器
实际上是一个数字低筒滤波器,滤除不必要的高频信息
4.块结构的混合编码
第一种采用“块结构的混合编码”方案的编码标准
本节主要介绍帧内编码原理。
H.264数据的来源
上一节讲到,摄像头等中采集的视频数据必须通过编码后才能保存,那么从摄像头采集的数据是如何变成编码成H.264数据的呢?
以摄像头为例,如下图,摄像头采集的一帧画面需经过视频信源编码器、视频复合编码器和传输缓冲器后,再经过传输编码器进行编码,就得到H.264码流数据,本章主要围绕这张图来展开说明。
而解码H.264则刚好与编码相反:
下面一一解释这几个编码器都做了什么?
一、信源编码器:
视频帧首先会经过信源编码器,信源编码器会将帧数据切割为一个一个的小块,称为宏块,H.264默认采用16*16大小的区域作为一个宏块,也可以划分为8*8,这是基于帧的空间冗余度而根据其内部算法决定的。
空间冗余度:
以下图为例,摄像头中采集的蓝色天空颜色大致是相同的,因此所造成的冗余比例成为空间冗余度。所以没有必要将每一个像素都保留下来
如下图,假如其中一个区域被划分为了8*8的宏块(NAL)
在这个宏块中,只需要保留上侧8个像素、左侧7个像素和帧内预测数据,就可以预测整个宏块的数据,大大缩小数据量
帧内预测有如下图8个方向和一个取平均,分别为:垂直、DC(平均值)、水平、下左对角线、下右对角线、右垂直、下水平、左垂直、上水平
为了获得更高的压缩率,还可以在宏块的基础上继续划分出更多的子块,以16*16宏块为例,子块的大小可以是8*16、16*8、8*8、4*8、8*4、4*4,非常的灵活
注:
1. 一个宏块的预测方向只有一个
2. 所有H.264编码的视频的宽高一定是最大宏块的倍数(16的倍数)
3. 越大的宏块越多,压缩比越高
这里可以推算一下第3个结论:
如果16*16的宏块越多,拿单个宏块来说,原数据像素数:16*16=256,宏块记录的像素:上侧:16,左侧:15,一共只需要31个像素,节省了256-31=225个像素
如果4*4的宏块越多,拿单个宏块来说,原数据像素数:4*4=16,宏块记录的像素:上侧:4,左侧:3,共7个像素,节省了16-7=9个像素
由此可以印证第3个结论
二、视频复合编码器:
经信源编码器划分的宏块会交给视频复合编码器,视频复合编码器会将宏块上侧、左侧的像素数据和预测方向数据记录下来,交给传输缓冲器。
三、传输缓冲器:
传输缓冲器主要将前面步骤产生的B帧暂时缓冲在传输缓冲器中,直到获取到I帧或者P帧时,一起输出到传输编码器中生成H.264码流。
注:
这里重新将上图放下来作为解释:
当第一帧I帧从传输缓冲器输出后,随后的B帧会暂时缓存在传输缓冲器中,直到编码出I帧或者P帧到达传输缓冲器,缓冲其中的B帧会依次经编码控制重新经过视频编码器->视频复合器->跟在P帧后从传输缓冲器中输出。这也是后面要讨论的解码顺序和播放顺序不同的根源所在。
本节主要介绍了H.264的帧内编码原理,以及在生成H.264过程中各编码器起到的作用,下一节介绍H.264的帧间编码原理