一句话说透计算机视频编码里面的H264的码流结构

277 阅读3分钟

H.264 的码流结构就像快递打包的“分层套娃”——每个盒子有明确标签,按顺序摆放,拆包时一步步拆解!


一、快递盒层级(码流分层)

  1. 大箱子:视频序列(整个视频)

    • 内容:所有GOP(图像组)的集合。
    • 说明书SPS(全局参数,如分辨率、帧率)和PPS(单帧参数,如量化表)。
    • 作用:解码器先读SPS/PPS,才能正确解码后续数据。
  2. 中盒子:GOP(图像组)

    • 内容:一组连续的帧(如I帧 + 多个P/B帧)。
    • 关键帧(I帧) :放在GOP开头,独立完整(如快递盒的底座)。
    • 其他帧(P/B帧) :依赖I帧或前后帧(如叠在底座上的积木)。
  3. 小包裹:帧(Slice切片)

    • 内容:一帧图像被切成多个“切片”(如水平条带)。
    • 作用:网络丢包时,只影响个别切片,不崩全帧。
  4. 最小零件:宏块(16x16像素块)

    • 内容:预测模式、运动矢量、残差数据。
    • 子零件:可再拆为4x4或8x8子块,应对复杂细节。

二、快递标签(头信息与参数)

  1. SPS(序列参数集)

    • 作用:全局说明书,告诉解码器“视频多大、帧率多快、用什么配置”。
    • 必读:没有SPS,解码器完全不知道如何解析后续数据。
  2. PPS(图像参数集)

    • 作用:单帧解码的细节参数,比如“量化表用哪套、熵编码用哈夫曼还是CABAC”。
    • 关联性:一个SPS可对应多个PPS(不同帧用不同参数)。
  3. Slice Header(切片头)

    • 作用:记录切片类型(I/P/B)、参考帧索引、起始位置。
    • 重要性:解码器根据头信息知道如何解析切片内的宏块。

三、装货顺序(码流排列规则)

  1. SPS/PPS必须打头阵

    • 解码器先读“说明书”,否则后续数据无法识别。
    • 类似拆快递先看面单,再拆箱子。
  2. I帧优先,B帧可能乱序

    • 显示顺序I → B → B → P(用户看到的画面顺序)。
    • 存储顺序I → P → B → B(B帧依赖后续P帧,需提前解码)。
    • 解码器会自动调整顺序,确保画面连贯。
  3. 切片独立,灵活传输

    • 直播时网络波动,可优先传关键切片(如人脸区域),次要区域(如背景)后传。

四、为什么设计成这样?

  1. 高效压缩

    • SPS/PPS复用,避免重复存储参数。
    • 分层结构(视频→GOP→帧→切片→宏块)实现精细化压缩。
  2. 抗丢包能力强

    • 切片独立:丢失一个切片不影响其他部分。
    • I帧定期插入:网络中断后,靠新I帧快速恢复画面。
  3. 灵活适应场景

    • 高清电影用长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帧接续省流量。
切片分块防丢包,宏块细抠保质量。
分层设计效率高,视频瘦身又流畅!”