当前课程知识点:多媒体技术基础 >  第四章 视频数据的压缩编码 >  4.3 H.264/AVC  >  4.3 H.264/AVC

返回《多媒体技术基础》慕课在线视频课程列表

4.3 H.264/AVC 在线视频

下一节:4.4 H.265/HEVC

返回《多媒体技术基础》慕课在线视频列表

4.3 H.264/AVC 课程教案、知识点、字幕

大家好

我们这一节学习H.264avS编码标准

我们先对H.264

做一个简单的概述

H.264也被称为是MpeG-4的第10部分

简称AVC

那么这个编码标准是由国际电信联盟

就是ITU和国际标准化组织

ISO联合成立的专家组

叫JVT与2003年制定完成的

那么H.264AVC

在保持相同图像质量的条件下

它的压缩性能比MpeG-2提高了50%

比H.263plus和MpeG-4的编码性能提高了30%

但是这些性能的提高

是以计算复杂度的增加为代价的

相比之下

计算复杂度增加了2~4倍

那么H.264

这个编码标准

它能够覆盖非常广泛的应用

从极低比特率的

到高比特率的各类应用

那么它都能够覆盖

比方说

Ip的流媒体应用

标清电视

标准清晰度电视和高清广播电视

以及视频点播

DVD

蓝光光盘

以及实时会话类的业务

那么这样广泛

这样广泛的应用

H.264都能够实施

H.264编码标准

跟其他以前的标准类似

通过对类和级的划分

能够适应各种不同的

配置性能要求

那么在这儿类指的是

编码算法和工具的集合

也就是一个算法集

级对应的就是各种不同的参数

比方说分辨率的限制

码率的限制等

通过类和级的

这样一个设定

那么能够针对于不同类型的应用

满足相应的需求

H.264AVC一共分了4大类

基本类也叫Baseline

主类就是Main

扩展类还有高类

那么这4种类里面

基本类是一种最小的实现

它包含了逐行扫描

I帧编码P帧编码

和cavlc商编码方法

这一类基本的类型

主要针对的是视频会议

可视电话等

这类会话类型的应用

它延时比较小

主类

在基本类的基础上

增加了隔行扫描

B帧编码

以及可以采用CABAC

这种熵编码的算法

主要针对的是广播和存储类

质量要求比较高的

这类视频的编码

扩展类

在基本类的基础上

增加了SPSI的帧类型

那么这两种帧类型

是相对于I帧P帧B帧

有不同的技术含量的

那么同时它允许帧数据进行分割

扩展类主要针对网络视频等

流媒体的这类应用

高类

在前面基本类的基础上

增加了自适应变化块尺寸的

这样子的一个技术

能够自定义量化矩阵

它主要针对的是无损视频编码

和更多YOV格式的

高清视频

也就是说现在的

有一些高质量要求的

高清晰度视频

可以基于H264的高类来进行实现

H.264AVC

一共划分了15个Levels

那么这些级

针对于分辨率

容量

比特率

缓存器的大小

参考帧数的多少

以及解码器处理速度等这方面参数

还有图像的尺寸

那么进行了相应的划分

给出了15个等级

那么图像的尺寸

能够从QCIF到数字影院的

这样子一个分辨率的要求

通过这些级的划分

能够匹配国际上通行的设备

和发送格式的要求

那么对于H.264所支持的范畴

可以通过这样一个表

做一个概括的总结

他范畴分了这4大类

每一类对应的取样结构

以及每个样值的量化比特数

在第二列里头

给出了相应的说明

扫描的方式

有逐行和隔行

不同的扫描方式

以及每一类所具有的特点

和主要的应用

在这张表上都很清楚

那么4大类所采用的这些编码

算法之间的关联关系

我们通过这样子的一个图

能够看得很清楚

在基本类的基础上

那么主类扩展类高类

那么他们所采用的技术的

包含关系

那么在这张图里头

就能够看明白

对于H.264的码流语法结构

我们看一下

264的

而且264的码流

是按照系统层进行分层的

整个分成两层

那么第一层

叫VCL层

就是视频编码层

那么这一层主要是完成

对视频内容的高效编码

第二层叫网络提取层

那么这一层主要负责

以网络所要求的

恰当的方式

为数据进行打包纯叔

也就是说H.264的系统划分

使得在VCL层

只完成

或者是只

面向视频内容的

高效压缩编码

不考虑以什么样的网络进行传输

而在网络提取成

完成

面向网络传输的数据打包

那么通过这样子的划分

使得编码和网络传输呢

有清晰的职责

那么可以各自做好各自的事情

我们可以通过下面这个图

做进一步的了解

在视频编码层

完成了视频的压缩编码之后

那么再送到下面的

网络提取层

来针对不同的传输网络

进行数据的打包

最终完成相应网络上的传输

H.264编码标准与其他标准

采用了很多相同的技术

那么这些技术包括

它仍然采用的是

待运动补偿的预测

和DC变换的这种混合编码方式

那么相同的技术

