H.264 NALU:网络抽象层单元的结构与传输

404 阅读2分钟

H.264 NALU:网络抽象层单元的结构与传输


一、NALU:网络抽象层单元的本质

NALU(Network Abstraction Layer Unit)是 H.264 视频流的基本传输单元。其核心价值在于将视频编码层(VCL)和网络传输层(NAL)解耦

  • VCL:负责对原始视频数据进行编码。
  • NAL:负责将 VCL 编码后的数据封装成一个个独立的 NALU,使其能够适应不同的网络协议。

二、NALU的结构与关键字段

每个 NALU 都是一个自包含的数据包,其结构由起始码、NAL头和有效载荷组成。

1. 起始码(Start Code)

  • 作用:标记一个 NALU 的开始,方便解码器快速定位。
  • 格式0x0000010x00000001

2. NAL头(Header)

  • 长度:1字节。

  • 关键字段

    • nal_unit_type(5位) :指明 NALU 的类型,如 SPSPPSIDR帧P帧B帧 等。
    • nal_ref_idc(2位) :标识 NALU 的重要性。IDR帧P帧nal_ref_idc 较高,表示它们是关键的参考帧。

3. 有效载荷(Payload)

  • 内容:压缩后的视频帧数据或参数集。

三、NALU的常见类型与作用

类型值名称作用
7SPS(序列参数集)描述视频的全局信息,如分辨率、帧率、编码级别。
8PPS(图像参数集)描述图像级别的解码参数,如量化表。
5IDR帧(即时解码刷新帧)一种特殊的I帧,它标志着一个新的 GOP 的开始,且不引用其后面的任何帧。
1P帧(非IDR帧)依赖前一帧解码的数据。
1B帧(非IDR帧)依赖前后帧解码的数据。

四、NALU的传输与存储

  • 网络传输:在 RTP 协议中,一个大的 NALU 可能会被分割成多个包进行传输。SPSPPSIDR帧 是关键 NALU,它们通常会被优先传输,以确保解码器能够正确初始化。
  • 文件存储:在 MP4 文件中,SPSPPS 通常存储在文件头的 moov box 中,而不是在视频流中。视频流中的 NALU 会用一个长度前缀(通常是 4 字节)来替代起始码。

结论

NALU 是 H.264 编码标准的核心。它通过分层设计,将视频数据封装成一个个独立的单元,从而实现了在不同网络环境中的高效传输、容错和快速定位。