图像、帧、片、NALU(firstime)

本文详细解释了H.264视频编码标准中的关键概念,如图像、帧、片组、片和NALU等,并澄清了常见的误解,如I帧、P帧和B帧的具体含义。

图像、帧、片、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”做了最好的说明。

楼上还是没看明白哈。例如一帧 CIF 图像尺寸为 352*288;不分场时可以叫图像,也可以叫帧,其大小为 352*288;分场后其中一半也可以叫图像,也可以叫顶场,其大小为 352*144,另一半也可以叫图像,也可以叫低场,其大小为 352*144。各个论文中提到的帧一般都是指不分场时候的图像
——(1)、在 H.264 协议中图像是个集合概念,顶场、低场、帧都可以称为图像(本文后面内容用到图像概念时都是集合概念,不再重复说明)。因此我们可以知道,对于 H.264 协议来说,我们平常所熟悉的那些称呼,例如:I 帧、P 帧、B 帧等等,实际上都是我们把图像这个概念具体化和细小化了

<think>好的,我现在需要回答用户关于H.264中非VCL NALU与关键的关系的问题。首先,我得回忆一下H.264的基本结构和NALU的分类。 用户提到的非VCL NALU包括SPS、PPS、SEI等,这些不属于视频编码层,而是元数据信息。而关键通常是IDR,属于VCL NALU。但用户问的是非VCL NALU如何与关键相关联,可能是在问这些参数集在关键中的作用。 我需要确认SPS和PPS在编码过程中的作用,特别是在解码关键时是否需要它们。比如,SPS包含分辨率、率等信息,PPS包含熵编码模式等参数。解码器在收到IDR前必须先获取SPS和PPS,否则无法正确解码。因此,非VCL NALU为关键提供必要的配置信息。 另外,SEI可能携带补充信息,比如时间戳或版权信息,虽然不直接影响解码,但有助于播放。用户可能想知道这些非VCL单元如何支持关键的播放和解码。 还需要注意,在H.264码流中,关键(IDR)通常前面会有SPS和PPS,尤其是在流媒体中,这样确保解码器能正确初始化。非VCL NALU在关键出现前发送,确保解码器准备好参数。这可能涉及码流打包模式,比如annexb模式使用起始码分隔NALU,而MP4模式则不同。 需要检查引用中的内容是否符合这些知识点。引用[2]提到非VCL NALU包括SPS、PPS,而引用[3]讨论了封装模式,这可能影响非VCL NALU的传输顺序。需要确保回答中正确引用这些资料。 总结:非VCL NALU本身不是关键,但为关键的解码提供必要参数。关键(IDR)依赖这些参数集才能正确解码,因此在码流中非VCL NALU通常出现在关键之前,确保解码器配置正确。</think>### 非VCL NALU与关键的关联解析 #### 一、核心概念区分 1. **非VCL NALU** 指H.264码流中不携带实际图像数据的单元,主要包括: - **SPS(序列参数集)**:存储分辨率、率、编码档次等全局参数[^2] - **PPS(图像参数集)**:定义熵编码模式、分参数等解码配置[^2] - **SEI(补充增强信息)**:携带时间戳、版权信息等辅助数据[^3] 2. **关键(IDR)** 属于VCL NALU(`nal_unit_type=5`),特点: - 强制清空解码器缓存,实现随机访问的断点[^1] - 携带完整内编码的宏块数据 #### 二、非VCL NALU对关键的作用 1. **解码初始化基础** - 解码器处理IDR前必须获取SPS/PPS,否则无法解析分辨率、熵编码方式等关键参数 - 示例流程: ``` 接收SPS → 解析全局参数 → 接收PPS → 配置解码器 → 接收IDR → 开始解码 ``` 2. **码流封装规则** - AnnexB模式(常见于实时流)中,关键前必须包含SPS/PPS - MP4封装模式通过外部容器存储参数集,但仍需通过`stsd`盒子关联[^3] 3. **同步保障机制** - 当发生码流切换(如直播清晰度切换)时,新的SPS/PPS会与IDR组合发送,确保解码器重置后正确解析新参数[^1] #### 三、典型数据单元关系 ```mermaid graph LR A[非VCL NALU] --> B(SPS) A --> C(PPS) A --> D(SEI) E[VCL NALU] --> F(IDR) E --> G(非IDR) B --> H[解码器初始化] C --> H F --> I[完整图像解码] H --> I ``` #### 四、开发实践要点 1. **推流场景** - 首次推送必须包含SPS/PPS + IDR组合 - 使用`ffmpeg`分析码流结构: ```bash ffprobe -v debug -show_packets input.h264 ``` 2. **错误处理** - 解码失败时需检查参数集是否丢失或过期 - 重传机制需保证SPS/PPS与IDR的绑定传输
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值