我们在这可以做一个简单的了解

首先是宏块划分

也采用了16×16的

宏块划分方式

那么传统的亮度和色度

取样格式

也是420

对于运动块

进行了一个矢量的估计

就是要进行块儿的运动矢量估计

对于运动矢量越过图像边界

有相应的算法进行处理

块的大小是可以变的

也就是说在运动补偿的过程中

允许块大小进行变化

采用的是块变换

也就是积块的变换编码

量化仍然采用的是标量量化

帧的类型同样有I帧P帧B帧

和I帧P帧B帧这样子的模式

商编码采用的仍然是变字长的编码的算法

那么他们的编码的流程图

我们看一下

是典型的混合型的这种视频压缩编码的框图

那么跟我们之前所介绍的

基本的视频压缩编码的框图是一致的

里面采用了

变换和量化的方法

来去除空间的冗余

通过帧间预测

来去除时间的冗余

通过商编码的方法来去除统计冗余

也就是说

在三个层面上来

对于视频序列中

存在的冗余信息进行去除

最终达到高效的压缩效果

H.264中采用的新的算法

我们在这可以总结一下

那么采用了多模式

多帧的运动补偿的这种方式

运动矢量的精度

从 H263标准的1/2精度

提升到了1/4的运动矢量的精度

在对B帧进行预测的时候

采用了这种叫B帧预测加权的方式

针对预测的模式

种类增加了很多

能够对于I帧来说

它的空域预测能够到13种

采用了区块效应的环路滤波

而且在正交变换的环节

采用4×4的整数正交变换编码

熵编码的技术

又有了进一步的提升

采用的是条件的熵编码

CAVLC和CABAC两种编码技术

增加了一种新的帧类型

叫sp帧类型

而且在网络层

网络分层的时候

增加了网络适配层就是NAL层

这些都是 H264

相对于其他标准

增加了一些新的算法

我们后面的内容会做相应的介绍

那么这些新的技术

在我们的混合编码的流图中

分布在不同的位置

我们这张图

给出了一个简单的图示

那么在编码环节

采用了4×4的整数

正交变换编码

也可以把它称为是

整数DCT变换

在熵编码环节

采用增强的熵编码

也就是说

采用了条件熵的熵编码方法

在预测的部分

采用多参考帧的预测

而且这个区块效应加在环路中

增加了

帧内预测对于图像

像素块增加了图像预测

而且在运动估计的时候

运动估计所记忆的块的大小

是可以变化的

下面这一节我们介绍

H.264中运动补偿的相关技术

运动补偿的目的

是为了根据图像的内容复杂程度

选择不同的图像块大小

来精确的获得每一个块儿的运动矢量

最终使预测误差更小

那么为了达到这样一个目的

H.264的运动补偿中

块儿的划分是多种多样的

那么多形状多大小的这种子块的划分

带来了预测误差降低的好处

但是更多的小的图像块的划分

可能又会花费更多的比特数

来进行编码

那么实现不同块大小和形状的运动补偿

同时对运算量

也有比较大的提升

所以说运动补偿中

要进行一个均衡

在运动估计中

运动矢量的精度

采用1/4像素的精度

那么相对于以往的运动估计的

相对于以往的视频编码标准来说

那么他的运动矢量的精度提升了

运动矢量精度的提升

1/4精度相对1/2精度

能够获得1.5~2个dB的增益

节省的编码比特率达到20%

也就是说

好处还是很明显

在运动补偿的时候

可以采用7种

变换大小的块儿

把之前标准中的

16×16的宏块

再进一步的划分

那么划分之后

对于每一个子块

进行一个运动矢量的估计

通过这样子的技术

能够提高预测的精度

那么就可以减小预测误差

具体的做法就是水平方向上

就是这7种变换大小的块

可以是完整的16×16的块

还可以在16×16的基础上

进行两个子块的划分

也就是说

16×16的块

垂直划分成

8×16两个块

或者是水平划分成16×8两个块

那么也可以划分成4个8×8的小块

那么每一个4×8的

这样子的图像块

也可以进一步的划分成

8×4、4×8

以及4个4×4的块

那么通过这样子的一个子块的划分

同时在运动补偿中

采用了多参考帧的这种预测模式

可以在预测中

采用多个帧

来完成对当前帧的预测

那么通过这样子的一种多参考帧的预测

能够节省5~10%的比特率

对于在视频序列中出现遮挡

这样子的问题的块儿来说

那么通过多参考帧的预测

能够很好的提升

预测的精度

在B帧的预测中

采用预测加权的方式

也就是说通过前后帧

按照不同的加权系数

来完成对B帧的预测

那么我们来看一下

1/4精度运动补偿

那么我们要得到高精度的运动矢量

就要在整像素的图像块的基础上

进行一个分数像素精度的内插

那么要首先

从整像素内差到1/2像素精度

然后从1/2像素精度

再内插完成1/4像素精度的

这样子的图像块

那么从整像素到1/2像素的内插

一般采用6抽头的滤波器

