P3 H264的码流结构分析——VCL和NAL

2023-12-22 17:43:42

目录

前言

01 NALU结构分析?

码流解析的角度

NALU结构图

02 NALU的头部解析

nal_unit_type解析

03? NALU类型区分


前言

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板

🎬 个人主页:@ChenPi

🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》????

🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》???

🛸推荐专栏3:《嵌入式音视频_@ChenPi的博客-CSDN博客
🌺本篇简介 ?:这章记录编解码的基础理论知识——H264的码流结构NAL与VCL

?H264分层能够分成两层,一层是VCL层(视频编码层),另外一层是NAL层(网络提取层)。

  1. NAL网络提取层:负责以网络所要求的恰当的方式对数据进行打包和传送
  2. VCL视频编码层:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码??

以下重点讲解的是NALU(Network Abstract Layer Unit)的结构?

01 NALU结构分析?

码流解析的角度

可以理解为有一个一个的NALU单元组成.

??
一个NALU单元分成两部分: NAL头和RBSP(Raw ByteSequence Payload)原始字节序列载荷.

前面提到的VCL层, 或者说VCL数据,是指视频编码生成的压缩比特流片段,被称为SODB(String of Data Bits)


SODB是RBSP的原始帧, 即RBSP包含了SODB数据

NALU结构图

一个NALU由 固定长度的Header和RBSP组成

02 NALU的头部解析

?

通过上面我们也可以看到,NALU Header由三个句法元素组成,分别为:

  1. forbidden_zero_bit
  2. nal_ref_idc
  3. nal_unit_type

它们总共占据一个字节,也就 是说,NALU Header,在整个NALU中,占据一个字节。

而且forbidden_zero_bit的值对应1个bit,nal_ref_idc的值对应2个bit,nal_unit_type的值对应5个bit,加起来刚好一个字节。

  1. forbidden_zero_bit(禁止位):h264文档规定,这个值应该为0,当它不为0时,表示网络传输过程中,当前NALU中可能存在错误,解码器可以考虑 不对这个NALU进行解码。
  2. nal_ref_idc:取值0~3,代表当前这个NALU的重要性,取值越大,代表当前NALU越重要,就需要优先被保护。尤其是当前NALU为图像参数集、序列 参数集或IDR图像时,或者为参考图像条带(片/Slice),或者为参考图像的条带数据分割时,nal_ref_idc值肯定不为0。IDR帧,即:及时解码刷新图像,它是一个序列的第一个图像,H.264引入IDR图像是为了解码的重新同步。当解码器解码到IDR图像时,立即将参考帧队列清空,将已解码的数据 全部输出或抛弃,重新查找参数集,开始一个新的序列。这样一来,如果前一个序列发生重大错误,在这里就可以获得重新同步。所以IDR图像之后 的图像,永远不会引用IDR图像之前的图像来解码。并且IDR图像一定是I图像,而I图像不一定是IDR图像(H264里没有图像层,图像可以理解为 帧、片或宏块)。
  3. nal_unit_type:顾名思义,这个应该是最好理解的了,它表示NALU Header后面的RBSP的数据结构的类型 pps NALU(图像参数集): sps NALU(序列参数集): IDR NALU(及时解码刷新图像): 其中,SPS 主要包含的是图像的宽、高、YUV 格式和位深等基本信息;PPS 则主要包含熵编码类型、基础 QP 和最大参考帧数量等基本编码信息。

nal_unit_type解析

nal_unit_type在整个码流中是很重要的一环

我们来仔细看看里面都包含了什么内容

1-4:I/P/B帧,如果nal_ref_idc 为0 则表示I帧,不为0则为P/B帧
5:IDR帧,I帧的一种,告诉解码器,之前依赖的解码参数集合(接下来要出现的SPS\PPS等)可以被刷新了。
6:SEI,英文全称Supplemental Enhancement Information,翻译为“补充增强信息”,提供了向视频码流中加入额外信息的方法。
7:SPS,全称Sequence Paramater Set,翻译为“序列参数集”。SPS中保存了一组编码视频序列(Coded Video Sequence)的全局参数。因此该类型保存的是和编码序列相关的参数。
8: PPS,全称Picture Paramater Set,翻译为“图像参数集”。该类型保存了整体图像相关的参数。
9:AU分隔符,AU全称Access Unit,它是一个或者多个NALU的集合,代表了一个完整的帧。

其中SPS,PPS 需要在I帧前出现,不然解码器没法解码?


?

  1. SPS 主要包含的是图像的宽、高、YUV 格式和位深等基本信息;
  2. PPS 则主要包含熵编码类型、基础 QP 和最大参考帧数量等基本编码信息。

如果 没有 SPS、PPS 里面的基础信息,之后的 I 帧、P 帧、B 帧就都没办法进行解码。因此 SPS 和 PPS 是至关重要的。?

03? NALU类型区分

?

00 00 00 01 06 05 SEI数据:是视频的附加增强信息,它包含了一些用户自定义的数据,如时间戳,字幕,弹幕等信息。SEI信息一般放在编码图像之 前,很多时候SEI可以被忽略。

00 00 00 01 67 SPS数据:指的是序列参数集,它保存了一组编码视频序列的全局参数。编码视频序列指的是原始数据经过编码后组成的一系列序号 集。

00 00 00 01 68 PPS数据:指的是图像参数集,主要用于保存图像序列集中一个或者多个独立的图像。一般情况下,配合SPS和PPS都是H264开头的两个 NALU头。

00 00 00 01 65 IDR数据:IDR指的是H264的一帧完整的图像数据,也就是我们经常说的关键帧。?

文章来源:https://blog.csdn.net/weixin_73901182/article/details/135152813
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。