H.264编码基本原理

1 H264基本介绍

H264在视频采集到输出中属于编解码层次的数据,如图所示,是在采集数据后做编码压缩时通过编码标准编码后所呈现的数据。
在这里插入图片描述

2 H264相关概念:

2.1 序列

序列就是参照一段时间内相邻的图像中,像素、亮度与色温的差别很小。所以当面对一段时间内图像我们没必要去对每一幅图像进行完整一帧的编码,而是可以选取这段时间的第一帧图像作为完整编码,而下一幅图像可以记录与第一帧完整编码图像像素、亮度与色温等的差别即可,以此类推循环下去。

这一段时间内相邻且变化不大的图像集我们就可以称之为一个序列。序列可以理解为有相同特点的一段数据。但是如果某个图像与之前的图像变换很大,很难参考之前的帧来生成新的帧,那么久结束删一个序列,开始下一段序列。重复上一序列的做法,生成新的一段序列。

2.2 图像组(GOP):

一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个 I 帧,然后一直 P 帧、B 帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个 I 帧和 3、4个P帧。

GOP是画面组,一个GOP是一组连续的画面。
GOP一般有两个数字,如M=3,N=12。M指定I帧与P帧之间的距离,N指定两个I帧之间的距离。

那么现在的GOP结构是:IB BP BB PB BP BB I

2.3 帧类型

H264结构中,一个视频图像编码后的数据叫做一帧,一帧由一个片(slice)或多个片组成,一个片由一个或多个宏块(MB)组成,一个宏块由16x16的yuv数据组成。宏块作为H264编码的基本单位。

在H264协议内定义了三种帧,分别是I帧、B帧与P帧。I帧就是之前所说的一个完整的图像帧,而B、帧与P帧所对应的就是之前说的不编码全部图像的帧。P帧与B帧的差别就是P帧是参考之前的I帧而生成的,而B帧是参考前后图像帧编码生成的。

在H264协议内定义了三种帧,分别是I帧、B帧与P帧。I帧是一个完整的图像帧,而B帧与P帧所对应的是不编码全部图像的帧。P帧与B帧的差别就是P帧是参考之前的I帧而生成的,而B帧是参考前后图像帧编码生成的。

I帧:关键帧,采用帧内压缩。可以理解为这一帧画面完整的保留;解码时只需要本帧数据就可以完成。(因为包含完整画面)

P帧:向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧间压缩。P帧表示的是这一帧跟之前的一个I关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

B帧:双向参考帧,在压缩时,它既参考前而的帧,又参考它后面的帧。采用帧间压缩。B帧记录的是本帧与前后帧的差别。要解码B帧,不仅要取得之前的缓存画面帧,还要解码之后的画面帧,通过前后画面帧与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU消耗大。

I帧特点:

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

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帧特点:

  1. B帧是由前面的I或P帧和后面的P帧来进行预测的;
  2. B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
  3. B帧是双向预测编码帧;
  4. B帧压缩比最高,因为它只反映并参考帧间运动主体的变化情况,预测比较准确;加大B帧的数量可以有效地提高视频数据的压缩比,但是在实时互动的环境下,过多的B帧会引起延时,因为B帧会过分的依赖于前后帧,在网络好的环境下,可以正常的传输帧,这
  5. 样没有什么问题,但是在网络不好的时候,B帧会等待其他帧到来,会引起延时。
  6. B帧不是参考帧,不会造成解码错误的扩散。

2.4 IDR帧

一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。IDR 图像一定是 I 图像,但I图像不一定是 IDR 图像。一个序列中可以有很多的I图像,I 图像之后的图像可以引用 I 图像之间的图像做运动参考。

注意:对于 IDR 帧来说,在 IDR 帧之后的所有帧都不能引用任何 IDR 帧之前的帧的内容,与此相反,对于普通的 I 帧来说,位于其之后的 B和 P帧可以引用位于普通 I帧之前的 I帧。从随机存取的视频流中,播放器永远可以从一个 IDR 帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有 IDR 帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。

3 H264压缩技术

H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

帧内压缩:也称为空间压缩,在压缩一帧图像时,不考虑相邻帧之间关系信息只压缩本帧的数据,和静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩率,压缩率跟JPEG差不多。

帧间压缩:因为在实际视频中相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。