来得到

那么具体的这是一个F2滤波器

那么6个抽头的F2滤波器

相应的系数

我们这个地方列出来了

那么我们来看右边的这样一张图

灰色的小块对应的就是

原始图像

对应的整像素已知像素的位置

这些灰色块儿上的像素值

是已知的

那么两个灰色块之间的

比方说是这个B这个H还有M这些像素

是属于1/2像素

那么在G和B之间的这个A

对应的就是1/4像素精度

那么A H M S这几个像素的值

通过这种6抽头的滤波器

内插来得到

那么比方说我们的B这一点的值

可以由他所在的这一行

E F G H I J这几个整像素点的像素值

通过内插滤波器来求出

在这儿是进行一个四舍五入

得到最终的半像素点的值

那么这种四舍五入的运算

可以通过这样子的一位运算来完成

所以说内插

还是相对比较容易完成的

那么对于从1/2精度

到1/4精度像素的内插

可以采用线性内插的方式

比方说是A像素

我们可以通过G和B这两个像素

求一个均值

来得到1/4位置上的A的值

那么1/4像素精度的图像

就是通过这种方式来得到的

那么我们来看一下

高精度的运动矢量

相对于整数精度的运动矢量

它对于编码性能的提升

我们通过这样一个对比来看一下

在图中水平方向对应的是比特率

纵轴对应的是PSNL就是我们的

峰值新造比的性能

那么图中的三条线

分别对应的是

对于相同的一个视频序列

采用整像素精度

半像素精度

和1/4像素精度

进行运动矢量估计的时候

那么所得到的性能曲线

我们会看到

1/4像素精度的性能

要比整像素运动估计的性能要提升很多

可变块运动补偿

那么在H.264中

对于运动补偿

所基于的图像块的大小

允许有7种不同类型的大小块划分

我们这个图示中

给出了这7种不同的类型的块

那么基于这7种不同大小的块的划分

就能够针对于

这个图像帧中内容的复杂程度

进行更合理的匹配

那么我们得到的运动矢量的精度就会更高

这样子预测误差就会更小

那么我们在这儿

同样给出了这样子的一个实验的

结果对比图

对于采用不同数量的

运动补偿的图像块

我们看到

最上面一条曲线

对应的是7个块

也就是说H264中所采用的

这种运动补偿的快的方法

相比于只采用一种块的这种方法

那么性能有相应的提升

中间这一条对应的是

采用两种块模式的性能结果

B帧加权的运动补偿

完成B帧预测的时候

允许在多个参考帧中

实现一个加权

也就是说通过多个参考帧

对当前要编码的这个帧

按照不同的贡献率

给予不同的权重值

最终实现对当前B帧的预测

那么这样子能够对B帧的预测更准确

那么对于有B帧参与预测的

这样子的一个编码

编码的序列

和原始的序列

以及传输的序列

它的顺序是有区别的

那么原始的视频序列

顺序和存放的视频序列

顺序是一致的

比方说是

按照01234的顺序来

往后随着时间的推移来排序

那么传输的比特流顺序

是按照编码的顺序来进行的

那么在编码的过程中

首先要进行I帧的编码

然后是P帧的编码

在这两个帧编完之后

才是这两帧之间的B帧的编码

所以说编码的顺序

是跟原始的视频

帧的顺序是不一样的

那么解码的顺序

自然也是不一样的

所以说在有B帧参与的视频编码中

视频的解码是有延迟的

下面这一节我们介绍

H.264编码中的帧内预测部分

在H.264中

允许采用

帧内预测的方法

对于图像块进行一个帧内预测

这一点是跟其他的

早期的编码标准不同的

早期的编码标准

一般是直接对于图像块

进行一个DCT变换

然后后期跟着量化和熵编码

以及相应的预测编码

那么在H.264中

允许对于图像块

进行一个帧内的预测

预测误差再进行后续的DCT变换

那么帧内预测的模式

对于亮度来说

有两类内插方

有两类

帧内预测方式

一类是针对于4×4和8×8的块

一共给出了9种的预测模式

主要针对的是

文理比较丰富的区域

来进行帧内预测

对于16×16的块

只给出了4种的帧内预测模式

主要针对的是平滑的区域

也就是说对于平滑的区域

可以直接采用16×16的

这样子大的这样子的一个块

来选择4种预测模式中的一种来完成预测

而对于一些纹理细节比较多的这些区域

可以采用更小的块

4×4、8×8

这样子块来完成帧内预测

对于细节比较丰富的

这些区域的预测模式

9种模式

我们这个图示中给出了

具体的模式表示

那么在这个模式中

每一个4×4的块儿

根据它纹理特征不同

可以选择不同的预测方向

那么这个预测方向

我们在这给出来标识

这样9种预测方式

我们看一个例子

假设我们现在要对于这个蓝框框出来的

小写的abcd到p

这些字母所描述的这些像素

进行一个预测的话

那么如果小的图像块的纹理

是一个斜对角

