H.264 的码流结构就像快递打包的“分层套娃”——每个盒子有明确标签,按顺序摆放,拆包时一步步拆解!
一、快递盒层级(码流分层)
-
大箱子:视频序列(整个视频)
- 内容:所有GOP(图像组)的集合。
- 说明书:
SPS(全局参数,如分辨率、帧率)和PPS(单帧参数,如量化表)。 - 作用:解码器先读SPS/PPS,才能正确解码后续数据。
-
中盒子:GOP(图像组)
- 内容:一组连续的帧(如I帧 + 多个P/B帧)。
- 关键帧(I帧) :放在GOP开头,独立完整(如快递盒的底座)。
- 其他帧(P/B帧) :依赖I帧或前后帧(如叠在底座上的积木)。
-
小包裹:帧(Slice切片)
- 内容:一帧图像被切成多个“切片”(如水平条带)。
- 作用:网络丢包时,只影响个别切片,不崩全帧。
-
最小零件:宏块(16x16像素块)
- 内容:预测模式、运动矢量、残差数据。
- 子零件:可再拆为4x4或8x8子块,应对复杂细节。
二、快递标签(头信息与参数)
-
SPS(序列参数集)
- 作用:全局说明书,告诉解码器“视频多大、帧率多快、用什么配置”。
- 必读:没有SPS,解码器完全不知道如何解析后续数据。
-
PPS(图像参数集)
- 作用:单帧解码的细节参数,比如“量化表用哪套、熵编码用哈夫曼还是CABAC”。
- 关联性:一个SPS可对应多个PPS(不同帧用不同参数)。
-
Slice Header(切片头)
- 作用:记录切片类型(I/P/B)、参考帧索引、起始位置。
- 重要性:解码器根据头信息知道如何解析切片内的宏块。
三、装货顺序(码流排列规则)
-
SPS/PPS必须打头阵
- 解码器先读“说明书”,否则后续数据无法识别。
- 类似拆快递先看面单,再拆箱子。
-
I帧优先,B帧可能乱序
- 显示顺序:
I → B → B → P(用户看到的画面顺序)。 - 存储顺序:
I → P → B → B(B帧依赖后续P帧,需提前解码)。 - 解码器会自动调整顺序,确保画面连贯。
- 显示顺序:
-
切片独立,灵活传输
- 直播时网络波动,可优先传关键切片(如人脸区域),次要区域(如背景)后传。
四、为什么设计成这样?
-
高效压缩
- SPS/PPS复用,避免重复存储参数。
- 分层结构(视频→GOP→帧→切片→宏块)实现精细化压缩。
-
抗丢包能力强
- 切片独立:丢失一个切片不影响其他部分。
- I帧定期插入:网络中断后,靠新I帧快速恢复画面。
-
灵活适应场景
- 高清电影用长GOP(几百帧一个I帧),视频会议用短GOP(1秒一个I帧)。
- 手机端可降低量化精度省电,PC端开最高画质。
五、实例解析(H.264码流片段)
[视频流]
├── SPS(分辨率1920x1080, 帧率30, 配置参数)
├── PPS(量化表A, CABAC编码)
├── GOP1
│ ├── I帧(切片1~N,完整画面)
│ ├── P帧(参考GOP1的I帧,记录运动变化)
│ └── B帧(双向参考,存储顺序在P帧后)
├── GOP2
│ ├── I帧
│ └── ...
六、总结口诀
“H.264码流像套娃,SPS/PPS是总纲。
I帧开篇立根基,P/B帧接续省流量。
切片分块防丢包,宏块细抠保质量。
分层设计效率高,视频瘦身又流畅!”