H264编码技术[3]
Posted 柒月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H264编码技术[3]相关的知识,希望对你有一定的参考价值。
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宏块(一种特殊的帧内编码宏块) |
扩展
|
以上是关于H264编码技术[3]的主要内容,如果未能解决你的问题,请参考以下文章
如何将yuv编码为h264,自己编码或者ffmpeg都可以。