这样子的一个纹理方向的话

那么我们就可以按照比方说是

4的这样子的一个右下角的

对角线的纹理方向

按照这个模式来进行预测

那么具体的预测

我们看一下

就是可以基于

IQA这三个已知的像素值

来对我们这个方向上

比方说是A F K P这几个像素进行预测

那么基于这样子的一个

预测表达式

我们可以通过这样子的一个移位

就完成了对这些像素的

一个帧内预测

那么对于4种16×16

这样子的一个宏块级的

帧内预测模式一共有4种

这个模式01234

那么这4种模式

我们这个地方图示

给出了他预测的方向

垂直方向上

是以当前的16×16块

上面相邻的那一块的

对应像素

来完成对当前16×16块的预测

也可以是从0的这个宏块来完成预测

也可以是按照这种平均的DC的

这样子的预测方式来进行预测

也就是说用H和V的像素值求平均来完成

当前的16×16块的预测

也可以是按照这种面的预测方式

也就是我们的mode3的

这种方式进行预测

那么这是264中

对于图像块大小不同

它的帧内预测模式是可选的

那么对于4度块来说

只给出了4种

8乘8的帧内预测模式

那么具体这4种

帧内预测模式

跟刚才我们所看到的

16×16块的

帧内预测模式是类似的

也就是说它也是分成

模式0

模式一

模式二

模式三

那么具体的模式

预测的方法也是一样的

帧内预测

它的性能

我们也给出一个比较

在这儿给出了两条性能曲线

下面这条绿色的是

H.263plus标准

所给实现的性能

上面是264所实现的性能

我们看到

性能上还是有很大的差距

那么这个差距

主要用来体现我们所介绍的

采用多模式的帧内预测

那么对性能的贡献

这一节我们来讨论

H264编码标准中

整数正交变换和量化相关的技术

我们知道在前面我们所介绍的

正交变换编码

基本上视频压缩编码里头

采用的都是DCT变换

DCT变换

是属于一个浮点型运算的变换

编解码端如果采用不同的字长的话

那么就会引起失配的问题

最终造成我们

还原图像质量的损失

所以说

在264编码标准中

对这样一个问题

给出了一些解决的办法

在H264中采用的

变换编码是

正交的4×4的

整数正交变换编码

采用这个变换编码的目的

是为了解决DCT变换的浮点运算

所造成的编解码端

产生失配的这样一个问题

同时也考虑了

在具体视频压缩编码中

图像里面可能有小的物体

我们在前面已经说了

我们H.264编码标准中

采用了更小的图像块的划分

使用了更好的运动补偿

这就意味着

空间的相关性得到了

更进一步的去除

那么在前面环节处理之后

到了正交变换的环节

就不需要再采用8×8

这么大的

正交变换的块

所以说正交变换的块的大小

可以进一步减小

那么H264中

就选择采用4×4的这样子的块大小

那么4×4的块大小

同时可以有效的减弱

重建图像的块效应

采用整数的正交变换

能够很好的降低计算的复杂度

H.264中使用了简单的整数

4×4的正交变换

那么这种正交变换

是对于4×4的DCT变换的

一种很好的近似

一会我们在后面会具体介绍

在整数的4×4正交变换编码中

变换矩阵里只包含着

±1和±2的这样一个运算

所以通过加减的运算

加上一位就可以完成

这样子正交变换

在运算量上

很好的简化

实验的结果显示

虽然在质量上有相应的损失

但是这个损失是可以忽略的

基本上在0.02db

H.264编码器

正交变换和量化的过程

我们从这个图来做一个了解

那么从前端相应的处理环节

完成之后

进入到正交变换这个环节的

是预测误差信号

那么对预测误差信号

进行相应的4×4的变换编码

我们对于亮度和色度

采用了不同大小的

不同方法的

正交变换的编码

那么在具体对于

相应的正交变换编码得到的系数

还有相应的变换的处理

对亮度先进行4×4块大小的正交变换

那么对于所产生的DC系数

在采用4×4的Hadamard变换

进行进一步的

Dc系数的相关性的去除

那么然后才是后续的量化环节

对于色度信号也是一样

采用4×4的整数

正交变换之后

对于每一个变换块的DC系数

也要做进一步的DC系数的

相关去除

那么最后通过量化

得到相应的量化结果送到后续的

熵编码器中来进行

熵编码

那么我们为了很好的理解

正交的整数变换

我们先来对二维的DCT变换

做一个简单的回顾

那么对于二维DCT变换来说

它的变换基

是由cos 函数构成的

在这我们用A来描述

二维DCT变换的正交变换基

那么对于二维DCT变换

它的正反变换

我们可以用矩阵来描述

对于X这样子的输入信号

我们通过这样一个矩阵运算

可以得到对应的变换系数矩阵Y

在表达式中

A是我们离散余弦变换的变换矩阵

反变换中

AT对应的是A的转置矩阵

那么在这样子的二维DCT变换的基础上

我们来讨论

整数正交变换是怎么得到的

