
一、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 单元的大小。
适合存储: 由于元信息完善,适用于文件存储和编辑。