3.1 压缩方式说明

  • Step1:分组,也就是将一系列变换不大的图像归为一个组,也就是一个序列,也可以叫GOP(画面组);
  • Step2:定义帧,将每组的图像帧归分为I帧、P帧和B帧三种类型;
  • Step3:预测帧, 以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
  • Step4:数据传输, 最后将I帧数据与预测的差值信息进行存储和传输。

4 H264结构与码流

4.1 H264的结构图

在这里插入图片描述

4.2 H264的编码分层

H.264原始码流(裸流)是由一个接一个NALU组成,它的功能分为两层,VCL(视频编码层)和 NAL(网络提取层).

(1)NAL层 (视频数据网络抽象层)

因为H264最终还是要在网络上进行传输,在传输的时候,网络包的最大传输单元是1500字节,一个H264的帧往往是大于1500字节的,所以需要将一个帧拆成多个包进行传输。这些拆包、组包等工作都在NAL层去处理。

(2)VCL层 (视频编码层)

对视频的原始数据进行压缩。

4.3 码流的基本概念

(1)SODB ,String Of Data Bits 原始数据比特流

因为它是流的形式,所以长度不一定是8倍数,它是由 VLC 层产生的。由于我们计算机是以8倍数去处理数据所以计算机在处理H264时,就需要 RBSP。

(2)RBSP,SODB + tailing bits (原始字节序列载荷)

由于它是一个压缩流,SODB 不知道是在何处结束,所以算法在SODB最后一位补一个1,没有按字节对齐的则补 0。

(3)EBSP (扩展字节序列载荷)

在生成压缩流之后,在每一帧的开头加一个起始位,这个起始位一般是 00 00 00 01 或者是 00 00 01。所以在h264码流中规定每有两个连续的00 00,就增加一个0x03。

(4)NALU(NAL Unit)

在EBSP的基础上,加1字节的NAL 头
NAL Header(1B) + EBSP

4.4 NAL Unit

在这里插入图片描述

如上图所示,生成的H264视频帧是由多个切片组成的。一个H264的帧至少由一个切片组成,不能没有切片,可以是一个到多个不能没有。在网络传输的时候一个H264帧可能需要切开去传,一个一次传不完,这就按照切片来切。每一个切片组成一个NAL Unit也就是NALu。

4.5 宏块

4.5.1 划分宏块

H.264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。

在这里插入图片描述

划分好宏块后,计算宏块的象素值。

在这里插入图片描述

计算一幅图像中每个宏块的像素值,所有宏块都处理完后如下面的样子。

在这里插入图片描述

4.5.2 划分子块

H.264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。

消防业务中心 > 01.H264编码学习笔记(2021.5.8) > image2021-5-11 15:1:33.png

如上图中,红框内的 16X16 宏块中大部分是蓝色背景,而三只鹰的部分图像被划在了该宏块内,为了更好的处理三只鹰的部分图像,H264就在 16X16 的宏块内又划分出了多个子块。

4.5 切片 与 宏块的关系

消防业务中心 > 01.H264编码学习笔记(2021.5.8) > image2021-5-11 14:55:33.png
在这里插入图片描述

在切片数据中,包含若干个宏块。在一个宏块中,又包含了宏块类型、宏块预测、残差数据。

    1帧 = n个片
    1片 = n个宏块
    1宏块 = 16x16yuv数据

4.6 标准H.264流的结构

I帧, H.264标准可以将一帧图像分成多个片(Slice)进行编码,每个片(Slice)会输出一个网络抽象(NALu),例如对一幅图像进行两场编码,则有两个NALu。

[Access Unit Delimiter];         简称AUD,   起始码 0x [00] 00 00 01 09

Sequence Parameter Set;          简称SPS,   起始码 0x [00] 00 00 01 67

Picture Parameter Set;           简称PPS,   起始码 0x [00] 00 00 01 68

Slice 0 of IDR Picture;                     起始码 0x [00] 00 00 01 65

Slice 1 of IDR Picture;                     起始码 0x [00] 00 00 01 x5或x1

…………………………………

P/B帧

[Access Unit Delimiter];        简称AUD,   起始码 0x [00] 00 00 01 09

Slice 0 of none IDR Picture;                起始码 0x [00] 00 00 01 x1

…………………………………

Slice n of none IDR Picture;               起始码 0x [00] 00 00 01 x1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值