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

2019-06-10

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

我是谁

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

本文介绍H264的常见概念。

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

(1)H264从哪里来?

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

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

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

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

H.264有很多乳名,比如:H.264/AVC、AVC、H.264/MPEG-4 AVC,等等。

h264

(2)H264有什么优势?

飞天

h264是ISO与ITU合作的结晶体,而在这之前,这两家都有自己的产品,比如ITU有h261、h263、h263+,而MPEG有MPEG-1、MPEG-2、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。

MPEG2、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