1.基本概念
1.1 slice
H264标准引入了slice概念,一帧图像可以分成几个slice分别进行编码。这样的好处是可以避免误差扩散。由于slice是单独编码,一幅图像前一个slice出错,不会影响到后一个slice。
如下图所示,一个图像被分成两个slice。
1.2 宏块
H264标准规定slice需要分成16x16大小的块分别编码,这些数据块就是宏块(macroblock)。以YUV420数据为例,一个宏块包含16x16亮度数据块和2个8x8色度数据块。
宏块按照数据编码方式可分为帧宏块和场宏块。
以下图为例,有两个16x16大小宏块mb1、mb2,其中奇数行数据用蓝色线表示,偶数行数据用绿色线表示。帧编码格式不改变原始宏块数据排列方式,直接对宏块编码;而场编码格式会把mb1、mb2的奇数行数据和偶数行数据分别抽出来组成两个新的宏块再分别编码,mb1、mb2称为宏块对。
1.3 PAFF(picture adptive frame/field)、mbaff(mb adptive frame/field)
对于一个slice来说,内部所有宏块可能使用帧编码方式也有可能使用场编码方式。
- 如果一个slice中的宏块存在帧编码和场编码宏块,则slice是MBAFF;
- 如果某个slice所有宏块都是帧编码,则该slice为帧编码slice;
- 如果某个slice所有宏块都是场编码,则该slice为场编码slice;
- 如果视频序列中即存在帧编码slice,又存在场编码slice,则为PAFF。
2.码流结构
H264码流结构如下,可分为以下几层:
- 视频序列层,该层为一个完整的视频压缩码流,包括参数集和视频图像组(GOP);
- GOP层(Group of picture),由多个视频图像组成,包括I、P、B三种类型帧。
- nalu层,包含header和data两部分,header中的nalu_type指明了该NALU类型,比较常见的几种NALU有:sps、pps、slice,其中视频压缩码流都存放在slice。
- slice层,一个或多个slice构成一张图片数据;slice头中包含着slice类型、宏块类型、以及图像参数等信息。
- slice data层,slice data由一个或多个宏块结构组成;
- mb层,宏块是h264编码的基本单元,编码过程中整个图像会划分成16x16大小的单元,也就是宏块,它包含着每一个像素的亮度和色度信息,分别对宏块数据残差编码得到最终码流信息。
- 残差层,残差数据是最终视频编码的码流数据,通过对残差数据解码可以恢复原始图片。