多媒体开发(15):H264的常见概念

H264,是你常见的技术术语了吧。算法

我是谁

那h264是什么东西呢? H.264是视频编码标准,又是标准,得标准得天下啊。 在术语的拼写上,小程以能理解为准。缓存

本文介绍H264的常见概念。网络

预警,本文相对枯燥,你可随时放弃阅读。app

(1)H264从哪里来?

以前介绍媒体格式的概念时,有提到过国际标准化组织(ISO),如今又是它出场的时候。ide

H264是国际标准化组织(ISO)与国际电信联盟(ITU)的产物。编码

但ISO是大boss,给的是造福人类的方向,真正作这件事的是他的下属MPEG,MPEG是动态图像专家组。设计

一样,ITU也有专家组来独领风骚,叫VCEG,即视频编码专家组。3d

H.264有不少乳名,好比:H.264/AVC、AVC、H.264/MPEG-4 AVC,等等。code

h264

(2)H264有什么优点?

飞天

h264是ISO与ITU合做的结晶体,而在这以前,这两家都有本身的产品,好比ITU有h26一、h26三、h263+,而MPEG有MPEG-一、MPEG-二、MPEG-4等。视频

两家共同的研究成果天然不能比以往的差,h264比h263或mpeg-4的压缩率都要高(在同等画质下)。

h264优点在于,在一样的画质下,拥有更高的压缩率(更低的码率)。因此,看视频的同窗有福利了,由于这意味着,能够更省流量,而且下降了对你网速的要求,你还在用40KB/s的速度看大片吗?

(3)H264的设计

体格精奇

(a)vcl与nalu

h264在设计上分不一样的部分,涉及到复杂的概念,好比vcl与nal的划分、帧内与帧间预测编码、整数变换、熵编码,等等。小程这里只介绍一些简单的概念。

h264在设计上,分vcl跟nal两层。

vcl,video coding layer,即视频编码层,负责编码视频,独立于网络环境。

nal,network abstraction layer,即网络抽象层,把vcl提供的数据进行封装,应用于网络传输。

nal层的基本单位叫nalu。

nalu,network abstraction layer unit,网络抽象层单元。

nalu的大体结构是这样的:

nalu结构

RBSP,是原始数据(多是编码的视频数据,也多是其它数据),加上用于对齐的“0”比特位。

nalu的头,共8bit:

forbidden_bit(1bit): 禁止位,用于纠错。
nal_reference_bit(2bit): 重要程度标识,越大则越重要,0是最不重要的。
nal_unit_type(5bit):低5位,用于区分nalu的类型。

nalu的类型:
nalu类型

表中的nal_reference_bit标识了重要程度(越大越重要)。

nal_unit_type为1到5时,为切片(slice)的数据,也就是视频编码数据。若是值是5,则能够理解为IDR帧,也就是一个图像序列的第一个I帧。

nalu除了封装切片数据(视频数据),还能够封装其它类型的数据,好比nal_unit_type为7与8时,对应的是序列参数(sps)与图像参数(pps),这两个信息对于解码是必须的。注意,nalu里面的数据是严格按格式来的,并且不会出现startcode这样的数据,那个要根据实际场景来考虑是否加上,加到帧数据里。

nalu包含的内容,就是rbsp的内容,rbsp的内容也有这样的分类:
rbsp类型

总得来讲,nalu是数据封装单元(只是一个数据载体),能够是参数据(好比一个pps),也能够是视频编码数据。帧(即图像),由若干个nalu构成,一个nalu若是是视频数据,则能够由若干个“slice”组成。slice(片)是h264引入的概念,而“帧”的概念在h264以前就存在,因此不要把二者混为一体。这里引用网络上的两个图片来区分各个概念(图中的P只是一个演示,是帧的概念):
gop1
gop2

(b)I帧等

而后,小程介绍I帧、P帧之类的概念,这是你可能常常遇到的概念。首先,帧,是图片的意思,是图像序列上的概念。

压缩是为了节省存储容量与传输带宽,体积小而质量又好,是追求的目标。

视频压缩的关键点是去掉冗余。

冗余是什么?你有我也有的(相关的)是冗余,我感受不到的也是冗余。

h264编码去除冗余有两个方向,一个是帧内预测编码,另外一个是帧间预测编码。

帧内预测,关注于一张独立的图的冗余(不考虑与先后图的联系),把这张图的冗余(宏块之间的冗余)去掉。

帧间预测,关注于先后图间的冗余,只保留差异,并依赖于参考帧。帧间预测编码产生的帧,分为P帧与B帧。

全部帧参与分组,这个图像的组,也叫图像序列,即GOP。

而GOP不少时候是表示图像组的长度,能够设置。

一个图像序列内的图像是相关紧密的,也就是当更换场景(大变化来了)时就应该另起一个GOP。

MPEG二、h264与HEVC关于GOP的定义是不同的,因此在讨论GOP时有必要先弄清楚是哪个标准,这里讲的是h264。

h264的图像序列中,以IDR帧开始,到下一个IDR帧结束,一个图像序列中能够出现多个I帧。

GOP的第一个I帧,叫做IDR帧,区分于其它普通的I帧,因此IDR是I,但I未必是IDR。

IDR出现,意味着历史做废(历史的错不要影响到当前组),不能再依赖以前的图像,而要从新开始编码。

通常来讲,连续图像变化小(好比录屏时缓慢滑动屏幕)则GOP值大,并且一个IDR后就能够连续用P或B帧来表示;变化大时(快速滑动屏幕)则GOP值小,可能一个IDR加两三个P帧后就切到下一组序列了,这时编码出来的体积也更大,若是传输的话就会产生带宽峰值。

IDR,叫即时可解码帧。

I帧,即Intra-predicted Frame,帧内预测帧。I帧还有不少同义词,好比关键帧、独立的完整图像、基本帧等。

I帧相似于JPEG的压缩算法。

P帧与B帧,都是帧间预测编码,也就是要依赖于其它帧,它自己只是差别内容(差值与运动矢量)。

P帧,前向预测编码帧。P帧表示的是这一帧与以前的某个关键帧(或P帧)的差异,解码时须要用以前缓存的画面叠加上本帧的差异,生成最终画面。

B帧,双向预测编码帧。B帧依赖于前面的I或P帧,而且依赖于后面的P帧,因此解码B帧时,既要取得以前的缓存画面,也要解码以后的画面,才能叠加出最终的画面。

从压缩率来讲,B>P>I,而解码复杂度来讲也是这样。通常(I+P)这样的等级用得最多。

I跟P都是会成为参考帧,因此要注意影响,你差则别人也差。

至此,小程把H264一些常见的概念介绍完毕了。

总结一下,本文介绍了H264编码标准的一些常见的概念,但愿能帮到你,对H264有一个概念上的理解或了解。


happy

相关文章
相关标签/搜索