当前位置:   article > 正文

【网络通信 -- 直播】视频流编码 -- H.264 整体结构整理_视频编码 空域分层

视频编码 空域分层

【网络通信 -- 直播】视频流编码 -- H.264 整体结构整理

【0】简介

H.264/AVC 是 ITU-T 视频编码专家组(VCEG)和 ISO/IEC 动态图像专家组(MPEG)联合组成的联合视频组(JVT)共同努力制订的新一代视频编码标准;其最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264 的压缩比是 MPEG-2 的 2 倍以上,是 MPEG-4 的 1.5~2 倍;同时,采用视频编码层(VCL)和网络提取层(NAL)的分层设计,适用于流媒体技术的实时传输;

【1】视频编解码的一般流程

【2】H.264 编解码框架简介

H264 压缩技术主要的视频数据压缩方法如下
帧内预测压缩,解决的是空域数据冗余问题;空域数据就是该图像⾥数据在宽⾼空间内包含了很多颜⾊、光亮等⼈的⾁眼很难察觉的数据,对于这些数据,可以认作冗余,可以直接压缩
帧间预测压缩(运动估计与补偿),解决的是时域数据冗余问题;即摄像头在⼀段时间内所捕捉的数据没有较⼤的变化,则将这⼀时间内的相同的数据压缩掉,即为时域数据压缩
整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据然后进行量化;傅⾥叶变换可以把⼀个复杂波形图变换成许多的正弦波,这些正弦波的频率以及振幅不⼀样,若在频率上没有⼀致性则可以进⾏压缩处理
CABAC(Context-based Adaptive Binary Arithmetic Coding),基于自适应二元算术编码压缩;

【2.1】H.264 分层编解码框架

H.264 视频编码标准引入了分层结构,从而适用于不同网络之间的视频传输,即将图像压缩系统分为网络抽象层(NAL,Network Abstraction Layer) 和 视频编解码层(VCL,Video Coding Layer),实现了压缩编码与网络传输的分离;优势 : 松耦合、高内聚,使信号处理和网络传输分离,VCL 和 NAL 可以在不同的处理平台上实现,VCL 和 NAL 分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对 VCL 比特流进行重构和重编码;

相关概念 

  • GOP,一段时间内图像变化不大的图像集称为一个序列,这里的图像又在 H264 里面称为帧,所以就是一组视频帧,其中第一个是 IDR 帧;
  • 帧,一副图像编码后的视频数据也叫做一帧,其中有 I 帧、B 帧、P 帧;
  • 片,一帧图像又可以划分为很多片,由一个片或者多个片组成;
  • 宏块,视频编码的最小处理单元,承载了视频的具体 YUV 信息,一片由一个或者多个宏块组成;

概念之间的关系图示

 NALU 的层次关系

视频帧被划分为一个片或者多个片,其中 slice 数据主要就是通过 NLAU 进行传输,其中 slice 数据:一个 Slice = Silce + Slice Data;

Slice 片类型

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

宏块类型

宏块分类意义
I 宏块利用从当前片中已解码的像素作为参考进行帧内预测
P 宏块

利用前面已编码图像作为参考进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割,即 16×16,16×8,8×16,8×8 亮度像素块;

如果选了 8×8 的子宏块,则可再分成各种子宏块的分割,其尺寸为 8×8,8×4,4×8,4×4

B 宏块利用双向的参考图像(当前和未来的已编码图像帧)进行帧内预测

 宏块结构图示

宏块中包含了宏块类型、预测类型、Coded Block Pattern、Quantization Parameter、像素的亮度和色度数据集等信息;
宏块数据包括,一个宏块由一个 16×16 亮度像素和附加的一个 8×8 Cb 和一个 8×8 Cr 彩色像素块组成,每个图象中,若干宏块被排列成片的形式;

