【音视频】闭合GOP和开放GOP
参考资料:https://cloud.tencent.com/developer/article/1919128
一、GOP 的概念
-
在视频编码中,GOP(Group of Pictures,图像组) 是由连续的视频帧组成的序列,包含 I 帧(关键帧)、P 帧(前向预测帧)和 B 帧(双向预测帧)等不同类型的帧,用于平衡压缩效率和解码灵活性。
-
闭合 GOP 和开放 GOP 是两种不同的 GOP 结构,核心区别在于帧之间的参考关系是否局限于当前 GOP 内部。
-
P帧和B帧参考其他帧进行时域预测。用作预测的帧既可以是I帧和P帧,也可以是被参考的B帧。H.264/AVC允许将这三种类型的帧组合起来形成多个预测帧。
-
问题来了——分析显示顺序(Display Order)时,预测/参考帧的位置在哪里?换言之,P帧和B帧可以参考几个GOP之前的帧吗?这样做也许会呈现最好的效果,为什么不这样做呢?
为了回答这些问题,我们需要先理解闭合GOP和开放GOP的概念
二、闭合GOP
2.1 闭合GOP 的概念
闭合 GOP 的核心特点是:当前 GOP 内的所有帧(P 帧、B 帧)仅参考本 GOP 内的帧,不依赖前一个 GOP 的任何帧。
- 如下图所示,第一个GOP以P帧而不是B帧结束,这就意味着编码器不会将下一个GOP中的帧用作参考帧
-
如果最后一帧是B帧的话,由于 B 帧需要参考 “后面的帧”,但当前 GOP 的 “后面” 是下一个 GOP 的帧(如 I 帧或 P 帧)。此时,该 B 帧的参考链会延伸到其他 GOP,导致当前 GOP 必须依赖下一个 GOP 才能解码,违背了 “闭合 GOP 内帧仅参考本 GOP” 的定义,使其退化为类似开放 GOP(Open GOP)的结构。
-
闭合GOP在视频流化和压缩中非常有用,它是视频中的独立片段,和其他GOP有清晰的隔断,所有在闭合GOP出现的问题都不会影响到其他GOP。
-
闭合GOP以一个被称为IDR(Instantaneous Decoder Refresh,即时解码刷新)的I帧开始。 之所以称之为IDR,是因为当解码器遇到 IDR 帧时,由于在 IDR 之前出现的任何帧都不能用作在该 IDR 之后出现的图片的参考帧,它可以刷新其解码图片缓冲区(Decoded Picture Buffer 或 DPB)。这就形成了图片序列的彻底中断。
2.2 闭合GOP的作用
-
ABR视频流: 在ABR视频流中,播放器可以根据带宽和解码器缓冲器的填充程度在不同配置文件(组合不同码率和分辨率的视频)之间切换。如果播放器要从1080p切换到360p,那么它就需要这种利落的切换。此时IDR发挥作用,这样播放器就能刷新缓冲,让360p的视频流进入。
- 具体来说:
- 当播放器决定切换到 360p 流时,会等待 360p 流中最近的一个 IDR 帧(因为 IDR 帧是独立解码的,不需要参考任何其他帧);
- 从这个 IDR 帧开始解码 360p 流,由于 IDR 帧之后的所有帧(属于闭合 GOP)只参考本 GOP 内的帧(不涉及之前的 1080p 流),因此不需要依赖旧流的任何数据;
- 此时播放器可以 “刷新缓冲”—— 清空旧的 1080p 流数据,只加载和缓存 360p 流从 IDR 帧开始的新数据,确保新流能独立、正确解码
- 具体来说:
-
错误恢复:如果你在流化视频时使用HLS,并且每个视频片段都以IDR开始,这意味着片段中的所有帧都不能参考前、后片段中的帧。所以如果因为某个错误而失去其中一个片段,播放器仍然能继续接收下一个视频片段。有趣的是,Apple 的 HLS 规范提到应该每两秒使用一次 IDR。(注意:规范没有说视频片段持续时间应该是两秒,而是指 GOP 的大小是两秒)。
-
快进快退(Trick Mode): 我们之前提到过,IDR非常有助于实现快进快退。播放器需找到距离最近的IDR,然后开始从这一点播放视频流。
三、开放GOP
3.1 开放GOP的概念
开放GOP正好和闭合GOP相反,允许其内的帧参考其他GOP内的帧。请看下图第二个I帧。来自前一个GOP的B帧被用作参考帧,这意味着这是一个开放GOP(由黄色箭头表示)。
3.2 开放GOP 的作用
开放GOP在以下情况中非常有用:
- 你不需要为了ABR而重新开始一段新的视频,但是需要关闭GOP
- 你现在想要提高视频压缩效率(因为B帧可以多一个高质量的参考帧)
- 当你需要插入I帧时(或是为了刷新视频质量,或者在非场景转换的情况下,是否跨I帧预测并不重要)
四、总结
4.1 闭合GOP
适用场景:
-
点播视频(VOD)
点播中用户经常会进行“seek操作”(拖动进度条跳转),此时需要快速定位到目标时间点并开始解码。闭合GOP的独立性确保:找到目标时间点所在的GOP后,无需依赖前面的GOP即可解码,避免画面花屏或延迟。 -
ABR自适应码率切换
ABR场景下,播放器会根据带宽在不同码率(如1080p/720p/360p)的视频流之间切换。切换时需要从新码率的某个GOP开始播放,闭合GOP的独立性可确保切换瞬间不依赖前一个码率的帧,实现“无缝切换”(否则若依赖前GOP,新码率的帧可能因缺少参考而解码失败)。 -
直播时移/回看
直播中用户可能回退到几分钟前的内容(时移),或直接跳转至某个时间点观看(回看)。闭合GOP允许播放器直接定位到目标时间点的GOP并解码,保证时移操作的流畅性。 -
视频编辑/剪辑
视频编辑时,若需要截取一段视频(如从第10秒到第20秒),闭合GOP的独立性可确保截取的片段能单独解码,无需携带前序GOP的帧,简化编辑流程。 -
低延迟交互场景
如在线教育的“暂停/继续”、远程会议的“回放片段”等,需要快速响应操作并从指定点播放,闭合GOP的独立解码能力可降低延迟。
4.2 开放GOP
适用场景:
-
存储型视频(如本地文件、蓝光光盘)
这类场景中,视频通常按顺序播放,用户很少进行跳转(或跳转可接受轻微延迟),更关注存储容量。开放GOP的高压缩率可减少文件体积,节省存储成本(例如一部2小时的电影,开放GOP可能比闭合GOP小5%-10%)。 -
非实时视频分发(如预录视频的CDN分发)
若视频内容以“完整下载后播放”为主(而非边下边播),用户几乎不进行seek操作,开放GOP的高压缩率可降低传输带宽成本,同时不影响播放体验(因为完整下载后可按顺序解码,依赖关系可被提前处理)。 -
带宽受限的直播(无交互需求)
某些对带宽极度敏感的直播场景(如偏远地区的低带宽直播),若用户仅“实时观看”而不进行时移/跳转,开放GOP可在有限带宽下提升画质(或降低卡顿率),牺牲的“随机访问能力”对体验影响较小。 -
长视频连续播放(如电影、纪录片)
这类内容用户通常按顺序观看,很少拖动进度条,开放GOP的压缩效率优势更明显,且跨GOP参考不会影响连续播放的流畅性(解码时按顺序加载即可处理依赖)。
更多资料:https://github.com/0voice