h264基本介绍

来源:互联网 发布:美工刀片的硬度 编辑:程序博客网 时间:2024/06/01 08:32

 视频编码介绍

1.1 视频压缩编码的目标

1)保证压缩比例

2)保证恢复的质量

3)易实现,低成本,可靠性

 

1.2 压缩的出发点(可行性)

1)时间相关性

在一组视频序列中,相邻相邻两帧只有极少的不同之处,这便是时间相关性。

2)空间相关性

在同一帧中,相邻象素之间有很大的相关性,两象素越近,侧相关性越强。

 

根据采用的信源的模型分类:

1)基于波形的编码

如果采用一幅图像由许多象素构成的信源模型,这种信源模型的参数就是象素的亮度和色度的幅度值,对这些参数进行编码的技术即为基于波形编码。

 

2)基于内容的编码

如果采用一个分量有几个物体构成的信源模型,这种信源模型的参数事各个物体的形状,纹理,运动,对这些参数进行编码的技术就是基于内容的编码。

 

h264应用可分为3个级别:

1)基本档次:(简单版本应用面广 , 支持帧内和帧间编码,基于可变程度的熵编码.)

应用领域:视频会话,会议电视无线通信等实时通信.

2)主要档次:(采用了多项提高图像质量和增加压缩比的技术措施支持隔行视频支持基于上下文的自适应的算术编码.)

应用领域:  数字广播与数字视频存储

3)扩展档次应用领域可用于各种网络的视频流传输,视频点播

 

 视频编码的原理

2.1 一个图像或者一个视频序列进行压缩,产生码流。

对图像的处理即是:帧内预测编码

其预测值P,是由已编码的图像做参考,经运动补偿得到的。预测图像P和当前帧Fn相减,得到两图像的残差值DnDn在经过转换T,量化Q,去处空间冗余,得到系数X,将X重排(使数据更加紧凑),熵编码(加入运动矢量。。。一些图像相关得信息),得到nal数据。

对视频序列的处理:帧间预测编码

预测值P,是由当前片中,己编码的宏块预测得到的(亮度4×4或者16×16预测,色度8×8预测)。当前待处理的块,减去预测值P,得残差值DnDn在经过转换T,量化Q,得到系数X,将X重排(使数据更加紧凑),熵编码,得到nal数据

 

2.2  、帧、图像

场:隔行扫描的图像,偶数行成为顶场行。奇数行成为底场行。

所有顶场行称为顶场。所有底场行称为底场.

帧:逐行扫描的图像

图像:场和帧都可认为是图像.

 

 

2.3宏块、片