【2.2】H.264 编码器框架

  • H.264 的编码器框图分为前向部分和后向部分,后向表示的是重建分⽀
    • 编码器(前向路径),对输⼊的视频帧中以 16x16 的像素宏块为单位做帧内或者帧间处理,随后⽣成预测宏块 P,对原始块和预测宏块做残差,随后对残差数据进⾏变换和量化等操作;
      • 对于帧内编码,由正在被编码的当前帧先前被编码的数据在进⾏重建宏块像素后,求得预测宏块 P;
      • 对于帧间编码,由对参考帧进⾏运动估计后求得运动⽮量并在进⾏运动补偿后求得预测值
    • 编码器(重建路径),对视频数据进⾏解码和反量化、反变换等操作;在解码过程中通过⼀系列操作重建图像后⽤于对下⼀帧图像进⾏预测,经过变换和量化后的宏块得出数据进⾏反量化和反变换等操作得出差分宏块,由于在反量化和反变换过程为了⽅便计算,结合不同的量化步⻓对计算系数进⾏处理,因此得到的重建后宏块和原始块并不是完全相同;经过对预测宏块与残差宏块相加等操作后得出重建参考帧

【2.3】H.264 解码器框架

  • 解码器在⽹络抽象层 NAL 中获取到压缩后的码流,然后从码流中提取⼀帧数据,经过熵编码、重排序、反量化和反变换后作为加法器的输⼊,其中包含着重建图像所需要的残差数据和运动⽮量等进⾏解码操作所必需的信息
  • 解码器通过在码流中解码所获得的头部信息创建出⼀个预测块 P,将之前求得的残差信息 D 和预测块 P 求和,求得图像块数据 uF’n,然后经过去块滤波,SAO 等操作获得重建图像的解码块 F

【3】H.264 传输与存储

【3.1】H264 流中的 NAL 单元

【3.2】NAL 单元结构

其实 NALU 承载的真实数据并不是 RBSP 而是 EBSP 即(Extent Byte Sequence Payload),EBSP 和 RBSP 的区别在于 RBSP 里面加入防伪起始码字节(0x03),H.264 规范规定,编码器输出的数据需要在每个 NALU 添加起始码,0x00 00 01 或者 0x00 00 00 01,用来指示一个 NALU 的起始和终止位置,然而 RBSP 数据内部是有可能含有这种字节序列的,为了防止解析错误,在 RBSP 数据流里面碰到 0x 00 00 00 01 的 0x01 前面就会加上 0x03,解码时将 NALU 的 EBSP 中的 0x03 去掉成为 RBSP,称为脱壳操作

每个 NALU 前添加起始码,即 0x000001,用来指示一个 NALU 的起始和终止位置;在这样的机制下,解码器在码流中检测起始码,作为一个 NALU 得起始标识,当检测到下一个起始码时,当前 NALU 结束;

RBSP,Raw Byte Sequence Payload,原始字节序列负载
SODB,String Of Data Bits,原始数据比特流
RBSP = SODB + rbsp_trailing_bits(使码流按字节对齐)

NAL 头信息结构

F:禁止位(1 比特),标记该 NAL 包是否出现错误,出错置 1,否则置 0;
R:重要性指示位(2 比特),值越大代表该 NAL 单元的重要程度越高;
T:NAL 单元类型(5 比特);

常用 NAL 类型图示,即 RBSP 可以承载的数据类型

I,P,B 帧定义和特点

I帧:帧内编码帧,又称 intra picture,表示关键帧,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象,I帧可以看成是一个图像经过压缩后的产物,可以理解为这一帧画面的完整保留,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像;因此在 I 帧图像处可以切换频道,而不会导致图像丢失或无法解码;I 帧图像用于阻止误差的累积和扩散;
P帧:前向预测编码帧 ,又称 predictive-frame,通过充分降低图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面(I帧)叠加上本帧定义的差别,生成最终画面;
B帧:双向预测内插编码帧(双向差别帧、双向预测帧),又称 bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像;即 B帧记录的是本帧与前后帧的差别,换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面;
图像序列GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧;主要用作形容一个 I 帧到下一个 I 帧之间的间隔了多少个帧,增大图片组能有效的减少编码后的视频体积,但是也会降低视频质量;
注意 :I帧是完整的视频帧,即客户端只有在获得I帧后才会有完整的视频;如果直接发送,不等I帧,客户端得到的画面会残缺,但是延迟较低;如果等I帧,客户端缓冲时间较长,得到画面会完整,但是延迟至少是一个gop;

