H.264 NALU:网络抽象层单元的结构与传输
一、NALU:网络抽象层单元的本质
NALU(Network Abstraction Layer Unit)是 H.264 视频流的基本传输单元。其核心价值在于将视频编码层(VCL)和网络传输层(NAL)解耦。
VCL:负责对原始视频数据进行编码。NAL:负责将VCL编码后的数据封装成一个个独立的 NALU,使其能够适应不同的网络协议。
二、NALU的结构与关键字段
每个 NALU 都是一个自包含的数据包,其结构由起始码、NAL头和有效载荷组成。
1. 起始码(Start Code)
- 作用:标记一个 NALU 的开始,方便解码器快速定位。
- 格式:
0x000001或0x00000001。
2. NAL头(Header)
-
长度:1字节。
-
关键字段:
nal_unit_type(5位) :指明 NALU 的类型,如SPS、PPS、IDR帧、P帧、B帧等。nal_ref_idc(2位) :标识 NALU 的重要性。IDR帧和P帧的nal_ref_idc较高,表示它们是关键的参考帧。
3. 有效载荷(Payload)
- 内容:压缩后的视频帧数据或参数集。
三、NALU的常见类型与作用
| 类型值 | 名称 | 作用 |
|---|---|---|
| 7 | SPS(序列参数集) | 描述视频的全局信息,如分辨率、帧率、编码级别。 |
| 8 | PPS(图像参数集) | 描述图像级别的解码参数,如量化表。 |
| 5 | IDR帧(即时解码刷新帧) | 一种特殊的I帧,它标志着一个新的 GOP 的开始,且不引用其后面的任何帧。 |
| 1 | P帧(非IDR帧) | 依赖前一帧解码的数据。 |
| 1 | B帧(非IDR帧) | 依赖前后帧解码的数据。 |
四、NALU的传输与存储
- 网络传输:在 RTP 协议中,一个大的 NALU 可能会被分割成多个包进行传输。
SPS、PPS和IDR帧是关键 NALU,它们通常会被优先传输,以确保解码器能够正确初始化。 - 文件存储:在
MP4文件中,SPS和PPS通常存储在文件头的moovbox 中,而不是在视频流中。视频流中的 NALU 会用一个长度前缀(通常是 4 字节)来替代起始码。
结论:
NALU 是 H.264 编码标准的核心。它通过分层设计,将视频数据封装成一个个独立的单元,从而实现了在不同网络环境中的高效传输、容错和快速定位。