宏块(MB:一个宏块由一个16×16亮度块、一个8×8Cb和一个8×8Cr组成

片(slice:一个图像可以划分成一个或多个片,一个片由一个或多个宏块组成。

 

H264结构和应用

 

H.264从框架结构上将NALVCL分离,主要有两个目的:

      其一,可以定义VCL视频压缩处理与NAL网络传输机制的接口,这样允许视频编码层VCL的设计可以在不同的处理器平台进行移植,而与NAL层的数据封装格式无关;
      
其二,VCLNAL都被设计成工作于不同的传输环境,异构的网络环境并不需要对VCL比特流进行重构和重编码。

 

3.1 H264的编码格式

h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL

VCL功能是进行视频编解码,包括运动补偿预测,变换编码和熵编码等功能;

NAL用于采用适当的格式对VCL视频数据进行封装打包

 

1VCL数据即被压缩编码后的视频数据序列。

VCL数据要封装到NAL单元中之后,才可以用来传输或存储。

 

2NAL单元格式

NAL单元由1字节的头,3个定长的字段和一个字节数不定的编码段组成。

头标的语法:NALU类型(5bit)、重要性指示位(2bit)、禁止位(1bit)

NALU类型:112H.264使用,2431H.264以外的应用使用。

重要性指示:标志该NAL单元用于重建时的重要性,值越大,越重要。

禁止位:网络发现NAL单元有比特错误时可设置该比特为1,以便接收方丢掉该单元

Nal

Rbsp

Nal

Rbsp

Nal

Rbsp

 

1NAL Units视频数据封装在整数字节的NALU中,它的第一个字节标志该单元中数据的类型。H.264定义了两种封装格式。基于包交换的网络(如H.323系统)可以使用RTP封装格式封装NALU。而另外一些系统可能要求将NALU作为顺序比特流传送,为此H.264定义了一种比特流格式的传输机制,使用start_code_prefixNALU封装起来,从而确定NAL边界。

 

2)参数集:以往视频编解码标准中GOB\GOP\图像等头信息是至关重要的,包含这些信息的包的丢失常导致与这些信息相关的图像不能解码。为此H.264将这些很少变化并且对大量VCL NALU起作用的信息放在参数集中传送。参数集分为两种,即序列参数集和图像参数集。为适应多种网络环境,参数集可以带内传送,也可以采用带外方式传送。

序列的参数集(SPS):包括了一个图像序列的所有信息,

图像的参数集(PPS):包括了一个图像所有片的信息。

 

3.2 H264的网络传输

H.264能够在基于RTP/UDP/IPH.323/MMPEG-2传输和H.320协议的网络中使用

H.264RTP封装参考RFC 3550,载荷类型(PT)域未作规定

 

3.3数据的划分

      通常情况下,一个宏块的数据是存放在一起而组成片的,数据划分使得一个片中的宏块数据重新组合,把宏块语义相关的数据组成一个划分,由划分来组装片。在H.264中有三种不同的数据划分。

 (1)头信息划分:包含片中宏块的类型,量化参数和运动矢量,是片中最重要的信息。

 (2)帧内信息划分:包含帧内CBPs和帧内系数,帧内信息可以阻止错误的蔓延。

 (3)帧间信息划分:包含帧间CBPs和帧间系数,通常比前两个划分要大得多。

      帧内信息划分结合头信息解出帧内宏块,帧间信息划分结合头信息解出帧间宏块。帧间信息划分的重要性最低,对重同步没有贡献。当使用数据划分时,片中的数据根据其类型被保存到不同的缓存,同时片的大小也要调整,使得片中最大的划分小于MTU尺寸。

      解码端若获得所有的划分,就可以完整重构片;解码端若发现帧内信息或帧间信息划分丢失,可用的头信息仍然有很好的错误恢复性能。这是因为宏块类型和宏块的运动矢量含有宏块的基本特征。

 

3.4灵活的宏块次序(FMO)

      通过设置宏块次序映射表(MBAmap)来任意地指配宏块到不同的片组,FMO模式打乱了原宏块顺序,降低了编码效率,增加了时延,但增强了抗误码性能。FMO模式划分图像的模式各种各样,重要的有棋盘模式、矩形模式等。当然FMO模式也可以使一帧中的宏块顺序分割,使得分割后的片的大小小于无线网络的MTU尺寸。经过FMO模式分割后的图像数据分开进行传输,以棋盘模式为例,当一个片组的数据丢失时可用另一个片组的数据(包含丢失宏块的相邻宏块信息)进行错误掩盖。实验数据显示,当丢失率为(视频会议应用时)10%时,经错误掩盖后的图像仍然有很高的质量。

 

 H264的网络传输

NAL支持众多基于包的有线/无线通信网络,诸如H.320MPEG-2RTP/IP等。但目前,绝大部分的视频应用所采用的网络协议层次是RTP/UDP/IP,因此在下面的描述中主要基于这个传输框架。下面首先分析NAL层的基本处理单元NALU以及它的网络封装、分割和合并的方法。

4.1. NAL单元

每个NAL单元是一个一定语法元素的可变长字节字符串,包括包含一个字节的头信息(用来表示数据类型),以及若干整数字节的负荷数据。一个NAL单元可以携带一个编码片、A/B/C型数据分割或一个序列或图像参数集。

NAL单元按RTP序列号按序传送。其中,T为负荷数据类型,占5bitR为重要性指示位,占2bit;最后的F为禁止位,占1bit。具体如下:

1NALU类型位

可以表示NALU32种不同类型特征,类型112H.264定义的,类型2431是用于H.264以外的,RTP负荷规范使用这其中的一些值来定义包聚合和分裂,其他值为H.264保留。

2)重要性指示位

用于在重构过程中标记一个NAL单元的重要性,值越大,越重要。值为0表示这个NAL单元没有用于预测,因此可被解码器抛弃而不会有错误扩散;值高于0表示此NAL单元要用于无漂移重构,且值越高,对此NAL单元丢失的影响越大。

3)禁止位

编码中默认值为0,当网络识别此单元中存在比特错误时,可将其设为1,以便接收方丢掉该单元,主要用于适应不同种类的网络环境(比如有线无线相结合的环境)。例如对于从无线到有线的网关,一边是无线的非IP环境,一边是有线网络的无比特错误的环境。假设一个NAL单元到达无线那边时,校验和检测失败,网关可以选择从NAL流中去掉这个NAL单元,也可以把已知被破坏的NAL单元前传给接收端。在这种情况下,智能的解码器将尝试重构这个NAL单元(已知它可能包含比特错误)。而非智能的解码器将简单地抛弃这个NAL单元。NAL单元结构规定了用于面向分组或用于流的传输子系统的通用格式。在H.320MPEG-2系统中,NAL单元的流应该在NAL单元边界内,每个NAL单元前加一个3字节的起始前缀码。在分组传输系统中,NAL单元由系统的传输规程确定帧界,因此不需要上述的起始前缀码。一组NAL单元被称为一个接入单元,定界后加上定时信息(SEI),形成基本编码图像。该基本编码图像(PCP)由一组已编码的NAL单元组成,其后是冗余编码图像(RCP),它是PCP同一视频图像的冗余表示,用于解码中PCP丢失情况下恢复信息。如果该编码视频图像是编码视频序列的最后一幅图像,应出现序列NAL单元的end,表示该序列结束。一个图像序列只有一个序列参数组,并被独立解码。如果该编码图像是整个NAL单元流的最后一幅图像,则应出现流的end

