前言
本节重点讲解了 H.264 编码以及 AAC 编码,在对其进行讲解前先介绍了视频编码的实现原理。
一、视频编码的实现原理
1、视频编码技术的基本原理
编码就是为了压缩。要实现压缩,就要设计各种算法,将视频数据中的冗余信息去除。
种类 | 内容 | 压缩方法 |
空间冗余 | 像素间的相关性 | 变换编码,预测编码 |
时间冗余 | 时间方向上的相关性 | 帧间预测,运动补偿 |
图像构造冗余 | 图像本身的构造 | 轮廓编码,区域分割 |
知识冗余 | 收发两端对人物的共有认识 | 基于知识的编码 |
视觉冗余 | 人的视觉特性 | 非线性量化,位分配 |
其他 | 不确定因素 |
视频编码技术优先消除的目标,就是空间冗余和时间冗余。
2、视频编码技术的实现方法
视频是由不同的帧画面连续播放形成的。这些帧,主要分为三类,分别是:
- I 帧
- 是自带全部信息的独立帧,是最完整的画面(占用的空间最大),无需参考其它图像便可独立进行解码。视频序列中的第一个帧,始终都是 I 帧。
B 帧
- “双向预测编码帧”,以前帧后帧作为参考帧。不仅参考前面,还参考后面的帧,所以,它的压缩率最高,可以达到 200:1。不过,因为依赖后面的帧,所以不适合实时传输(例如视频会议)。
P 帧
- “帧间预测编码帧”,需要参考前面的 I 帧和/或 P 帧的不同部分,才能进行编码。P 帧对前面的 P 和 I 参考帧有依赖性。但是,P 帧压缩率比较高,占用的空间较小。
- 通过对帧的分类处理,可以大幅压缩视频的大小。
毕竟,要处理的对象,大幅减少了(从整个图像,变成图像中的一个区域)。
3、运动估计和补偿
①、块(Block)与宏块(MicroBlock)
如果总是按照像素来算,数据量会比较大,所以,一般都是把图像切割为不同的“块(Block)”或“宏块(MacroBlock)”,对它们进行计算。
一个宏块一般为 16 像素×16 像素。
②、I 帧、P 帧、B 帧的小结
- 对 I 帧的处理,是采用帧内编码方式,只利用本帧图像内的空间相关性。
- 对 P 帧的处理,采用帧间编码(前向运动估计) ,同时利用空间和时间上的相关性。
简单来说,采用运动补偿(motion compensation)算法来去掉冗余信息。
③、I 帧(帧内编码)
需要特别注意,I 帧(帧内编码),虽然只有空间相关性,但整个编码过程也不简单。
如上图所示,整个帧内编码,还要经过 DCT(离散余弦变换)、量化、编码等多个过程。
- RGB 转 YUV:固定公式
- 图片宏块切割:宏块 16x16
- DCT:离散余弦变换
- 量化:取样
- ZigZag 扫描:
- DPCM:差值脉冲编码调制
- RLE:游程编码
- 算数编码:
④、如何衡量和评价编解码的效果
一般来说,分为客观评价和主观评价。客观评价,就是拿数字来说话。例如计算“信噪比/峰值信噪比”
一般来说,分为客观评价和主观评价。
- 客观评价,就是拿数字来说话。例如计算“信噪比/峰值信噪比”。
- 主观评价,就是用人的主观感知直接测量。
二、H.264 编码基础
1、H.264 快速入门
①、视频编码标准化组织
从事视频编码算法的标准化组织主要有两个,ITU-T 和 ISO。
- ITU-T,国际电信联盟——电信标准分局,主要制定了 H.261/H263/H263+/H263++ 等标准
- ISO,国际标准化组织,主要制定了 MPEG-1/MPEG-4 等
比如 MPEG-2、 H.264/AVC 和 H.265/HEVC 等。不同标准组织制定的视频编码标准的发展如下图所示:
②、视频压缩编码的基本技术
视频信息之所以存在大量可以被压缩的空间, 是因为其中本身就存在大量的数据冗余。
其主要类型有:
- 时间冗余:视频相邻的两帧之间内容相似,存在运动关系
- 空间冗余:视频的某一帧内部的相邻像素存在相似性
- 编码冗余:视频中不同数据出现的概率不同
- 视觉冗余: 观众的视觉系统对视频中不同的部分敏感度不同
针对这些不同类型的冗余信息,在各种视频编码的标准算法中都有不同的技术专门应对,以通过不同的角度提高压缩的比率。
<1>、预测编码
预测编码可以用于处理视频中的时间和空间域的冗余。
视频处理中的预测编码主要分为两大类:帧内预测和帧间预测。
- 帧内预测:预测值与实际值位于同一帧内,用于消除图像的空间冗余;帧内预测的特点是压缩率相对较低,然而可以独立解码,不依赖其他帧的数据;通常视频中的关键帧都采用帧内预测。
- 帧间预测:帧间预测的实际值位于当前帧,预测值位于参考帧,用于消除图像的时间冗余;帧间预测的压缩率高于帧内预测,然而不能独立解码,必须在获取参考帧数据之后才能重建当前帧。
通常在视频码流中,I 帧全部使用帧内编码,P 帧/B 帧中的数据可能使用帧内或者帧间编码。
<2>、变换编码
所谓变换编码是指,将给定的图象变换到另一个数据域如频域上,使得大量的信息能用较少的数据来表示,从而达到压缩的目的。
目前主流的视频编码算法均属于有损编码,通过对视频造成有限而可以容忍的损失,获取相对更高的编码效率。
而造成信息损失的部分即在于变换量化这一部分。
在进行量化之前,首先需要将图像信息从空间域通过变换编码变换至频域,并计算其变换系数供后续的编码。
在视频编码算法中通常使用正交变换进行变换编码,常用的正交变换方法有:离散余弦变换(DCT)、 离散正弦变换(DST)、K-L 变换等。
<3>、熵编码
视频编码中的熵编码方法主要用于消除视频信息中的统计冗余。
由于信源中每一个符号出现的概率并不一致,这就导致使用同样长度的码字表示所有的符号会造成浪费。
通过熵编码,针对不同的语法元素分配不同长度的码元,可以有效消除视频信息中由于符号概率导致的冗余。
在视频编码算法中常用的熵编码方法有变长编码和算术编码等,具体来说主要有:
- UVLC(Universal Variable Length Coding):主要采用指数哥伦布编码
- CAVLC(Context Adaptive Variable Length Coding):上下文自适应的变长编码
- CABAC(Context Adaptive Binary Arithmetic Coding):上下文自适应的二进制算数编码
根据不同的语法元素类型指定不同的编码方式。 通过这两种熵编码方式达到一种编码效率与
运算复杂度之间的平衡。
③、VCL NAL
视频编码中采用的如预测编码、变化量化、熵编码等编码工具主要工作在 slice 层或以下,这一层通常被称为“视频编码层”(Video Coding Layer, VCL)。
相对的,在 slice 以上所进行的数据和算法通常称之为“网络抽象层”(Network Abstraction Layer, NAL)。
设计定义 NAL 层的主要意义在于提升 H.264 格式的视频对网络传输和数据存储的亲和性。
④、档次与级别
为了适应不同的应用场景,H.264 也定义了三种不同的档次:
- 基准档次(Baseline Profile):主要用于视频会议、可视电话等低延时实时通信领域;支持 I 条带和 P 条带,熵编码支持 CAVLC 算法。
- 主要档次(Main Profile):主要用于数字电视广播、数字视频数据存储等;支持视频场编码、B 条带双向预测和加权预测,熵编码支持 CAVLC 和 CABAC 算法。
- 扩展档次(Extended Profile):主要用于网络视频直播与点播等;支持基准档次的所有特性,并支持 SI 和 SP 条带,支持数据分割以改进误码性能,支持 B 条带和加权预测,但不支持 CABAC 和场编码。
CAVLC 支持所有的 H.264 profiles,CABAC 则不支援 Baseline 以及 Extended profiles。
⑤、常见编码器
H.264 是一种视频压缩标准, 其只规定了符合标准的码流的格式, 以及码流中各个语法元素的解析方法。H.264 标准并未规定编码器的实现或流程,这给了不同的厂商或组织在编码实现方面极大的自由度, 并产生了一些比较著名的开源 H.264 编解码器工程。
其中 H.264 编码器中最著名的两个当属 JM 和 X264, 这二者都属于 H.264 编码标准的一种实现形式。
JM encoder 实在太慢了,x264则相当快.