天天看点

H264简介

参考:入门理解H264编码​

一、H264压缩技术主要采用了以下几种方法对视频数据进行压缩:

帧内预测压缩,解决的是空域数据冗余问题。

帧间预测压缩(运动估计与补偿),解决的是时域数据冗徐问题。

整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化。

CABAC压缩。

经过压缩后的帧分为:I帧,P帧和B帧:

I帧:关键帧,采用帧内压缩技术。

P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术。

B帧:双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。

除了I/P/B帧外,还有图像序列GOP。

二、h264组成

1、网络提取层 (Network Abstraction Layer,NAL)

2、视讯编码层 (Video Coding Layer,VCL)

三、码流结构

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

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

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

H264简介

SPS:序列参数集,作用于一系列连续的编码图像;

PSS:图像参数集,作用于编码视频序列中一个或多个独立的图像;

NALU根据nal_unit_type的类型,可以分为:VCL的NAL单元和非VCL的NAL单元

四、一帧图片跟 NALU 的关联

一帧图片经过 H.264 编码器之后,就被编码为一个或多个片(slice),而装载着这些片(slice)的载体,就是 NALU 了,我们可以来看看 NALU 跟片的关系(slice)。

H264简介
H264简介

片(slice)的概念不同与帧(frame),帧(frame)是用作描述一张图片的,一帧(frame)对应一张图片,而片(slice),是 H.264 中提出的新概念,是通过编码图片后切分通过高效的方式整合出来的概念,一张图片至少有一个或多个(slice)。

上图中可以看出,片(slice)都是又 NALU 装载并进行网络传输的,但是这并不代表 NALU 内就一定是切片,这是充分不必要条件,因为 NALU 还有可能装载着其他用作描述视频的信息。

五、什么是切片

片的主要作用是用作宏块(Macroblock)的载体,片之所以被创造出来,主要目的是为限制误码的扩散和传输。

片(slice)的具体结构:

H264简介

上图结构中,我们不难看出,每个分片也包含着头和数据两部分:

1、分片头中包含着分片类型、分片中的宏块类型、分片帧的数量、分片属于那个图像以及对应的帧的设置和参数等信息。

2、分片数据中则是宏块,这里就是我们要找的存储像素数据的地方

六、什么是宏块

宏块是视频信息的主要承载者,因为它包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中的像素阵列。

组成部分:一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个 8×8 Cr 彩色像素块组成。每个图象中,若干宏块被排列成片的形式。

宏块的结构图:

H264简介

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

七、切片(slice)类型跟宏块类型的关系

I片:只包 I宏块,I 宏块利用从当前片中已解码的像素作为参考进行帧内预测(不能取其它片中的已解码像素作为参考进行帧内预测)。

P片:可包 P和I宏块,P 宏块利用前面已编码图象作为参考图象进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割:即 16×16、16×8、8×16 或 8×8 亮度像素块(以及附带的彩色像素);如果选了 8×8 的子宏块,则可再分成各种子宏块的分割,其尺寸为 8×8、8×4、4×8 或 4×4 亮度像素块(以及附带的彩色像素)。

B片:可包 B和I宏块,B 宏块则利用双向的参考图象(当前和 来的已编码图象帧)进行帧内预测。

SP片(切换P):用于不同编码流之间的切换,包含 P 和/或 I 宏块

SI片:扩展档次中必须具有的切换,它包 了一种特殊类型的编码宏块,叫做 SI 宏块,SI 也是扩展档次中的必备功能。

八、NALU 整体结构

H264简介

其实 H.264 的码流结构并没有大家想的那么复杂,编码后视频的每一组图像(GOP,图像组)都给予了传输中的序列(PPS)和本身这个帧的图像参数(SPS),所以,我们的整体结构,应该如此:

H264简介

GOP (图像组)主要用作形容一个 i 帧 到下一个 i 帧之间的间隔了多少个帧,增大图片组能有效的减少编码后的视频体积,但是也会降低视频质量,至于怎么取舍,得看需求了。九、 NALU 作载体的还有 SEI、SPS、PPS

PPS 和 SPS:

H264简介
H264简介