H264 编码、压缩方法及NAL头解析 (二)

H.264视频编码:

H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式,它即保留了以往压缩技术的优点和精华又具有其他压缩技术无法比拟的许多优点。

1.低码流(Low Bit Rate):和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。显然,H.264压缩技术的采用将大大节省用户的下载时间和数据流量收费。

2.高质量的图象:H.264能提供连续、流畅的高质量图象(DVD质量)。

3.容错能力强:H.264提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。

4.网络适应性强:H.264提供了网络适应层(Network Adaptation Layer), 使得H.264的文件能容易地在不同网络上传输(例如互联网,CDMA,GPRS,WCDMA,CDMA2000等)。


H.264编码编码主要有一下技术内容:

1:i帧,p帧,b帧。

2:帧内压缩和帧间压缩。

3:H264 NAL头解析。

4:H.264的SPS和PPS串。


关于i帧,p帧,b帧:

i帧:帧内编码帧,i帧表示关键帧,它保留了一副画面完整的数据信息,解码的时候只需要这归真数据就可以完成(因为i帧里面包含了画面里的得所有信息)。

i帧的特点:

1:它是一个全帧压缩编码帧,它将全帧图像信息进行JPEG压缩编码以及传输。

2:解码的时候只需要通过i帧的数据就可以重构完整的图像。

3:i帧描述了图像背景和运动主题的详情

4:i帧不需要参考其他画面二生成。

5:i帧是p帧和b帧的参考帧,i帧的画面质量直接影响到了后面参考i帧的p帧和b帧的图像质量。

6:i帧是基础帧,每一组里面只会有一个i帧。

7:i帧不需要参考运动矢量。

8:i帧所占数据的信息比较大。


p帧:前向预测编码帧,p帧表示的是这一帧跟之前一个关键帧(或p帧)之间的差别。p帧解码的时候需要用到前面缓存的画面再爹加上这一阵的差别信息,生成完整的图像信息。

p帧的预测与重构。p帧是以i帧为参考帧,在i帧中找出"某点"的预测值和运动矢量。预测差别值和运动矢量一起传输,在接收端根据运动矢量从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帧的压缩比例比较高。


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帧,这样在相同码率下,可以提供更好的画质。



H.264的压缩方法:

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行程编码算法。有损压缩意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频信息,而且丢失的信息不可恢复。几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失的数据越多,解压缩后的效果一般越差。此外,某些有损压缩算法采用多次重复压缩的方式,这样还会引起额外的数据丢失。


H.264NAL头解析

如果NAL由对应的Slice为一帧的开始,则用4字节表示,即0x00000001;否则用3字节表示,0x000001。

NAL Header:forbidden_bit,nal_reference_bit(优先级)2bit,nal_unit_type(类型)5bit。标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。

0:未规定

1:非IDR图像中不采用数据划分的片段

2:非IDR图像中A类数据划分片段

3:非IDR图像中B类数据划分片段

4:非IDR图像中C类数据划分片段

5:IDR图像的片段

6:补充增强信息(SEI)

你可能感兴趣的:(H264 编码、压缩方法及NAL头解析 (二))