【音视频】GOP 的设置和分析
一、GOP的概念
GOP(Group of Pictures,图像组)是 H.264 编码序列中 以 I 帧为起点,到下一个 I 帧前一帧的连续帧集合。它包含三个核心要素:
- 帧类型:I 帧(关键帧)、P 帧(前向预测帧)、B 帧(双向预测帧),体积关系为 I > P > B。
- GOP 长度:两个 I 帧之间的帧数(如 GOP=10 表示每 10 帧出现一个 I 帧)。
- Reference 间隔:两个 P 帧的间隔(或 P 帧与 I 帧的间隔),决定 B 帧的数量(B 帧只能出现在两个 P 帧或 I/P 帧之间)。
帧类型 | 依赖对象 | 压缩原理 | 核心缺陷 |
---|---|---|---|
I 帧 | 仅依赖本帧内的宏块 | 帧内预测(空间冗余压缩) | 码率高,占 GOP 总码率的 60%+ |
P 帧 | 依赖前面的 I/P 帧 | 前向运动补偿(时间冗余压缩) | 误差会向后扩散(如 P 帧错误,后续 P/B 帧解码失败) |
B 帧 | 依赖前后的 I/P 帧 | 双向运动补偿(更高效压缩) | 增加编码 / 解码延迟(需缓存后续帧) |
二、GOP的设置
在码率不变的前提下,GOP值越大,P、B帧的数量会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量
下面举个例子来说明:
比如帧率为5,分别计算GOP=10、 GOP=5时不同GOP大小的码率,假设I帧占用100字节、P帧占用25字节
- GOP=10时,2秒数据的帧为
I P P P P P P P P P
, 码率为 (100+9*25)*8bit/2秒 = 1,300bps - GOP=5时,2秒数据的帧为
I P P P P I P P P P
, 码率为 (100*2+8*25)*8bit/2秒 = 1,600bps
上面两个统计可以得出来:
- 在
I/P
帧占用字节相同的情况下,GOP
越大,则码率越低 - 如果
GOP=10
的情况下,码率也设置为1600bps
,那就意味着平均I
帧的大小可以改变为1600*100 / 1300 = 123
字节,平均P
帧可以改变为30.77
字节,画质也就更好。可以认为,同等码率下GOP
越大,画质越好,但存在一个边界
要说明的是,通过提高GOP值来提高图像质量是有限度的:
- 在遇到场景切换的时候,
H264
编码器会自动强制插入一个I
帧,此时的GOP
就被切断了 - 另一方面,在一个
GOP
中,P/B
帧是由I
帧预测得到的,如果GOP
过大,会导致后续的P/B
帧还原得到的质量变差,直到下一个GOP
开始的时候,才会恢复图像的质量
同时,由于P/B
帧编码的复杂度是大于I
帧的,因此过多的P/B
帧会影响编码的效率。
另外,过长的GOP
还会影响Seek
操作的响应速度,因为Seek
的时候,需要先定位到前面最近的一个I
帧,然后在依次解码后续的P/B
帧,直到解码到Seek
位置的帧,这样会导致Seek
操作响应时间大大增加
更多资料:https://github.com/0voice