P3 H264的码流结构分析——VCL和NAL
目录
前言
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板
🎬 个人主页:@ChenPi
🐻推荐专栏1: 《C++_@ChenPi的博客-CSDN博客》????
🔥 推荐专栏2: 《Linux C应用编程(概念类)_@ChenPi的博客-CSDN博客》???
🛸推荐专栏3:《嵌入式音视频_@ChenPi的博客-CSDN博客》
🌺本篇简介 ?:这章记录编解码的基础理论知识——H264的码流结构NAL与VCL
?H264分层能够分成两层,一层是VCL层(视频编码层),另外一层是NAL层(网络提取层)。
- NAL网络提取层:负责以网络所要求的恰当的方式对数据进行打包和传送
- 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由三个句法元素组成,分别为:
- forbidden_zero_bit
- nal_ref_idc
- nal_unit_type
它们总共占据一个字节,也就 是说,NALU Header,在整个NALU中,占据一个字节。
而且forbidden_zero_bit的值对应1个bit,nal_ref_idc的值对应2个bit,nal_unit_type的值对应5个bit,加起来刚好一个字节。
- forbidden_zero_bit(禁止位):h264文档规定,这个值应该为0,当它不为0时,表示网络传输过程中,当前NALU中可能存在错误,解码器可以考虑 不对这个NALU进行解码。
- 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里没有图像层,图像可以理解为 帧、片或宏块)。
- 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帧前出现,不然解码器没法解码?
?
- SPS 主要包含的是图像的宽、高、YUV 格式和位深等基本信息;
- 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的一帧完整的图像数据,也就是我们经常说的关键帧。?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!