跳到主要内容

H264相关概念

阅读量: 101阅读人次: 102

H.264 码流分为两层:

  • VCL 层:负责视频内容的高效压缩,生成原始数据(SODB)
  • NAL 层:将 VCL 数据打包为 NALU,添加头部和封装信息,便于传输

NALU

NALU(Network Abstraction Layer Unit)是 H.264 码流的基本传输单元,负责将编码后的视频数据封装成适合网络传输或存储的格式。其核心作用包括:

  • 数据封装:将 VCL(视频编码层)生成的原始数据(如宏块、片)转换为标准化的网络传输单元
  • 网络适配:通过头部信息(如优先级、类型)适应不同网络环境(如丢包、带宽限制)
  • 错误恢复:通过参数集(SPS、PPS)和分片机制提高传输鲁棒性

每个 NALU 由三部分组成:

[起始码] [NALU Header] [NALU Payload]
  • 起始码(Start Code):标识 NALU 的开始,通常为 0x00000001(帧起始)或 0x000001(非帧起始)。
  • NALU Header:1 字节头部,包含关键控制信息(见下文)。
  • NALU Payload:实际数据负载,如 RBSP(原始字节序列载荷)或 EBSP(扩展字节序列载荷)。

并不是所有H.264传输场景都需要起始码,起始码仅用于无边界标识的连续字节流(如文件),RTP等协议通过自身机制实现边界管理。

NALU 头部

头部结构(1 字节):

+---------------+  
|F|NRI| Type |
+---------------+
  • F(Forbidden Bit):1 位,通常为 0;若为 1 表示网络传输中检测到错误

  • NRI(重要性指示):2 位,值越高表示该 NALU 越关键(如 SPS、PPS 优先级为 3)

  • Type(类型标识):5 位,定义 NALU 的用途

    Type值类型说明常见场景
    1非 IDR 帧的片(Slice)P/B 帧数据
    5IDR 帧的片关键帧(I 帧)
    6SEI(增强信息)时间戳、版权信息
    7SPS(序列参数集)编码全局参数(分辨率等)
    8PPS(图像参数集)解码参数(量化表等)
    9AU Delimiter(分隔符)分隔不同帧

NALU 的封装与传输

  • 封装格式
    • Annex-B 格式:使用起始码分隔 NALU,适用于实时流(如 RTP 传输)。
    • AVCC 格式:用长度前缀(如 4 字节)标识 NALU 大小,适合文件存储(如 MP4、MKV)
  • 分片(Slice)与帧(Frame)
    • 一帧视频可能被分割为多个片(Slice),每个片封装为一个 NALU。
    • IDR 帧(关键帧)必须独立解码,其 NALU 头部类型为 5,并携带 SPS/PPS 参数集。

应用场景与开发实践

  • 流媒体传输
    • 使用 RTP 协议传输时,每个 NALU 作为独立的 RTP 包发送。
    • SEI 信息可用于携带时间戳或版权标识。
  • 错误处理
    • 丢弃 NRI=0 的 NALU(如 B 帧)以应对网络拥塞。
    • 通过 SPS/PPS 重传实现解码器恢复。