那么刚才我们所给出来的

二维DCT变换

它的变换矩阵

我们可以写出来

它是由实数构成的

这样子的一个矩阵

那么对于矩阵

我们看

如果当 N是=4的时候

也就是说4×4的

DCT变换的变换矩阵

我们这儿

具体把它写出来

那么当N=2的时候

同样我们给出来

它的变换矩阵A

在这些变换矩阵中

我们看一下

它包含着cos的这样一个运算

还有1/2根号的运算

所以说都是浮点运算

那么我们对刚才二维DCT变换的变换矩阵

做一个简单的矩阵的分解处理

那也就是说

DCT的正变换

我们可以以4×4作为粒子

来进行一个分解的这样一个处理

把刚才的 A矩阵

进行一个系数分解

那么我们就可以提出这样子的

一个由±1和±2

这些整数所构成的这样一个矩阵

那么那些对应的

也就是说

我们把大A进行分解以后

对应的那一部分包含

一些浮点运算的系数

我们把它归到

我们现在的陈述矩阵里头

用Ef包

把它归到Ef里面

那么 A的转置矩阵

也是同样

这样子我们就形成了这样一个

矩阵运算关系

那么在这儿这个符号

代表的是一个

对应位置上

系数相乘的这样一个运算

也就是说

前面这个括弧里头得到的

矩阵的每一个位置上的值

要跟Ef这个矩阵

对应位置上的值

做一个乘法运算

那么这样子的一种表示

我们把它简化成现在这种形式

所以说

这个H就是这个我们的矩阵

HT就是我们的矩阵

那么这个Ef我们把它用这个矩阵来描述

那么在这个矩阵里面的

这个A和B的取值

我们看一下

这个地方给出它具体的取值

那也就是说

我们把二维的

4×4的DCT变换

通过这样一个矩阵的

这样一个运算

把它表示成了

这样一种形式

那么我们把这一部分

拿出来

它对应的就是我们所说的

4×4的整数正交变化

那么相当于对于输入的一个

4×4的图像块

让它参与这样子的

一个整数的正交变换

得到的变换系数

再去跟Ef这个乘数

矩阵做一个乘法运算

那么这个乘法运算

可以把它归为

我们的后续环节来

跟量化一起完成

那么也就是说

这个地方

我们可以不再

进行正交变换的时候

完成这个乘法这个乘法运算

可以归到我们的量化环节来进行

那么这样我们就有了

4×4的正交整数变换

得到的变换系数矩阵

我们用Y撇来表示

那么对应的反变换

我们这个地方

给出相应的反变换

那么我们通过这样子的一个

从DCT变换到整数变换的

这样子的一个分析推导

我们得到的正交整数变换

它在性能上

跟DCT变换是非常近似的

那么它在运算上

我们看到

变换矩阵只包含±1

±2

也就是说我们通过加减的运算

加上一位的操作

就可以完成

这样子的一个正交变换运算

在运算量上是比较节省的

虽然它会造成一定的

增益的损失

但是损失很小

所以说

是可以忽略不计的

那么264编码中

就是通过这样子的一个正交变换

来代替传统的DCT变换

那么对于亮度系数

也就是说

我们对于每一个4×4的图像块

做了相应的正交变换之后

得到的系数矩阵中

Dc系数

之间有相应的相邻快的DC系数

之间有相应的相关性

那么为了去除这些相关性

同样可以采用

相应的处理方式

那么在264编码中

对于亮度的DC系数

就采用Hadamard变换

来进行进一步的相关性的去除

那么我们16×16的图像块

划分成4×4的块

进行一个整数的正交变换

那么这样子就能够

得到4×4

16个整数的正交变换的系数矩阵

每一个系数矩阵的DC系数

我们拿出来

就可以构成一个

4×4的Dc系数的这样一个矩阵

那么我们对这样子的一个

Dc系数构成的矩阵

采用4×4的Hadamard变换

进行一个变换编码

那么这个是

对应的Hadamard变换的正变换

相应的反变化

那么通过这种方式

对于亮度快的DC系数

进行相关性的去除

那么对于色度块

同样采用这种方式

那么每一个16×16的宏块中

包含两个

8×8的色度快

这样每一个8×8的色度块

就可以有4个4×4的 DC系数矩阵

每一个DC系数矩阵中的DC系数

拿出来就可以构成

相应的2×2的DC系数

这样一个矩阵

那么对于两个色度块中

形成的两个2×2的DC系数矩阵

那么我们用2×2的Hadamard变换

来进行一个变换编码

去除它们的冗余

变换编码之后

得到的变换系数

采用标量量化进行处理

那么基本的标量量化

我们可以用这个表达式来描述

这个里面Q代表的是量化的步长

那么在264编码标准中

定义了52个量化步长

通过52个量化参数

来对应描述

那么这个量化参数

用QP来表示

我们看下面这张表

从0 QP从0到51

对应着52个量化步长

那么量化参数每增加6

对应的量化步长会增加一倍

