视频编解码与 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 帧、较低码率以提高压缩率。
相关推荐
lsh曙光2 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫2 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
似的8353 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
我不管我就要叫小猪4 小时前
嵌入式Linux----网络通信
linux·运维·服务器
泡沫冰@5 小时前
ECS 的介绍和使用
linux·服务器·网络
姜太小白5 小时前
【Linux】df -h 卡住问题的通用排查与解决方案总结
linux·运维·php
fengyehongWorld6 小时前
Linux 终端快捷键
linux·运维
哎呦喂我去去去7 小时前
C#实现屏幕墙:同时监控多个电脑桌面(支持Windows、信创Linux、银河麒麟、统信UOS)
linux·windows·c#
easy_coder8 小时前
Linux LVM 知识文档
linux·运维
小小的木头人9 小时前
Ubuntu 使用 udev + systemd + UUID 实现 USB 硬盘自动挂载
linux·运维·ubuntu