H.264采用上述严格的接入单元,不仅使H.264可自适应于多种网络,而且进一步提高其抗误码能力。序列号的设置可发现丢的是哪一个VCL单元,冗余编码图像使得即使基本编码图像丢失,仍可得到较粗糙的图像。


4.2. H.264
中的RTP

上面阐述了NAL单元的结构和实现,这里要详细讨论RTP的载荷规范和抗误码性能。RTP可通过发送冗余信息来减少接收端的丢包率,会增加时延,与冗余片不同的是它增加的冗余信息是个别重点信息的备份,适合于非平等保护机制。相应的多媒体传输规范有:

1)分组复制多次重发,发送端对最重要的比特信息分组进行复制重发,使得保证接收端能至少正确接收到一次,同时接收端要丢弃已经正确接收的分组的多余备份。

2)基于分组的前向纠错,对被保护的分组进行异或运算,将运算结果作为冗余信息发送到接收方。由于时延,不用于对话型应用,可用于流媒体。

3)音频冗余编码,可保护包括视频在内的任何数据流。每个分组由头标、载荷以及前一分组的载荷组成,H.264中可与数据分割一起使用。

 

RTP的封装规范总结如下:

1)额外开销要少,使MTU尺寸在10064千字节范围都可以;

2)易于区分分组的重要性,而不必对分组内的数据解码;

3)载荷规范应当保证不用解码就可识别由于其他比特丢失而造成的分组不可解码;

4)支持将NALU分割成多个RTP分组;

5)支持将多个NALU汇集在一个RTP分组中。

 

H.264采用了简单打包的方案,即一个RTP分组里放入一个NALU,将NALU(包括同时作为载荷头标的NALU头)放入RTP的载荷中,设置RTP头标值。理想情况下,VCL不会产生超过MTU尺寸的NAL单元,来避免IP层的分拆。在接收端,通过RTP序列信息识别复制包并丢弃,取出有效RTP包里的NAL单元。基本档次和扩展档次允许片的无序解码,这样在抖动缓存中就不必对包重新排序。在使用主档次时(不允许片的乱序),要通过RTP序列信息来对包重新排序,解码顺序号(DON)的概念现正在IETF的讨论中。

存在如下情况,例如当使用内容预编码时,编码器不了解底层网络的MTU大小,将产生许多大于MTU尺寸的NALU。这就需要涉及NALU的分割和合并。

1NALU的分割

虽然IP层的分割可以使数据块小于64千字节,但无法在应用层实现保护,从而降低了非平等保护方案的效果。由于UDP数据包小于64千字节,而且一个片的长度对某些应用场合来说太小,所以应用层打包是RTP打包方案的一部分。目前的拆分方案正在IETF的讨论之中,大致具有以下特点:①NALU的分块以按RTP次序号升序传输;②能够标记第一个和最后一个NALU分块;③可以检测丢失的分块。

2NALU的合并

一些NALUSEI、参数集等非常小,将它们合并在一起有利于减少头标开销。现有的两种集合分组:①单一时间集合分组(STAP),按时间戳进行组合,一般用于低时延环境;②多时间集合分组(MTAP),不同时间戳也可以组合,一般用于高时延环境,比如流应用



 

H264编码原理以及I帧、B和P帧详解

 H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参照一段时间内图像的统计结果表明,在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内。所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。
    在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧。
   H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

 

序列的说明
    在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束。
    一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
        一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

 

三种帧的说明

1、I帧
I帧:帧内编码帧 ,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
I帧特点:
1)它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
2)解码时仅用I帧的数据就可重构完整图像;
3)I帧描述了图像背景和运动主体的详情;
4)I帧不需要参考其他画面而生成;
5)I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
6)I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
7)I帧不需要考虑运动矢量;
8)I帧所占数据的信息量比较大。

2、P帧 

P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
P帧特点:
1)P帧是I帧后面相隔1~2帧的编码帧;
2)P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
3)解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
4)P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
5)P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
6)由于P帧是参考帧,它可能造成解码错误的扩散;
7)由于是差值传送,P帧的压缩比较高。

3、B帧

B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
B帧的预测与重构
B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。
B帧特点
1)B帧是由前面的I或P帧和后面的P帧来进行预测的;
2)B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
3)B帧是双向预测编码帧;
4)B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
5)B帧不是参考帧,不会造成解码错误的扩散。

注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧。一般来说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50。可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

 

压缩算法的说明
h264的压缩方法:
1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。
2.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
3.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
4.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。
    帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。  
    帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporal compression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Frame differencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
       顺便说下有损(Lossy )压缩和无损(Lossy less)压缩。无损压缩也即压缩前和解压缩后的数据完全一致。多数的无损压缩都采用RLE行程编码算法。有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失的数据越多,解压缩后的效果一般越差。此外,某些有损压缩算法采用多次重复压缩的方式,这样还会引起额外的数据丢失。