图像、帧、片、NALU 是学习 H.264 的人常常感到困惑的一些概念,我在这里对自己的理解做一些阐述,欢迎大家讨论:
H.264 是一次概念的革新,它打破常规,完全没有 I 帧、P帧、B 帧的概念,也没有 IDR 帧的概念。对于 H.264 中出现的一些概念从大到小排序依次是:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。这里有几点值得说明:
(1)、在 H.264 协议中图像是个集合概念,顶场、低场、帧都可以称为图像(本文后面内容用到图像概念时都是集合概念,不再重复说明)。因此我们可以知道,对于 H.264 协议来说,我们平常所熟悉的那些称呼,例如:I 帧、P 帧、B 帧等等,实际上都是我们把图像这个概念具体化和细小化了,即我们提到的“帧”通常就是指不分场的图像;
(2)、如果不采用 FMO(灵活宏块排序) 机制,则一幅图像只有一个片组;
(3)、如果不使用多个片,则一个片组只有一个片;
(4)、如果不采用 DP(数据分割)机制,则一个片就是一个 NALU,一个 NALU 也就是一个片。否则,一个片由三个 NALU 组成(即标准“表7-1”中 nal_unit_type 值为 2、3、4 的三个 NALU 属于一个片);
(5)、以上所述的片和 NALU 的大小关系并不是抽象概念上的从属关系。从概念的从属关系上来看,NALU其实又是片的一个集合概念,例如:标准“表7-1”中 nal_unit_type 值为 5 的 NALU 包括 I 片或者 SI 片。
一幅图像根据组成它的片类型来分,可以分为标准“表7-5”中的 8 种类型。我们平常应用中所最常见到的其实是这些类型的特例。例如:我们平常所谓的“I 帧”和“IDR 帧”,其实是 primary_pic_type 值为 0 的图像,我们平常所谓的“P帧”其实是 primary_pic_type 值为 1 的图像的特例,我们平常所谓的“B帧”其实是 primary_pic_type 值为 2 的图像的特例。
一幅图像根据概念来分可以分为两种:IDR 图像和非 IDR 图像。一幅图像是否是 IDR 图像是由组成该图像的 NALU 决定的,如果组成该图像的 NALU 为标准“表7-1”中 nal_unit_type 值为 5 的 NALU,则该图像为 IDR 图像,否则为非 IDR 图像。这里也有几点值得说明:
(1)、nal_unit_type 值为 5 的 NALU 只会出现在 IDR 图像中,而 IDR 图像中的所有 NALU 都是nal_unit_type 值为 5 的 NALU;
(2)、我们以组成一幅图像的片的类型来区分该图像是否是 IDR 图像是错误的。例如:一幅图像中的所有片都是 I 片并不代表这幅图像就是 IDR 图像。因为 I 片也可以从属于 nal_unit_type 值为 1 的 NALU。只不过我们平常最常见到的形式是:所有片都是 I 片的图像就是 IDR 图像。其实这个时候 IDR 图像的概念也被我们具体化和细小化了。
一幅图像由 1~N 个片组组成,而每一个片组又由一个或若干个片组成。图像解码过程中总是按照片进行解码,然后按照片组将解码宏块重组成图像。从这种意义上讲,片实际是最大的解码单元。而一个片又包含哪些类型的宏块呢?标准“表7-10”做了最好的说明。一个 I 宏块又分为哪些类型呢?标准“表7-11”做了最好的说明。一个 P 宏块又分为哪些类型呢?标准“表7-13”做了最好的说明。一个 B 宏块又分为哪些类型呢?标准“表7-14”做了最好的说明。一个 P 宏块的亚宏块又分为哪些类型呢?标准“表7-17”做了最好的说明。一个 B 宏块的亚宏块又分为哪些类型呢?标准“表7-18”做了最好的说明。
引用
http://bbs.chinavideo.org/viewthread.php?tid=3044
分享到:
相关推荐
每个NALU可能对应于一个或多个图像帧,或者编码参数集。通过分析这个文件,可以进一步理解示例是如何处理NAL单元的。 GCC编译器的提及表明,这个示例是用C语言编写的,这是一门广泛用于系统编程和底层开发的语言。...
在H.264编码过程中,视频帧会被分为不同的NALU单元,这些单元包括SPS(序列参数集),PPS(图像参数集),I帧关键帧的头部和片数据,P帧和B帧的头部和片数据等。nal_ref_idc值较高的NALU单元,如序列头和I帧的头部,...
为了适应不同网络环境的带宽限制,NALU还可以进行分片或者重组,以确保视频流的顺畅传输。 **NALU与视频编码效率** NALU的设计有助于提高视频编码效率。通过分离不同的编码信息,编码器可以针对不同类型的NALU使用...
例如,对于I帧(关键帧),解码器可以完全重建图像;对于P帧和B帧,解码器会利用先前解码的帧信息来重建当前帧,从而实现压缩。 4. **播放机制**: 解码后的视频数据通常是以YUV格式的像素数据存在,这些数据会被...
I帧(Intra Picture)是帧内编码帧,相当于一个完整的图像,用于随机访问和解码参考。它自身可以解压成一张完整的图片,压缩率相对较高。 P帧(Predictive-frame)是前向预测编码帧,依赖于前面的I帧或P帧来生成...
"H264裸流帧解码器"就是这样的工具,它能够将H264编码的裸流帧转化为可以被处理的图像格式,例如OpenCV库中的Iplimage类型。 OpenCV是一个广泛使用的开源计算机视觉库,支持图像处理和机器学习等功能。Iplimage是...
例如,H264E_NALU_BSLICE表示当前帧为B帧,H264E_NALU_PSLICE表示当前帧为P帧,H264E_NALU_ISLICE表示当前帧为I帧等。 在海思编码帧判断过程中,还需要对序列参数集(SPS)和图像参数集(PPS)进行处理。序列参数集...
本文档记录了海思 3519 的调试过程,涵盖了 YUV 转 RGB 功能调试、IVE 的 yuv 转 rgb 功能调试、vpss 属性结构体的设置、vo 状态的检查、h264 和 h265 帧格式的解析等方面的知识点。 一、YUV 转 RGB 功能调试 在 ...
I帧(Intra Coded Frame)是无参考帧的图像,包含完整的图像信息,是解码过程中的关键帧。P帧(Predicted Frame)依赖于前一个I或P帧进行预测编码,而B帧(Bidirectional Predicted Frame)则同时依赖于前一个和后一...
NALU是H264编码的传输格式,它定义了片级以上的语法级别,负责以网络所要求的恰当方式去格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。 六、H264编码的基本原理 H264编码的基本原理包括宏块...
高效的帧边界识别方法通常涉及到对NALU头部的解析,以及对序列参数集(SPS)和图像参数集(PPS)的正确处理,以确保每个图像的解码都基于正确的参数集。 ### 解码示例与数据类型 《H.264 PC解码库软件开发指南》...
序列参数集 SPS 作用于一系列连续的编码图像,而图像参数集 PPS 作用于编码视频序列中一个或多个独立的图像。如果解码器没能正确接收到这两个参数集,那么其他 NALU 也是无法解码的。因此它们一般在发送其它 NALU ...
6. 图像重构:将预测帧与残差相加,得到解压缩后的图像。 三、Visual Studio环境配置 在Visual Studio中开发H.264解码器,首先需要安装支持C++的开发环境,然后添加必要的库和头文件。例如,可以使用OpenH264库,这...
H.264标准定义了视频数据的帧头格式,包括网络抽象层单元(NALU)的类型、打包模式以及RTP负载格式。以下是基于提供的文件内容对H.264帧头格式定义的知识点进行详细解读。 首先,H.264的NALU(Network Abstraction ...
IDR帧可以通过NALU的类型字段进行识别,当NALU类型为5时,表示该NALU携带的是IDR帧的第一个Slice。 ##### 2.4 帧边界识别方法 帧边界识别对于准确解码视频流至关重要。在H.264中,由于取消了传统的帧结构,帧边界...
每个NALU都有一个特定的类型标识符,用以指示其包含的数据类型,例如图像帧数据、参数集数据或其他控制信息。 ##### 1.2 参数集概念 参数集是H.264编码中用于描述视频编码参数的一个关键组成部分。每个视频流可以...
这通常涉及解析RTP头部信息、识别NALU类型以及重新组装被分片的NALU。 #### 安全与拥塞控制考虑 - **安全考虑**:虽然RTP本身没有提供加密机制,但在实际应用中可以通过其他协议(如SRTP)来保障数据的安全传输。 ...
4. **P-Frame**:通过预测当前帧与前一帧之间的差异来编码的图像帧。P-Frame的nal_unit_type值为1。 #### NAL单元的解析过程 当处理H.264码流时,我们通常会遇到以下代码段,用于解析NAL单元的起始字节和类型: `...