H.264简介

耗尽温柔 提交于 2019-12-21 05:19:12

一.基础概念

I帧:帧内编码帧(intra picture),采用帧内压缩去掉空间冗余信息。

P帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已经编码帧的时间冗余信息来压缩传输数据量的编码图像。参考前面的I帧或者P帧。

B帧:双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的冗余信息,来压缩传输数据量的编码图像,也称为双向编码帧。参考前面一个的I帧或者P帧及其后面的一个P帧。

GOP:两个I帧之间的一组图片,由一个I帧和多个B/P帧组成,是编解码器存取的基本单位。

IDR帧:I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个I帧叫IDR,这样就方便控制编码和解码流程;IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,IDR图像一定是I图像,但I图像不一定是IDR图像。

二.压缩方式

H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
       帧内(Intraframe)压缩也称为空间压缩(Spatialcompression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。
       帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩,它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。

三.H.264码流

H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成,StartCode分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始码就用0x00000001,否则就用0x000001;他们的结构如下图所示。

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

VLC层是对核心算法引擎、块、宏块及片的语法级别的定义,负责有效表示视频数据的内容,最终输出编码完的数据SODB; 

NAL层定义了片级以上的语法级别(如序列参数集参数集和图像参数集,针对网络传输,后面会描述到),负责以网络所要求的恰当方式去格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。NAL层将SODB打包成RBSP然后加上NAL头组成一个NALU单元。

SODB(String Of Data Bits): 数据比特串,是编码后的原始数据;

RBSP(Raw Byte Sequence Payload) : 原始字节序列载荷,是在原始编码数据后面添加了结尾比特,一个bit“1”和若干个比特“0”,用于字节对齐。

 

以下为H264码流结构。SPS、PPS、IDR和SLICE是NAL单元某一类型的数据。如我们所见,每个分片也包含着头和数据两部分,分片头中包含着分片类型、分片中的宏块类型、分片帧的数量以及对应的帧的设置和参数等信息,而分片数据中则是宏块,这里就是我们要找的存储像素数据的地方。 

 

以下为NAL单元序列。 每个NAL单元包含一个RBSP和一个NAL头。

以下为一个NAL单元。 

 

以下为NAL头部。

由三部分组成,forbidden_bit(1bit),nal_reference_bit(2bits)(优先级),nal_unit_type(5bits)(类型)。NAL 的类型说明了当前这个 NAL 包的数据结构和数据含义,它可能是片(Slice),参数集或者填充数据等等。

以下为RBSP几种类型。如上图nal_unit_type(5bits)(类型)

NAL数据类型主要分为 VCL类型和非VCL类型

非VCL的NAL数据类型:
1)SPS(序列参数集):SPS对如标识符、帧数以及参考帧数目、解码图像尺寸和帧场模式等解码参数进行标识记录。
2)PPS(图像参数集):PPS对如熵编码类型、有效参考图像的数目和初始化等解码参数进行标志记录。
3)SEI(补充增强信息):这部分参数可作为H264的比特流数据而被传输,每一个SEI信息被封装成一个NAL单元。SEI对于解码器来说可能是有用的,但是对于基本的解码过程来说,并不是必须的。

VCL的NAL数据类型
1)头信息块,包括宏块类型,量化参数,运动矢量。这些信息是最重要的,因为离开他们,数据块中的码元都无法使用。该数据分块称为A类数据分块。
2)帧内编码信息数据块,称为B类数据分块。它包含帧内编码宏块类型,帧内编码系数。对应的slice来说,B类数据分块的可用性依赖于A类数据分块。和帧间编码信息数据块不通的是,帧内编码信息能防止进一步的偏差,因此比帧间编码信息更重要。
3)帧间编码信息数据块,称为C类数据分块。它包含帧间编码宏块类型,帧间编码系数。它通常是slice中最大的一部分。帧间编码信息数据块是不重要的一部分。它所包含的信息并不提供编解码器之间的同步。C类数据分块的可用性也依赖于A类数据分块,但于B类数据分块无关。
以上三种数据块每种分割被单独的存放在一个NAL单元中,因此可以被单独传输。
 

 以下为H.264分层结构

1帧(一幅图像) = 1~N个片(slice)  //也可以说1到多个片为一个片组

1个片 = 1~N个宏块(Marcroblock)

1个宏块 = 16X16的YUV数据(原始视频采集数据)

Slice(片):片是H.264提出的新概念,通过编码图片后切分通过高效的方式整合出来的概念。一张图片有一个或者多个片,而片由NALU装载并进行网络传输的。但是NALU不一定是切片,这是充分不必要条件,因为 NALU 还有可能装载着其他用作描述视频的信息。设置片的目的是为了限制误码的扩散和传输,应使编码片相互间是独立的。某片的预测不能以其他片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其他片中。

片有以下五种类型:

意义
I 片 只包含I宏块
P 片 包含P和I宏块
B 片 包含B和I宏块
SP 片 包含P 和/或 I宏块,用于不同码流之间的切换
SI 片 一种特殊类型的编码宏块

宏块(Macroblock):宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。

以下为宏块结构图。

从上图中,可以看到,宏块中包含了宏块类型、预测类型、Coded Block Pattern、Quantization Parameter、像素的亮度和色度数据集等等信息。 

宏块分类 意义
I 宏块 利用从当前片中已解码的像素作为参考进行帧内预测
P 宏块 利用前面已编码图像作为参考进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割:即16×16.16×8.8×16.8×8亮度像素块。如果选了8×8的子宏块,则可再分成各种子宏块的分割,其尺寸为8×8,8×4,4×8,4×4
B 宏块 利用双向的参考图像(当前和未来的已编码图像帧)进行帧内预测

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!