H.264码流格式分析

一、H.264视频基础信息

  • Profile(配置文件): 决定编码工具集

    Baseline(66):简单场景(视频会议)

    Main(77):标准场景(数字电视)

    High(100):高清场景(蓝光电影)

  • Level(等级): 决定处理能力

    数字越大要求越高(如Level 4.1支持1080p)

  • 分辨率与裁剪:

    原始尺寸(如1920x1080)

    实际显示区域(通过crop参数调整)

  • 色彩信息:

    色度格式:YUV420(最常用)、YUV422、YUV444

    位深度:8-bit(普通)、10-bit(HDR)

  • 编码特性:

    熵编码:CABAC(高效)/CAVLC(简单)

    帧率:视频流畅度指标

这些信息存储在SPS(序列参数集)和PPS(图像参数集)中,是视频解码的"说明书"

二、NAL单元(Network Abstraction Layer)

NALU是对原始视频帧进行编码后的数据单元 , 它包含了视频数据的编码信息。

Network Abstraction Layer网络抽象层单元 , 是视频数据的基本组成单元。

bash 复制代码
+-----------------------------------------------------------+
|             Start Code (4 bytes) 00 00 00 01              |
|-----------------------------------------------------------|
|                    NALU Header (1 byte)                   |
|  +-------------------+-----------------+----------------+ |
|  | forbidden_zero_bit | nal_ref_idc    | nal_unit_type  | |
|  +-------------------+-----------------+----------------+ |
|                                                           |
|                    NALU Payload (variable size)           |
|-----------------------------------------------------------|
|           Encoded Video Data or SPS/PPS/SEI Data          |
+-----------------------------------------------------------+
组成部分 功能说明
起始码(4字节) 0x000001 或 0x00000001,标识NAL单元开始
NAL头(1字节) 包含3个关键信息:禁止位(1bit) 、重要性(2bits) 、类型(5bits)
有效载荷 实际视频数据(切片/SPS/PPS等)

① Start Code 起始标志位

Start Code 是用来标识 NALU 单元的开始位置 , 确保编码数据流可以被正确地识别和分割 ;

Start Code 是一个 固定的 4 字节序列 : 0x00 0x00 0x00 0x01 , 是 NALU 单元的开始标记 , 帮助解码器识别每个 NALU 单元的起始位置 ;

特殊情况 : 在特定的传输方式中 , 如 : RTP 包 , Start Code 是 3 字节序列 0x00 0x00 0x01

② NALU Header 头

NALU Header 用于 说明 当前 NALU 的类型 , 以及 控制信息 , 如 : 是否是参考帧、NALU 的优先级等 ;

NALU Header 组成


forbidden_zero_bit:

为0时表示格式正确,不包含错误信息

为1时表示格式有问题,应当忽略该NALU。

nal_ref_idc: 范围0-3

0表示NALU不是参考帧

1表示低优先级参考帧

2表示中优先级参考帧

3表示高优先级参考帧
这个字段对于视频的解码和播放至关重要!会影响解码的顺序和方式。

nal_unit_type:

③ NALU Payload 载荷

NALU Payload 包含了 NALU 的 实际编码数据 , 数据的具体内容取决于 NALU 的 nal_unit_type 类型 。

  • VCL 数据 : nal_unit_type 类型 取值 1 ~ 5 , 则该 NALU 是视频帧数据 , 如 : I 帧、P 帧、B 帧 , 负载部分会包实际的帧编码内容 。
  • NAL 数据 : nal_unit_type 类型 取值 6 ~ 13 , 这些类型是辅助层 , 提供 元信息 和 流控制 。

关系图

NALU 传输注意事项

传输 H.264 裸流的时候 , 发送 I 帧之前 , 至少要向解码器发送一次 SPS 和 PPS , 如果 解码器 收不到 SPS 和 PPS 数据 , 解码器解码会失败 ;

注意 : 不是每个 I 帧都要发送 SPS 和 PPS 数据 , 在单个 H.264 视频流中 , 至少发一次 。

一张图像帧可能对应有多个 NALU , 如 上图所示 , 一个 I 帧被分成两个NALU发送 。

H.264 封装模式 - annexb模式 / MP4 模式

H.264 视频流有2 种不同的封装模式 , 以适应不同的传输和存储场景 。

  • Annex B 模式 : H.264 标准定义的裸流封装方式 , 常用于网络实时传输, 其实就是NALU 裸流封装 , 结构为 [Start Code] + [NALU Header] + [NALU Payload]

特点:

起始码分隔 : 每个 NAL 单元 以固定的 0x000001 或 0x00000001 起始码 开头 , 用于分隔 NALU 单元。

实时解码 : 视频流 中不包含 时间戳 等 元信息 , 适合实时解码。

适合传输 : 适合RTSP / RTMP / UDP / RTP 实时流媒体传输 , 不适用于存储 , 因为存储时信息不够完整。

  • MP4 模式 : 基于 文件容器格式 的封装方式 , 主要用于本地存储 , NALU 单元 被封装到 容器文件中 , 配合元信息进行管理。如 : MP4 / MKV 等容器格式 。

特点 :

元信息丰富 : 包含 时间戳、帧偏移、关键帧索引等信息,便于随机访问和播放。

长度前缀 : 每个 NAL 单元前使用 4 字节 长度前缀 代替起始码,表示后续 NAL 单元的大小。

适合存储: 由于元信息完善,适用于文件存储和编辑。

相关推荐
不太会编程的IT男2 天前
在 Jetson Orin 开发套件上使用 Hardware Encoder / Decoder 构建 FFmpeg
ffmpeg·视频编解码·h.264
melonbo3 天前
使用FFmpeg将H.264码流封装为MP4
ffmpeg·音视频·h.264
电子科技圈4 天前
SmartDV推出先进的H.264和H.265视频编码器和解码器IP
音视频·h.265·h.264
Everbrilliant8916 天前
音视频之H.264的可伸缩编码SVC
h.264·h.264可伸缩编码·h.264 svc·可伸缩编码原理·空域可伸缩性·时域可伸缩性·质量可伸缩性
wkd_00717 天前
【音视频 | RTP】RTP协议详解(H.264的RTP封包格式、AAC的RTP封包格式)
音视频·aac·h.264·rtp·rtp封包
Everbrilliant8918 天前
音视频之H.264视频编码传输及其在移动通信中的应用
音视频·h.264·h.264视频编码传输·h.264移动通信的应用·h.264容错技术·h.264精确码率控制算法
Everbrilliant8923 天前
音视频之H.264的句法和语义
音视频·h.264·h.264句法和语义·h.264句法表·h.264 nal层语义·h.264序列参数集语义·h.264图像参数集语义
Everbrilliant8925 天前
音视频之H.264/AVC编码器原理
音视频·h.264·h.264编解码·h.264帧内预测·h.264帧间预测·h.264的sp/si帧技术·h.264码率控制
Everbrilliant894 个月前
音视频之H.265码流分析及解析
音视频·h.264·h.256·h.256码流分析·音视频编程·vps/sps/pps·hevc流解析