本文转载自:https://zhuanlan.zhihu.com/p/112635240
1. GOP(group of pictures)
GOP 指的就是两个 I 帧之间的间隔. 比如说 GOP 为 120,如果是 720p 60帧 的话,那就是 2s 一次 I 帧.
在视频编码序列中,主要有三种编码帧:I 帧、P 帧、B 帧。
- I 帧即 Intra-Coded Picture(帧内编码图像帧),不参考其他图像帧,只利用本帧的信息进行编码
- P 帧即 Predictive-Coded Picture(预测编码图像帧),利用之前的 I 帧或 P 帧,采用运动预测的方式进行帧间预测编码
- B 帧即 Bidirectionally Predicted Picture(双向预测编码图像帧),提供最高的压缩比,它既需要之前的图像帧( I 帧或 P 帧),也需要后来的图像帧( P 帧),采用运动预测的方式进行帧间双向预测编码
在视频编码序列中,GOP 即 Group of picture(图像组),指两个 I 帧之间的距离,Reference(参考周期)指两个 P 帧之间的距离。一个 I 帧所占用的字节数大于一个 P 帧,一个 P 帧所占用的字节数大于一个 B 帧。
所以在码率不变的前提下,GOP 值越大,P、B帧的数量会越多,平均每个 I、P、B 帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference 越大,B 帧的数量越多,同理也更容易获得较好的图像质量。
需要说明的是,通过提高 GOP 值来提高图像质量是有限度的,在遇到场景切换的情况时,H.264 编码器会自动强制插入一个 I 帧,此时实际的 GOP 值被缩短了。另一方面,在一个 GOP 中,P、B 帧是由 I 帧预测得到的,当 I 帧的图像质量比较差时,会影响到一个 GOP 中后续 P、B 帧的图像质量,直到下一个 GOP 开始才有可能得以恢复,所以 GOP 值也不宜设置过大。
同时,由于P、B 帧的复杂度大于 I 帧,所以过多的 P、B 帧会影响编码效率,使编码效率降低。另外,过长的GOP 还会影响 Seek 操作的响应速度,由于 P、B 帧是由前面的 I 或 P 帧预测得到的,所以 Seek 操作需要直接定位,解码某一个 P 或 B 帧时,需要先解码得到本 GOP 内的 I 帧及之前的 N 个预测帧才可以,GOP 值越长,需要解码的预测帧就越多,seek 响应的时间也越长。
2. H.264中的 I 帧,B 帧和 P 帧
在 H264 中的图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个 I 帧结束。
IDR 图像:一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是I帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里获得重新同步的机会。IDR 图像之后的图像永远不会使用 IDR 之前的图像数据来解码。
一个序列就是一段内容差别不是很大的图像编码后生成的一串数据流。当运动变化比较少的时候,一个序列可以很长,因为运动变化的少就代表图像画面的内容变动很小,所以就可以编一个 I 帧,然后一直是 P 帧、B 帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个 I 帧和3、4 个 P 帧。
2.1. I 帧
I 帧:帧内编码帧 ,I 帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
I 帧特点:
- 1) 它是一个全帧压缩编码帧。它将全帧图像信息进行 JPEG 压缩编码及传输;
- 2) 解码时仅用I帧的数据就可重构完整图像;
- 3) I 帧描述了图像背景和运动主体的详情;
- 4) I 帧不需要参考其他画面而生成;
- 5) I 帧是 P 帧和 B 帧的参考帧(其质量直接影响到同组中以后各帧的质量);
- 6) I 帧是帧组 GOP 的基础帧(第一帧),在一组中只有一个 I 帧;
- 7) I 帧不需要考虑运动矢量;
- 8) I 帧所占数据的信息量比较大。
2.2. P 帧
P 帧:前向预测编码帧。P 帧表示的是这一帧跟之前的一个关键帧(或 P 帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P 帧没有完整画面数据,只有与前一帧的画面差别的数据)
P 帧的预测与重构: P 帧是以 I 帧为参考帧,在 I 帧中找出 P 帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从 I 帧中找出 P 帧“某点”的预测值并与差值相加以得到 P 帧“某点”样值,从而可得到完整的 P 帧。
P 帧特点:
- 1) P 帧是 I 帧后面相隔 1~2 帧的编码帧;
- 2) P 帧采用运动补偿的方法传送它与前面的 I 或 P 帧的差值及运动矢量(预测误差);
- 3) 解码时必须将 I 帧中的预测值与预测误差求和后才能重构完整的 P 帧图像;
- 4) P 帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 帧或 P 帧;
- 5) P 帧可以是其后面 P 帧的参考帧,也可以是其前后的 B 帧的参考帧;
- 6) 由于 P 帧是参考帧,它可能造成解码错误的扩散;
- 7) 由于是差值传送, P 帧的压缩比较高。
2.3. B 帧
B 帧:双向预测内插编码帧。B帧是双向差别帧,也就是 B 帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码 B 帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B 帧压缩率高,但是解码时 CPU 会比较累。
B 帧的预测与重构
B 帧以前面的 I 或 P 帧和后面的 P 帧为参考帧,“找出”B 帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到 B 帧“某点”样值,从而可得到完整的 B 帧。
B 帧特点
- 1) B 帧是由前面的 I 或 P 帧和后面的 P 帧来进行预测的;
- 2)B 帧传送的是它与前面的 I 或 P 帧和后面的 P 帧之间的预测误差及运动矢量;
- 3)B 帧是双向预测编码帧;
- 4)B 帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
- 5)B 帧不是参考帧,不会造成解码错误的扩散。
注: I、B、P 各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧。一般来说,I 帧的压缩率是7(跟 JPG 差不多),P 帧是 20,B 帧可以达到 50。可见使用 B 帧能节省大量空间,节省出来的空间可以用来保存多一些 I 帧,这样在相同码率下,可以提供更好的画质。