视频编解码与 GOP 结构详解

视频编解码与 GOP 结构详解

1. 帧类型

在 H.264/AVC 编码中,视频由不同类型的帧组成:

  • I 帧 (Intra-coded frame)

    • 关键帧,独立编码,不依赖其他帧。
    • 解码器可以从 I 帧开始解码。
    • 压缩率最低,但解码起点。
  • P 帧 (Predicted frame)

    • 前向预测帧,参考之前的 I/P 帧。
    • 压缩率比 I 帧高。
    • 解码时必须依赖前面的参考帧。
  • B 帧 (Bi-directional predicted frame)

    • 双向预测帧,同时参考前后的 I/P 帧。
    • 压缩率最高,但解码延迟大。
    • 必须等到前后参考帧解码完成后才能解码。

2. GOP (Group of Pictures)

  • 定义:一组图像的结构,通常从一个 I 帧开始,到下一个 I 帧结束。
  • N (Number) :GOP 长度,即两个 I 帧之间的总帧数。
    • 例如 N=30 → 每 30 帧一个 I 帧。
  • M (Multiple) :参考帧间隔,决定 P 帧之间插入多少 B 帧。
    • M=1 → 没有 B 帧,只有 I/P。
    • M=3 → 每两个 P 帧之间插入 2 个 B 帧。

示例

  • GOP=12, M=3 → 帧序列:

    复制代码
    I B B P B B P B B P B B I

3. 显示顺序 vs 解码顺序

视频播放时的顺序和解码器内部的解码顺序不同,尤其是有 B 帧时。

显示顺序(播放时看到的)

复制代码
I → B → B → P → B → B → P → B → B → P → B → B → I

解码顺序(解码器内部处理)

复制代码
I → P → B → B → P → B → B → P → B → B → I → B → B

盒示意图

复制代码
显示顺序:  [ I ][ B ][ B ][ P ][ B ][ B ][ P ][ B ][ B ][ P ][ B ][ B ][ I ]

解码顺序: [ I ][ P ][ B ][ B ][ P ][ B ][ B ][ P ][ B ][ B ][ I ][ B ][ B ]

👉 解码器必须先解码 I 和 P 帧,才能"回头"解码前面的 B 帧,这就是 B 帧带来延迟的原因。


4. 编码参数

  • 码率 (bps) :决定画质和压缩程度。
    • 高码率 → 画质好,文件大。
    • 低码率 → 画质差,文件小。
  • GOP 长度 (N):关键帧间隔,影响随机访问和容错能力。
  • M 值:是否插入 B 帧,影响压缩率和延迟。
  • Profile/Level :决定编码器能支持的分辨率和帧率上限。
    • High@L4.0 → 支持 1080p@30fps。
    • High@L4.2 → 支持 1080p@60fps。
  • 参考帧数:影响压缩效率和解码复杂度。
  • 熵编码方式 (CABAC/CAVLC):影响压缩率和解码速度。

5. 常见场景推荐参数

  • 直播/实时编码

    • GOP = 帧率(每秒一个关键帧)。
    • M = 1(无 B 帧,低延迟)。
    • 码率:1080p60 → 8~12 Mbps。
  • 点播/录像

    • GOP 可设为 2 秒或更长。
    • M > 1(有 B 帧,压缩率高)。
    • 码率可适当降低以节省空间。
  • 监控场景

    • GOP 较短(提高容错)。
    • M = 1(低延迟)。
    • 码率中等,保证清晰度。

6. 总结

  • I/P/B 是帧类型的缩写,直接对应编码方式。
  • GOP/M/N 是结构参数,用来描述关键帧间隔和 B/P 帧分布。
  • 编码效果主要由 GOP、M、码率决定,同时受 Profile/Level、参考帧数、熵编码方式影响。
  • 在实时场景下,通常选择短 GOP、无 B 帧、较高码率;在存储场景下,可以选择长 GOP、有 B 帧、较低码率以提高压缩率。
相关推荐
IMPYLH11 小时前
Linux 的 chroot 命令
linux·运维·服务器
克莱因35811 小时前
Linux Cent OS7 at定时任务
linux·运维·服务器
RisunJan11 小时前
Linux命令-make(GNU的工程化编译工具)
linux·运维·gnu
闲猫11 小时前
Linux 历史命令(history)
linux·运维·chrome
程序员小董12 小时前
从 RocksDB 定时器出发:手写一个通用的 Linux 高精度定时器
linux·服务器
旺仔.29112 小时前
线程安全 详解
linux·计算机网络·安全
yuuki23323314 小时前
【Linux】开发工具链全解析:从 apt 到 gdb
linux·运维·服务器
wangjialelele14 小时前
C++11、C++14、C++17、C++20新特性解析(一)
linux·c语言·开发语言·c++·c++20·visual studio
²º²²এ松15 小时前
vs code连接ubuntu esp项目
linux·数据库·ubuntu
浪客灿心15 小时前
Linux进程信号
linux