前言
H.264/AVC 也可以叫做 H.264/MPEG-4 part 10 AVC ,这是一个联合名字,H.264 冠的是 ITU-T 的名称,AVC(Advanced Video Coding) 冠的是 ISO-IEC 的名字。 是国际电信标准化部门( ITU Telecommunication Standardization Sector )。ITU-T 最早是叫 CCIT,是一个法语名称的缩写。 是国际标准化组织-国际电工委员会(International Organization for Standardization and the International Electrotechnical Commission)。
ITU-T 和 ISO-IEC 是两个不同的国际标准组织,H.264/AVC 为什么要冠以两个组织的名称呢?因为在 2001 年的 12 月, ITU-T 的 VCEG(Video Coding Experts Group)和 ISO-IEC 的 Moving Picture Experts Group(MPEG)联合成立了一个新的机构叫 JVT(Joint Video Team),就是这个新的组织 JVT 于 2003 年 3 月 发布了 H264/AVC 视频编码标准。
说到 ITU-T VCEG 和 ISO-IEC MPEG 联合发布了 H264/AVC,那么他们是不是单独发布过自己的标准呢?那我们在简单分析一下这两国际标准组织研究视频压缩标准的历史。
视频压缩标准的历史
我们用一个里程碑图展示一下 ITU-T VCEG 组织和 ISO-IEC MPEG 组织发布视频压缩标准的历程:
从图中可以看出,ITU-T 于 1984 年发布第一个视频压缩标准 H.120,后续依次发布了 H.261、H.262、H.263,H.263+、H.264、H.265。
ISO-IEC 于 1993 年发布了 MPGE-1,参考了 H.261,后续一次发布了 MPEG-2 Part 2、MPEG-4 Part 2、MPEG-4 Part 10(AVC)、MPEG-H Part 2。MPEG-X 每一个版本都包含了一系列标准,不仅仅是视频压缩。比如,音频压缩标准,媒体文件格式的定义等。MPEG-4 的系列叫 ,目前来看包含了 28 个部分,感兴趣可以具体了解一下。
有心的你可能发现 MPEG-3 标准,确实没有。我们常说的 可以是一个音乐文件格式,也是音频编码格式,是 MPEG-1 和 MPEG-2 中定义的。
H.262 和 MPEG-2 Part 2 是一个标准,是由 ITU-T 和 ISO-IEC 联合发布的。H.264/AVC,H.265/HEVC 也是这两个组织联合发布的。
了解完历史,我们回归正题,介绍一下 H.264/AVC 的工作原理。
为什么需要视频压缩?
视频播放的本质就是展示一张张图像。如果一秒钟至少连续播放 24 张图像,那么人的眼睛看到的就是连续的视频画面。通过手机或者电脑在线观看视频,首先需要将这些图像通过网络传输到你的电脑或者手机,这需要考虑的一个问题就是视频对网络带宽的占用情况。H.264/AVC 作为视频压缩标准,其主要使命就是降低视频传输的带宽占用,提高传输效率。
真的需要对图像进行压缩吗?我们在 一文中讲到一张 1280 720 用 yuv420p 像素格式表示的图片,其大小是 1382400 bytes。如果把 byte 换算成 bit, 就是 1382400 8 = 11059200 bit,换算成 Mbit 就是是 11 Mbit。假使每秒传 24 张这样的图片,那就是 24 * 11 = 264 Mbit。很明显,就算现在普及的 100Mpbs 的家用网络也无法胜任吧,而对于那些通过 XDSL 宽带上网的老小区用户来说,更是难以想象了。随着网络带宽的不断提高,视频播放、视频监控,人脸识别等各领域对视频的清晰度要求也是越来越高,标清、高清、超高清、4K 等等。这样图像的大小也是越来越大,所以视频压缩不仅是需要的,而且是任重而道远。
对于 H.264/AVC 来说,输入信号是用 yuv420p 像素格式表示的图像,每个luma 和 chroma 分量是用 8 bit 二进制数表示。所以首先需要对 yuv 格式有一个理解,可以参考 一文。
H.264/AVC codec 介绍
视频压缩的基本原理就是去除图像的冗余信息。同一张图像内会有很多冗余的区域,视频的图像序列之间也有很多冗余的区域,视频的帧率越大,冗余度会越大。比如一个演讲视频,演讲人的背景一直保持不变,只有演讲人的位置会发生变化,演讲人的面部表情和亮度会发生变化。
视频帧的变化包括:运动(motion),未覆盖区域,亮度改变。运动变化包括:刚性物体运动(奔跑的汽车,轨迹在变化);可变形物体运动(人的演讲会有站立位置、口型、手势、面部表情的变换);摄像机移动(平移、倾斜、缩放、旋转)。未覆盖区域是由于运动物体没有覆盖场景背景的某一部分。
H.264/AVC 编解码过程:
如图,H.264/AVC 分 encoder 和 decoder 两个部分,我们把他统一叫做 codec,其工作流程如下:
输入视频信号经过预测(Prediction)得到像素数据的残差值(residual))。预测分 帧内预测 和 帧间预测 。
对预测生成的残差值进行变换和量化。变换主要是把信号从时域变换到频域,生成一个变换系数(transform coffient)。量化是对变换后的样本缩小其值得范围,用更少的 bit 来表示样本值。量化器(quantizer) 有标量(scalar)和矢量(vector)之分。
对量化后的样本数据,运动矢量,参数信息进行编码得到 NALU,进行网络传输。
解码器收到 NALU 后做相对编码器相反的工作,最后就可以重建图像。
下来我们重点分析一下图像的划分、帧内预测和帧间预测。变化、量化、编码涉及到很多算法和数学的知识,难以把握,不再分析。
图像划分
H.264/AVC 编码的基本单位是 宏块 (Macro Block),所以图像的预测首先是从划分开始的。如下图:
通常所说的 都是独立的图像,不过 P 帧需要前向参考,B 帧需要双向参考。H.264/AVC 把一张图像划分成粒度更细的一个或者若干个分片(slice)。一个 slice 是由一个宏块序列组成。每一个 slice 是自包含的。如果没有用 FMO 的情况一下,图像是按照光栅扫描的顺序划分 slice 的。如果用了 FMO,图像是被分成若干个 slice group,每个slice group 包含若干个 slice。
根据 slice 的编码类型的不同,分如下几种 slice:
I slice :分片内的所有宏块通过帧内预测编码。I slice 内只有 I 宏块。
P slice :分片内宏块可以用帧内预测编码,也可以用帧间预测编码,但是每个预测块最多有一个运动补偿信号。P slice 可以包含 I 宏块、P 宏块。
B slice :除了 P 片的编码类型可以用外,使用帧间预测编码的宏块,每一个预测块可以有两个运动补偿信号。B slice 可以包含 I 宏块、P 宏块、B 宏块。
SP slice :切换 P 片。
SI slice :切换 I 片。
宏块一般是 16 x 16 像素的区域,包含一个 16 x 16 luma 样本和两个 8 x 8 chroma 样本。宏块有 I 宏块、B 宏块、P 宏块之分。
I 宏块通过同一帧内的相邻的已编码样本进行帧内预测。
P 宏块是参考一个已经编码的宏块分区进行预测。
B 宏块是参考一个或两个已经编码的宏块分区进行预测。
下来我们重点看一下帧内预测和帧间预测。所谓的预测(prediction)就是对已经编码的样本(可以是同一个帧内、也可以是参考另外一个帧)通过某种方法计算出一个预测样本值,这个样本值和当前要编码的样本有很多重复的值。用当前样本值减去预测值得到的残差值(residual)会小很多。
帧内预测
帧内预测是根据帧内已经编码的样本,为当前的样本计算出一个预测值,用当前样本值减去预测值得到一个残差值,目的就是为了减少传输的数据量。
H.264/AVC 把图像分成粒度更小的 slice。为此,I 宏块预测只参考同一个 slice 内已经编码的样本。宏块内的相邻样本之间也有很高的关联度。宏块内预测可以进一步可以划分成更小的预测块。对于 luma 样本来说,每一宏块可以分成 4 x 4 像素和 16 x 16 像素两种类型的预测块。前者有 9 种预测模型,后者有 4 种预测模型。前者适合预测图像细节较多的区域,后者适合预测图像叫平滑的区域。帧内预测的时候要参考左边、上边已经编码的样本。帧内预测不会跨越 slice 的,为了保证 slice 的自包含。对于 chroma 样本来说,每一个宏块有 8 x 8 像素的色度预测块。
下来我们以 4x4 预测块为例,进行一个说明:
图一:
图二:
图一中的 A,B,C,D,E,F,G,H,I,G,K,L,M 是已经编码的样本。a,b,c,…,m,n,o,p 是当前 4X4 预测块内的 16 个预测值。
需要注意 A-M 表示已经编码的亮度样本值;a-b 表示当前 4x4 预测块的亮度预测样本值。
仔细观察可以发现 A-M 是在当前预测块的顶端(top)和左端(left),因为光栅扫描的顺序式从左到右,从上到下。
图二中展示了 4x4 预测的 9 中模型。对于模式 2(DC),如果顶端和左端都存在,那么取 A-D,I-L 的算术平均值作为预测值;如果只有顶端存在,那么只取 A-D;如果只有左端存在,那么去 I-L。剩下都是基于某一个方向进行预测的。拿模式 4(diagonal down right)来说,当前 4 x 4 预测块内 d 的计算方法是,d = (B + 2C + D)/4。其他模式的具体计算可以参考此 。
对于 16 x 16 像素的亮度预测来说,分 4 中模型,前三种和 4 x 4 模式一样,只有 mode 3 是自己特有,如下:
0 (vertical)
1 (horizontal)
2 (DC)
3 (Plane)
对于 8 x 8 像素的色度预测来说,也分 4 中模型,类似 16 x 16 像素的亮度预测模型。
帧间预测
帧间预测是根据先前已编码和传输的图片(参考图片)预测亮度和色度样本块的过程。把之前已经编码或者传输的被参考图像叫做 参考帧 。
帧间预测包含以下三部分:
运动估计(motion estimation)是从参考帧中找到一个和当前预测块匹配的区域的过程。
运动补偿(motion compensation)是通过匹配块计算出预测值,从当前块减去这个预测值形成的残值的过程。
运动矢量(motion vector)是当前编码块和预测参考块之间的偏移量。
H.264/AVC 对预测块进一步划分,16 x 16 宏块可以划分成 16 x 16,16 x 8, 8 x 16 , 8 x 8 的若干区域,每个区域叫做宏块分区。8 x 8 的宏块分区,可以分成 8 x 8, 8 x 4, 4 x 8, 4 x 4 的区域,每个区域叫做宏块子分区。
关于如何寻找参考区域,找出最佳匹配,对运动矢量变换、编码等涉及到很多细节内容,就不一一详述。
术语说明
名称 解释说明
VCL Video Coding Layer 视频编码层
NALU Network Abstract Layer Unit,网络抽象层单元
SPS Sequence Parameters Set ,序列参数集
PPS Picture Parameter Set , 图像参数集
IDR Instantaneous Decoding Refresh。立即解码刷新
GOP Group of picture。图像组。
RBSP raw byte sequence payload,原生字节序列有效载荷。
SEI Supplementary Enhancement Information。
FMO flexible macroblock ordering
后记
本文对视频编解码历史,制定视频编解码的两个国际组织之间的关系进行了介绍。对视频编解码的必要性,编解码的基本原理做了一个分析,最后重点分析了视频编解码的第一步工作预测。预测分帧内预测和帧间预测。对于视频的变换、量化、编码涉及到很多算法和细节,尤其近年来各种优化算法越来越多,一时难以呈现,不再详述。
完成编码后的图像包含数据(slice) 和 参数(SPS/PPS), 都会被封装到 NALU 中。NALU 是 H.264 的传输格式,后续有时间再详细分析具体格式。
参考
: "itu-t"
: "iso-iec"
: "mpeg-4"
: "mp3"
: "frame type"
: "prediction"
标签:H.264,AVC