图像组(GOP)作用是方便随机存取,图像组是随机存取视频单位;一个GOP由一串IBP帧组成,起始为I帧;基准帧(I/P)的反复频率用M表示,用于描述多少帧里出现一次I/P帧;GOP的长度是一个I帧到下一个I帧的间隔,即多少帧里面出现一次I帧,一般用N表示,这个长度是可变的,长GOP可以提供高的压缩比,但是会造成随机存取的延迟(必须等到下一个I帧)和误差的积累(P帧的误差传播);

  1. M=1 N=X:IPPP...
  2. M=2 N=X:IBPBP...
  3. M=3 N=X:IBBPBBP...
  1. I 帧特点:
  2. 它是一个全帧压缩编码帧,它将全帧图像信息进行JPEG压缩编码及传输;
  3. 解码时仅用I帧的数据就可重构完整图像;
  4. I帧描述了图像背景和运动主体的详情;
  5. I帧不需要参考其他画面而生成;
  6. I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  7. I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
  8. I帧不需要考虑运动矢量;
  9. I帧所占数据的信息量比较大;
  10. P帧特点:
  11. P帧是I帧后面相隔1~2帧的编码帧;
  12. P帧采用运动补偿的方法传送它与前面的IP帧的差值及运动矢量(预测误差);
  13. 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
  14. P帧属于前向预测的帧间编码,它只参考前面最靠近它的I帧或P帧;
  15. P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
  16. 由于P帧是参考帧,它可能造成解码错误的扩散;
  17. 由于是差值传送,P帧的压缩比较高;
  18. B帧特点:
  19. B帧是由前面的IP帧和后面的P帧来进行预测的;
  20. B帧传送的是它与前面的IP帧和后面的P帧之间的预测误差及运动矢量;
  21. B帧是双向预测编码帧;
  22. B帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确;
  23. B帧不是参考帧,不会造成解码错误的扩散;

SPS,PPS,I 帧判定

码流截图图示

在实际的H264数据帧中,往往帧前面带有 00 00 00 01 或 00 00 01 分隔符,一般来说编码器编出的首帧数据为 PPS 与 SPS,接着为 I 帧,分析上图,以 00 00 00 01 分割之后的下一个字节就是 NALU 类型,将其转为二进制数据后,解读顺序为从左往右算,如下

第1位禁止位,值为1表示语法出错
第2~3位为参考级别
第4~8为是 NAL 单元类型

其中0x67的二进制码为:
0110 0111
4-8为00111,转为十进制7,参考常用 NAL 类型图示: 7对应序列参数集SPS

其中0x68的二进制码为:
0110 1000
4-8为01000,转为十进制8,参考常用 NAL 类型图示: 8对应图像参数集PPS

其中0x65的二进制码为:
0110 0101
4-8为00101,转为十进制5,参考常用 NAL 类型图示: 5对应IDR图像中的片(I帧)

【3.3】H.264 语法元素优先级

H.264 优先级的划分图示

图示相关标识说明

标识说明标识说明
PSYNCLUM亮度
IPMCHR色度
MB宏块CBP模式信息
AC交流DC直流
INTER帧间INTERA帧内
REF_FRAME参考帧MVD宏块运动矢量预测差

H.264 优先级的划分详细说明

参考致谢

本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

【1】新一代视频压缩编码标准H.264

【2】深入理解视频编解码技术 -- 基于 H.264 标准及参考模型

【3】数字视频编码技术原理(第二版)

【4】视频编解码流程

【5】H264 编解码框架简介

【6】H264(NAL简介与I帧判断)

【7】H264编码总结

【8】音视频压缩:H264码流层次结构和NALU详解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/967474
推荐阅读
相关标签
  

闽ICP备14008679号