H.264的目标应用涵盖了眼下大部分的视频服务,如有线电视远程监控、交互媒体、数字电视、视频会议、视频点播、流媒体服务等。H.264为解决不同应用中的网络传输的差异。定义了两层:视频编码层(VCL:Video Coding Layer)负责高效的视频内容表示,网络提取层(NAL:Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传送。如图3.19所看到的。
图3.19 标准的总体框架 |
基本层次(Baseline Profile):该层次使用了H.264的除了B-Slices,CABAC以及交织编码模式外全部的特性。该层次主要使用于低时延的实时应用场合。
主要层次(Main Profile):包括Baseline profile的全部特性,并包括了B-slices,CABAC以及交织编码模式。它主要针对对时延要求不高,当压缩率和质量要求较高的场合。
扩展层次(Profile X):支持全部Baseline profile的特性,但不支持CABAC以及基于宏块的自适应帧场编码。该层次主要针对的时各种网络视频流传输方面的应用。
CABAC
CABAC是基于内容的自适应二进制算术编码,当參数entropy_coding_mode设置为1时,一个算术系统被用来编码和解码H.264的语法元素。
H.264採用两种方法进行熵编码:CAVLC编码和CABAC编码算法。採用基于上下文的自适应二进制算术编码算法(CABAC),可以充分利用上下文信息和算术编码的长处,使得编码后的平均码长更逼近图像的信息熵,达到最佳的编码效率。採用CABAC算法进行编码,可以提高大约10%的编码率
详细编码步骤:
1二值化:CABAC使用二进制算术编码,所以要将数据先转换为二进制数据,这些原始数据包含变换系数和运动矢量等。转换后二进制数据为可变长编码的数据,而且还要将这些数据进行算术编码。
2内容模式选择:内容模式是针对二进制数据进行统计的概率模型,这个模式依据之前编码的一些数据符号的统计特性从一些可选模式中选出。内容模式存储了每一位“1”或“0”的概率。
3算术编码:算术编码器依据选择的内容模式对每一位进行编码。
4概率校正:被选择的内容模式依据实际被编码的值进行校正,比如,假设数据比特流中有数值“1”,就将“1”的概率统计值加1。
DCT变换
H.264仍然採用对残差信号进行变换在量化后进行熵编码的模式来压缩空间冗余信息。使用了类似于4x4离散余弦变换DCT的整数变换而不是象MPEG4那样採用8x8DCT的浮点数变换。终于使用那种变换方式还用依据残余数据类型的不同来选择,帧内编码宏块的亮度DC系数(仅对16x16预測模式有效)採用4x4的矩阵,色度DC系数採用2x2的矩阵,对于其它的都採用4X4的块来变换。
使用以整数为基础的空间变换能够提高计算速度(仅仅使用加法和位移运算),可是使用整数变换要以不矢准确度为前提;整数变换的反变换过程中不会出现较大的误差,而且缩放矩阵的乘法集成到了量化中,减少了乘法的总次数。
(1)4×4亮度分量的直流系数变换
假设宏块被编码为16×16帧内模式,则每一个4×4残差块首先用前面叙述的变换进行变换,然后对于每一个4×4的变换后的直流(DC)系数进行4×4的二次变换,採用Hadamard变换。
正变换为:
当中A是变换核矩阵
a=1/2
(2)2×2色度块的DC系数变换
每一个宏块内的4个4×4色度块经过变换后,每一个块的DC系数构成了一个2×2的块WD,对其进行2×2的Hadamard变换。
正变换的公式为:
反变换公式为:
(3)如图3.18所看到的,展示了宏块中的变换块及其传送顺序。编号为-1的块在採用Intra16x16模式编码时0-15号4x4子块经整数DCT变换后的DC系数在经4x4的哈达变换的结果。块16、17是色度块的DC系数进行2x2哈达码变换的结果。其余的24块则进行4x4整数变换。
图3.20 宏块中的变换及其传送顺序 |
多种运动补偿块
有7种形状的运动补偿可供选用,这7种块是:INTER16x16,INTER16x8,INTER8x16,INTER8x8,INTER8x4,INTER4x8,INTER4x4。依据运动补偿採用的块尺寸的不同,宏块的编码模式分为四种,前三种模式分别依照一个16x16块、两个16x8块和两个8x16块来进行运动补偿;最后一种模式记作P8x8,在P8x8模式下,一个宏块被分为4个8x8的子块,而每个子块又有4种可能的子模式,分别依照一个8x8块、两个8x4块、两个4x8块及四个4x4块进行运动补偿,如图3.19所看到的,第一行是宏块四种模式,第二行是子块四种模式。
图3.21 宏块划分方式 |
块大小的选择是否合理对于压缩效果的好坏有非常大的影响,通常来说,对于变化缓慢的部分採用较大分块效果比較好,对于包括较多细节的部分则应该採用较小的分块方式。
1/4像素精度运动预计
帧内编码宏块的每一分块都是由參考帧中同样大小的区域预測得到。这两个区域之间的偏移量即运动矢量。因为图像的运动不可能总是整像素的。因此引入了亚像素运动矢量。对亮度分量,运动矢量的分辨率为1/4像素。因为參考帧中本身不可能存在亚像素採样点,因此须要利用其临近像素内插产生亚像素採样点。亚像素採样点的内插产生过程,如图3.20所看到的
图3.22 亚像素採样点 |
半像素内插值分别由运动于水平和垂直方向的一维6阶滤波器产生。1/4像素值由整数像素和半像素点求均值取得。
比如:
b=round((E-5F+20G+20H-5I+J)/32) a=round((G+b)/2) e=round((b+h)/2) |
因为亮度分量中的1/4像素精度运动矢量将在色度分量中产生1/8像素精度。因此,採用线性内插法产生1/8像素採样点。
a=round(([(8-dx).(8-dy)A+dx.(8-dy)B+(8-dx).dyC+dx.dyD]/64) |
图片切割
H.264支持slice结构的图片切割。一个slice有一帧图片内的若干宏块组成。编码器端对slice种包括的宏块数目没有限制。一个slice能够仅包括一个宏块也能够包括该帧中的全部宏块。然而,不论什么一个宏块都仅仅能包括在某一个slice中,不同意反复出现(在冗余slice方法中例外)。
採用slice结构的主要动机是使编码的slice大小能适应不同的MTU大小。当它同一时候能应用于交叉打包等方法的实现方案中。
多參考帧选择
多參考帧选择在之前的一些视频编码标准中也能够得到应用。该方法尤其使用于具有反馈机制的系统中。但在时延要求较高的应用中意义不大。
与以往标准的P帧、B帧不同,H.264採用了前向与后向多个參考帧的预測
数据分快
通常,宏块中素有的码元都是被编码在单一的比特串中的。数据分块则为每个slice创建多个比特串。
在H.264中,使用了三种不同类型的数据分块。
头信息块,包含宏块类型,量化參数,运动矢量。这些信息是最重要的,由于离开他们,被的数据块种的码元都无法使用。该数据分块称为A类数据分块。
帧内编码信息数据块,称为B类数据分块。它包括帧内编码宏块类型,帧内编码系数。相应的slice来说,B类数据分块的可用性依赖于A类数据分块。和帧间编码信息数据块不通的是,帧内编码信息能防止进一步的偏差,因此比帧间编码信息更重要。
帧间编码信息数据块,称为C类数据分块。它包括帧间编码宏块类型,帧间编码系数。它一般是slice种最大的一部分。帧间编码信息数据块是不重要的一部分。它所包括的信息并不提供编解码器之间的同步。C类数据分块的可用性也依赖于A类数据分块,但于B类数据分块无关。
当採用数据分块方式的时候,源编码器将不通类型的码元放到三个不同的比特缓冲器种此外,slice大小也须要调整,以使最大数据分块不会大于最大的MTU尺寸。以此,对数据分块进行操作的是源编码器而不是NAL。
在解码器端,在開始正确解码之前必须获得全部数据分块信息。然而,假设帧间或帧内编码数据块信息丢失了,头信息仍然可以有效地应用于提高差错恢复效率。头信息种包括宏块类型,用动矢量等信息,因此可以据此较高质量地复制信息。而只丢失了一些图像纹理信息。
參数集
序列參数集包括与一图片序列相关地全部信息。图像參数集包括与图像中全部slice相关地信息。在解码器端能够存储多个不同地序列和图片參数集。编码器能够选择适当地图片參数集,图片參数集本身又包括所引用地序列參数集信息。
參数集的创造性应用极大地提高了错误恢复性能。在容错环境中使用參数集地关键是确保參数集能可靠并及时地到达接受端解码器。一次能够用频带外可靠通讯控制协议传送參数集,并确保在解码器从实时通讯信道接收到第一个须要參考该參数集地slice数据之前送达。或者也能够在频带内传输,但必须採用一些应用层保护措施(比如传送一參数集地多个复制,以提高至少一个拷贝究竟目的地地概率)。第三中方案是在编码器和解码器端预先放置一些參数集,编解码器都必须在当中选择參数集。
可变宏块排序
可变宏块排序(FMO,Flexible Macroblock Ordering)能够在Baseline和Ext4ended模式中使用,但不同意在Main模式重使用。可变宏块排序同意将宏块不依照扫描顺序分配给slice。详细地分配策略由一宏块分配映射图(MBAmap)规定。在slice内,宏块仍然依照正常地扫描顺序编码。
该特性提供了一种将一帧图像中的宏块分配到多个slice中的模式,每一个slice都是一个独立的编码单位,不管是帧间还是帧内编码都不能越界,假设在传输过程中出现数据丢失的情况,能够利用已接收到的宏块数据来对丢失的宏块数据进行恢复。
图3.23 可变宏块编码顺序 |
slice
slice是一个类似于H.263中图像组(GOP)的概念,一个slice是由一系列按光栅扫描顺序排列的宏块组成。普通情况下每一个宏块均包括一个16×16 的亮度阵列,当视频格式不是单色时,还包括和两个对应的色度阵列。假设没有使用宏块自适应帧/场解码,每一个宏块代表图像中的一个空间矩形区域。比如,如图3.22所看到的,一幅图像被分为两个条带。
图3.24 slice对象 |
每一个slice都是一个独立的编码单位,不管是帧间还是帧内编码都不能越界。冗余slice同意编码器在同一数据流中嵌入同一slice中宏块地一个或多个冗余表示。这样的做法和传输层冗余技术,比如包复制等,关键差别是在冗余slice中宏块地冗余表示能够使用不同地编码參数编码。比如,首先要表示能够使用相对较低的量化系数以获得较低的图像质量,而在冗余表示中能够用相对较高的量化系数以降低比特数。当解码器正确接受到首要表示时,将冗余表示丢弃。而假设首要表示因为包丢失等原因无法正确获得,能够用冗余表示中地信息将对应slice数据恢复。冗余slice
最初是为支持高差错无线通信环境而引入的,但在基于IP的环境中相同有效。
通过块匹配预计运动的方法
全然抵消全部运动的运动补偿器将产生非常好的预測帧,以至于实际上在区别图片中不会存在不论什么功率。我们须要相对较多的数据以具体描写叙述运动,可是仅仅须要相对教少的数据,以描写叙述区别帧。无可否认,甚至使用艺术技术也不可能从一般的帧源中识别和測量不论什么对象的运动。我们不得不满足于简化图片模型,比如常常使用的块匹配技术。除了次优的运动补偿之外,区别图片所需的数据速率比没有运动补偿所需的速率要小非常多。进一步而言,我们的优势是特别简单,因而节省描写叙述运动所需的位数。这在部分程度哂纳感弥补了区别图片的信号功率的不足,这样的信号没有全然最小化。
使用块匹配技术的运动预计器
在数据压缩中,块匹配运动预计器能够随意处理每一个新帧,使其用大小同样的直接相邻的对象进行传送。另外,对象只能在2维平面上在一个方向上统一地移动。因而,被传输的帧被切割为一系列矩形图案块,它们是连续产生的。运动预測器如果图案块只能在x和y方向上移动一个最大值。对于每一个图案块,存在一个搜索区域,依据基本模型,在先前帧的这个区域内能够找到那个图案块。在使用等长步长的情况下,图案块逐渐移动通过搜索区域内的连续位置,而且每一个位置都和旧图片进行比較。
位置变换也称为位移,假设某个位移达到了最佳的相似性或匹配结果,则它称为搜索后运动。然后,运动补偿帧的块将填充属于先前帧的块的内容,这将和前面搜索的图案块产生最佳的匹配。通过这样的方式,运动补偿帧能够和瞬态帧尽可能地接近。
位移中的x和y成分通过側向通道而传送到接受器,目的是能够从旧帧中构造运动补偿帧。对先前帧的内容运行这个操作,从而对已知图片进行这个操作,这就是这样的编码技术的本质长处。
向量的数据速率取决于查找区域的带,从而取决于最大的位移,以及期望的向量的精确程度。对象的轮廓没有必要传送,原因是全部的对象具有同样的矩形。
P图像的VLC编码
VLC是可变长编码,VLC是统计编码技术,它的基本思想是:对出现频率较高的数值分配比特数较少的码字,而对出现频率较低的数值分配比特数较多的码字,因此从总的效果看,数据量比用均匀分配比特数的数据量要少。可变长编码是对Huffman编码的改进
P图像是參考过去的帧内图像或者过去预測得到得图像用运动补偿预測技术进行编码,P图像得编码也是以图像宏块为基本编码单元。预測编码得 基础是运动估值,它将直接影响到整个系统得编码效率和压缩性能,因此希望找到一种预測精度高同一时候计算量又小得运动估值算法。
正如I画面一样,每一幅P画面被分为一片或多片,每一片又被划分为若干宏块。对P画面的编码要比I画面复杂的多,由于要构造运动补偿宏块。运动补偿宏块与当前宏块的差值被一个二维的DCT变换为8x8的变换系数矩阵,这些系数在被量化成一组量化系数,最后,对量化后的系数採用行程长度技术编码。表3.11和3.12分别给出了P画面和B画面中所支持的宏块类型及VLC编码。
表3.11 P画面中的宏块类型及VLC编码
宏块类型 |
VLC码 |
INTRA |
MOTION FORWARD |
CODED PATTERN |
QUANT |
pred_mc |
1 |
0 |
1 |
1 |
0 |
pred_c |
01 |
0 |
0 |
1 |
0 |
pred_m |
001 |
0 |
1 |
0 |
0 |
intra_d |
0001 1 |
1 |
0 |
0 |
0 |
pred_mcq |
0001 0 |
0 |
1 |
1 |
1 |
pred_cq |
0000 1 |
0 |
0 |
1 |
1 |
intra_q |
0000 01 |
1 |
0 |
0 |
1 |
skipped |
无 |
表3.12 B画面中的宏块类型及VLC编码
宏块类型 |
VLC码 |
INTRA |
MOTION FORWARD |
MOTION BACKWARD |
CODED PATTERN |
QUANT |
pred_I |
10 |
0 |
1 |
1 |
0 |
0 |
pred_ic |
11 |
0 |
1 |
1 |
1 |
0 |
pred_b |
010 |
0 |
0 |
1 |
0 |
0 |
pred_bc |
011 |
0 |
0 |
1 |
1 |
0 |
pred_f |
0010 |
0 |
1 |
0 |
0 |
0 |
pred_fc |
0011 |
0 |
1 |
0 |
1 |
0 |
intra_d |
0001 1 |
1 |
0 |
0 |
0 |
0 |
pred_icq |
0001 0 |
0 |
1 |
1 |
0 |
1 |
pred_fcq |
0000 11 |
0 |
1 |
0 |
0 |
1 |
pred_bcq |
0000 10 |
1 |
0 |
1 |
1 |
1 |
intra_q |
0000 01 |
1 |
0 |
0 |
0 |
1 |
skippde |
无 |
每一帧B画面被划分成一片或多片,每一片又被划分为若干宏块。因为要构造几种类型的运动补偿宏块:前向、后向、插播,所以对B画面的编码要比对P画面复杂的多。首先用一个二维DCT将运动补偿宏块与当前块之间的差值变换为8x8的变换系数矩阵,然后对着些系数进行量化,产生一组量化的系数,最后对这些量化后的系数用行程长度技术进行编码。
编码器不须要存储解码的B画面,由于B画面不用于运动补偿。
B画面宏块比P画面多了 几种类型,假设仅有前向运动矢量,则像P画面那样,从前面的一帧画面种构造运动补偿宏块。假设仅有后向运动矢量,则从后面的一帧画面种构造运动补偿宏块。假设既有前向也有后向运动矢量,则从前面以及后面的画面种构造运动补偿宏块,对结果求平均,用以形成插补宏块。
如同须要存储I画面一样,编码器也须要存储解了码的P画面,一位该P画面非常可能会作为运动补偿的開始点。因此,编码器将要从量化系数种重构该画面的图像。
H.264所支持的帧编码模式如表3.13所看到的。
表3.13 帧编码模式
帧类型 |
描写叙述 |
支持的框架 |
I(Intra) |
仅仅包括帧内预測的宏块(I) |
所有 |
P(Predicted) |
包括帧间预測宏块(P)和I型宏块 |
所有 |
B(Bi-Predictive) |
包括帧间双向预測宏块(B)和I型宏块 |
扩展和主 |
SP(Switching P) |
利于在编码的比特流中切换,包含I和P宏块 |
扩展 |
SI(Switching I) |
利于在编码的比特流中切换,包括SI宏块(一种特殊的帧内编码宏块) |
扩展 |