这样我们在对于视频进行编码的时候

通过调整量化参数

就可以实现

比特流和图像质量之间的一个协调

那么我们在进行码率控制的时候

通常也是直接通过量化参数的调整

来实现对码率的控制

那么为了避免除法运算和浮点运算

刚才我们前面分析了

把DCT变换进行近似

转换用整数增加变换来代替

那么在转换中

有一个乘数矩阵EF那么刚才我们说

E F在具体处理的时候

是把它包含进了我们的量化环节

所以说

在我们的H264的量化环节中

它的量化关系式

是现在我们所看到的

这样一个表达形式

这里面 P F对应的就是

EF矩阵中

对应位置上的放大系数

那么 W I J对应的就是我们

经过前面的

正交整数变换之后

得到的变换系数

那么我们通过相应的量化参数

对它进行一个量化

在量化的同时

我们要把刚才

我们在分解矩阵的时候

出来的乘法矩阵

对应位置上的值

要包含到量化环节中

也就是通过 P F来体现

PF值具体取多少

是跟它所在的位置相关

也就是说

它在不同的矩阵的位置上

它的取值是不一样的

那么这是264中采用的量化技术

那么264中采用了区块效应滤波

滤波器采用的目的

是为了对于块的边界

进行一个平滑

来削弱

基于块的这种编码方法

在块边界上造成的这种像素的跳变

那么我们在去除这种块边界上的

像素跳变的同时

我们不希望模糊

图像中的正常边缘

所以说在264编码中

那么我们的环路滤波技术

要比前期的那些编码标准中

采用的这些区块效应

滤波技术

要有一定的提升

那么264编码中

根据边界两侧的编码信息

比方说你的编码模式

参考帧

还有运动矢量的情况

它规定了5种边界的强度

对于每一个边界

自适应的

来去选择5种边界强度中的

一种来完成

对于边界的一个滤波

比方说两个块

如果是具有相同的运动矢量的话

那么就有说明

这两个块

可能属于同一个运动物体

那么这个时候

我们对这两个块的边界的滤波

就要加以相应的处理

通过针对于不同的情况

选择不同的滤波强度

那么能够对于编码的时候

所引起的这种块效应

那么它的影响能够削弱

同时也能够保留

图像中

原有的边界信息

那么具体在处理的时候

对于亮度块和色度快

它的处理方式

块的大小也是有区别的

那么这个图里面给出了图示

那么在同样的信噪比下

通过采用这种区块效应滤波

能够减小大约是7%到9%的比特率

那么我们这个地方

看到的这两张图

就是采用了区块效应滤波器

和没有采用的一个直观的图的

一个对比

我们看到左边的图

没有采用这种区块效应滤波

所以说图中可以看到很多

这个块的边界

那么右边这张图

块儿的这种边界效益

明显的就减弱了

好下面我们来学习

H264编码中的

熵编码技术

熵编码在混合编码器中

属于编码环节的最后一个环节

那么前期产生的量化系数

以及我们运动估计得到的运动矢量

还有一些控制数据

都要送到熵编码的环节

来完成熵编码

最终形成二进制比特流

那么在H264中熵编码

采用了两种编码方式

那么这两种编码方式

主要是对于量化之后的

残差信号

进行熵编码处理

而对于头部信息运动矢量

和其他的一些跟残差

没有关系的一些控制信息

采用的是指数哥伦布的编码的方式

那么两种熵编码

第一种是基于上下文的自适应变长编码

简称CAVLC编码

那么这一类编码的

编码算法

主要是根据以编码的零块的信息

来为当前的块儿

选择合适的码表

第二种

编码算法是基于上下文的自适应

二进制算术编码

简称CABAC

那么这两种熵编码的方法

都属于条件熵编码

由于这两种编码方法

都是基于上下文信息来实现的

所以说在性能上比之前的

典型的熵编码的方法

性能要提升很多

我们知道对于熵编码的实现

如果信源的统计概率特性

了解得很准确的话

我们的熵编码的效率是

可能提升的

所以说

264中采用的

这两种熵编码的方法

通过基于上下文的相关信息来决策

当前编码块的

这些编码策略

那么能够使

我们的编码效率

得到很好的提升

我们来看一下

CAVLC 熵编码编码技术

在变换编码之后

经过量化

那么量化之后的

4×4的量化系数

或者是2×2的量化系数

首先要经过一个Z字形扫描

把它从二维矩阵

转换为一维的数据序列

然后再送到CAVLC的熵编码环节

那么对于量化之后的4×4的块

我们前面的分析已经了解到

变换系数中

已经包含很多的0

那么通过二维到一维的转换

那么我们就可以采用

游程和幅度的这种编码方式

来有效的对这些编码

变换系数进行表示

那么经过量化之后的系数

除了包含很多零之外

那么它的非零系数

也大多是±1

那么所以说在CAVLC编码中

通过对于±1通过采用zig-zag扫描

把±1这些非0系数

把它集中起来

那么这样子

方便后续的

