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 单元的大小。

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

相关推荐
Everbrilliant893 天前
音视频之H.264的句法和语义
音视频·h.264·h.264句法和语义·h.264句法表·h.264 nal层语义·h.264序列参数集语义·h.264图像参数集语义
Everbrilliant895 天前
音视频之H.264/AVC编码器原理
音视频·h.264·h.264编解码·h.264帧内预测·h.264帧间预测·h.264的sp/si帧技术·h.264码率控制
Everbrilliant893 个月前
音视频之H.265码流分析及解析
音视频·h.264·h.256·h.256码流分析·音视频编程·vps/sps/pps·hevc流解析
智联视频超融合平台3 个月前
H.264视频编解码:从原理到应用
网络·人工智能·音视频·视频编解码·h.264
口嗨农民工3 个月前
H.264码率结构概念(I帧,帧,B帧)
h.264
音视频牛哥3 个月前
H.264语法结构分析之frame_cropping_flag
计算机视觉·大牛直播sdk·h.264·rtsp播放器·rtmp播放器·frame_cropping·h.264分辨率裁剪
是小果果蛋儿啊3 个月前
H.264,H.265,H.266标准技术改进
h.265·h.264·h.266
sqmeeting4 个月前
视频编解码技术-3: H.264和VP9压缩效率和编码时延
视频编解码·h.264·vp9
ICUD4 个月前
FFmpeg使用H.266/H.264/H.265编解码视频教程
ffmpeg·h.264·h.266