进一步的处理

量化之后的4×4的块儿

里面包含了0多

±1系数多

而且没有块儿的结束的标志

那么非0系数的数目

我们在后续的编码中

需要进一步的进行处理

而且非0系数

它的幅度值

在接近DC系数的位置

它的幅度值会更大

在高频的这些位置上

它的系数的值会比较小

那么CAVLC编码

就利用了这些特点

根据当前已经编码的

编码块系数来作为依据选择

我们要变换编码的码表

CAVLC熵编码

它的编码步骤

可以总结为下面5步

其实对应的是

我们要编码的5个对象

首先是对非零系数的个数

和尾1的个数进行一个统计

也就是说我们对于非零系数

以及它的幅度值

为±1的这些leveles

进行个数的统计

编码的时候

我们是基于

已经编码的

非零系数的个数

从4个设定的码表中

来选择合适的码表

也就是说在这个环节中

其实体现了

基于上下文的这样一个概念

那么我们统计完当前的变换系数

它非零系数的个数

以及尾1的个数之后

那么我们会根据已经编码的

跟它相邻的

变换系数举证的非零系数的个数

来选择对于当前的

变换系数的编码的码表

对于尾1的正负号

要进行一个编码处理

也就是说

对于尾1的正号

我们要给它

相应的零编码

负号给予1编码

对于其余非零系数的幅度值

我们要进行一个相应的处理

编码就是每个非0系数的幅度值

要编码成一个由前缀和后缀组成的这样一个码字

那么后缀码字的长度

会根据上下文的经验

来进行确定

那么所以在这一步中

也体现了

基于上下文的这样子的一个概念

对于最后一个非0系数

前面0的数量

要进行一个编码

要进行统计

要对最后一个非零系数

前面总的零数要进行一个编码

对于每一个非0系数

前面的0的个数

要进行一个统计

进行一个编码

通过游程来描述

那么这个就是CAVLC编码

它需要处理的5个对象

对应的就是我们编码的5个步骤

那么对于CABAC熵编码来说

它对多个符号

使用了自适应的概率模型

那么这种自适应

主要是基于上下文的关联关系

利用上下文符号之间的相关性

来选择合适的概率模型

为当前的符号

系数序列

进行一个熵编码

而且熵编码中采用的是

二进制的算术编码

我们在前面介绍

哈弗编码和算术编码的时候

都已经知道

算术编码

由于实现的是一种分数级的码

所以说它在性能上

比整数码编码的效率

要有提升的

所以CABAC的性能

从采用二进制算术编码的角度来看

它的性能也比CAVLC要高

所有的语法符号

都转换为二进制的比特流

采用的是最简单的

最快速的自适应的这种机制

那么基于只用查表和移位的方式

来快速的实现二进制的算术编解码

那么这个是CABAC的这个特点

在CABAC编码中

设定了399种预定义的上下文的模式

而且对这些模式

进行了不同的分组

比方说是

第十四到第二十这些模型

主要用来进行

帧间宏块类型的编码

也就是说

在399种预定义的

上下文模式中

进行了分组

不同的组

适合于不同类型的编码

那么基于已经编码的

相邻域的信息

来选择

当前要编码的

上下文的模型

也就是说

根据已经编码的领域信息

来从399种

预定义的上下文模型中

进行一个选择

而且每个上下文模型

要不断的更新

来适应实际的分布

那也就是说

根据所要编码的图像

它的实际的统计特性

来不断的更新

上下文的模型

那么基于这样一个技术

CABAC平均节省的比特率

能够到10~15%

CABAC熵编码

能够获得好的性能

是源于它采用了

基于上下文的这种模型的选择

而且基于本地统计的结果

进行一个自适应的估计

通过算术编码的改进

减小计算的复杂度

所以我们通过这个图

这样一个流程图

对CABAC熵编码做一个简单的总结

那么我们的编码的

所依据的模型

是基于上下文来选择的

那么基于过去获得的条件

来选择一个合适的模型

对于所有的非二进制符号

先要进行一个二进制序列的

这样一个映射

然后根据所提供的模型

进行一个编码

同时要对模型进行一个更新

也就是说

在编码的结束

在编码结束时

要及时的对于上下的模型

进行一个更新

这样子更好地适应

所针对的图像内容

那么这个地方这张图

我们对比了

我们对比了不同的编码标准

它们在性能上的一个差别

从263到

从H.263到H.264

那么我们看到264在性能上

要比前期的这些标准

有很大的提升

直观上来看

这个地方给出了不同编码标准

对于相同的序列

进行不同码率的压缩

我们解码所呈现的

直观的

这样子的一个对比效果

我们看到右边这一列的质量

要比左边这一列的质量

要有明显的提升

那么在这儿是

差不多质量的同一个视频

那么我们用MpeG-2进行压缩

这个地方对应的是

203kbp每秒的

这样子的一个数据量

跟我们用204来压缩

对应的是39K的

这样子的一个数据量来说我们看一下

数据量降低了很多

但是质量没有降低

那么H.264

这个标准

我们前面介绍了

它相应的这些技术 这些技术的采用

使得它的性能相比

其他的视频编码标准有了提升

但是在实际的应用中

仍然出现了一些问题

那么我们来把这些问题

做一个简单的了解

首先宏块个数的爆发式增长

导致了编码宏块的预测模式

运动矢量参考帧的索引

以及量化级等等这些

相应的参数

占用了过多的编码的码字

相比之下

用于残差部分的码字明显的减少

也就是说模式增多了

宏块数量增多了

那么用来表示模式编码模式

运动矢量

以及相应的

相应的辅助参数的这些

编码码字数量增多

真正用于编码残差的部分减少

同时由于我们现在的

图像的分辨率的增加

那么单个的宏块

所表示的

图像内容的信息

也在减小

这样就导致了

相邻的4×4的块

或者8×8的块

经过变换以后

它的低频系数的相似度增加

那么相似度增加

说明它的冗余就增加了

那么这都是我们264

在应用中所遇到的问题

那么由于分辨率增加

那么我们运动矢量的幅度值

也会跟着增加

所以在264中

采用一个运动矢量预测值

对于运动矢量

对于运动矢量差编码

使用的是

哥伦布的指数编码

那么哥伦布的指数

编码的特点是

数值越小

使用的比特数越少

但是对于大幅的

这个图像分辨率很高的这样一个图像

那么它的运动矢量辅助会很大

所以说

性能上用哥伦布指数码

就有所损失

在H264中

采用的一些关键的算法

像CABCA这样子的

基于上下文的熵编码

还有环路滤波

这些技术

都要求采用的是串行的编码

并行处理度就比较低

而现有应用比较广的

像GPU DSP FPGA ASIC这些

并行化程度非常高的这些平台

那么在这个平台上

进行264编码的实现

就制约了这些平台

并行性能的发挥

所以说

这一系列的H264编码标准

在实际应用中

所遇到的这些问题

那么催生了我们新的编码标准

所采用的相应的技术来解决

我们264这部分

就介绍这么多

多媒体技术基础课程列表:

第一章 概述

-1.1 概述

--1.1 概述

-第一章 作业

--第一章 作业

第二章 视觉特性和视频基础

-2.1 光和彩色

--2.1 光和彩色

-2.2 视觉特性

--2.2 视觉特性

-2.3 扫描

--2.3 扫描

-2.4 模拟彩色电视信号

--2.4 模拟彩色电视信号

-2.5 数字电视信号

--2.5 数字电视信号

-第二章 作业

--第二章 作业

第三章 数据压缩的基本技术

-3.1 信息熵理论

--3.1 信息熵理论

-3.2 率失真理论

--3.2 率失真理论

-3.3 预测编码

--3.3 预测编码

-3.4 序列图像中运动矢量的估计

--3.4 序列图像中运动矢量的估计

-3.5 具有运动补偿的帧间预测

--3.5 具有运动补偿的帧间预测

-3.6 正交变换编码

--3.6 正交变换编码

-3.7 子带编码

--3.7 子带编码

-3.8 量化编码

--3.8 量化编码

-3.9 熵编码

--3.9 熵编码

-第三章 作业

--第三章 作业

第四章 视频数据的压缩编码

-4.1 基于帧的视频编码

--4.1 基于帧的视频编码

-4.2 视频压缩编码国际标准

--4.2 视频压缩编码国际标准

-4.3 H.264/AVC

--4.3 H.264/AVC

-4.4 H.265/HEVC

--4.4 H.265/HEVC

-4.5 基于率失真优化的编码模式选择

--4.5 基于率失真优化的编码模式选择

-4.6 恒定速率编码器的速率控制

--4.6 恒定速率编码器的速率控制

-4.7 压缩编码算法性能的评价

--4.7 压缩编码算法性能的评价

-第四章 作业

--第四章 作业

第五章 音频数据的压缩编码

-5.1 概述

--5.1 概述

-5.2 人的听觉特性

--5.2 人的听觉特性

-5.3 音频信号编码方法

--5.3 音频信号编码方法

-第五章 作业

--第五章 作业

第六章 多媒体传输网络

-6.1 多媒体传输对网络的要求

--6.1 多媒体传输对网络的要求

-6.2 网络对多媒体信息传输的支持

--6.2 网络对多媒体信息传输的支持

-第六章 作业

--第六章 作业

第七章 多媒体同步与数据封装

-7.1 多媒体数据及其时域特征的表示

--7.1 多媒体数据及其时域特征的表示

-7.2 分布式多媒体系统中的同步

--7.2 分布式多媒体系统中的同步

-7.3 连续媒体同步的基本方法

--7.3 连续媒体同步的基本方法

-7.4 广播应用的传输层协议

--7.4 广播应用的传输层协议

-7.5 宽带应用的传输层协议

--7.5 宽带应用的传输层协议

-第七章 作业

--第七章 作业

4.3 H.264/AVC 笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。