GOP(group of pictures)
在流行的视频编码算法中,都包含GOP这个概念,例如MPEG-2, H.264, and H.265。
背景
关于视频存储和传输的"size":
|---------------------------|---------------------------------------|
| Resolution 分辨率 | Uncompressed Bitrate 未压缩时的比特率 |
| 1280×720 (720p) | ~ 1.5 Gbps |
| 1920×1080 (1080p) | ~ 3 Gbps |
| 3180 x 2160 (2160p or 4K) | ~ 12 Gbps |
试想,要传输一个4k的视频,比特率高达12Gbps,而我们普通家用的带宽也就几百Mbps,根本无法传输,即使传过来了,播放效果基本就是PPT。。。
视频压缩
既然原始视频码率太高无法传输,那自然想到可以先进行数据压缩,减小体积后再传输。
通常是压缩到1-20 Mbps这个范围。
视频压缩的基本原理
在一系列图像中找到并消除冗余。
例如新闻广播,每一帧视频通常与之前和之后的视频非常相似。新闻广播员说话时嘴唇可能会移动,信息可能会沿着屏幕底部滚动,但图像的很大一部分在每一帧之间要么相同,要么非常相似。
那这些重复的/非常相似的像素,完全没必要传输,这样就能起到压缩视频的效果了。
时间压缩
根据上述规律,可以先发送一个包含全部信息的关键帧,后续的帧就只发送与之前的关键帧不一样的地方。接收方收到数据后,通过已经接收到的关键帧+差别数据,就可以"恢复"出原帧。(当然这里的恢复不是100%还原,而是有损的)
这种利用帧的时间先后顺序的方法,属于时间压缩类算法。
空间压缩
思路一脉相承,只不过这次是在同一张图片内部找到并消除重复数据。
例如大部分国家的国旗图片,上面都是大面积的相同颜色,完全可以消除重复。
JPEG格式的图片也是用的类似的方法。
再谈GOP
GOP就是两个关键帧之间的距离。
为什么需要多个关键帧,而不是只发送视频的第一个关键帧即可?
用户是随机开始播放的,并一定是从头开始
若场景变化很大,和最开始的关键帧相比,几乎没什么冗余的部分,此时压缩已经没有意义了
中间再次发送新的关键帧,也能纠正传输错误、误差等,增强了可控制性
关键帧的另一个名字: Intra-coded frame(帧内编码帧,简称I帧)
这种帧在解码时,不依赖其他帧,因此称为"帧内"。
预测帧:Predicted frame,简称P帧
P帧携带的是与前一帧相比,差异的地方。
它既利用了时间压缩,也使用了图片内部的空间压缩。
为什么叫预测帧?预测了与前一帧的变化(具体要深入实际的编码算法)
双向预测帧:Bi-directional Predicted frame,简称B帧
B帧的压缩效果更好,因为它仅携带和前+后两帧之间的差异部分。
如何找到与未来帧之间的差异呢?
很简单,编码器先缓存一部分帧,这样就知道未来帧是啥了
最后总结一下
GOP表示每多少帧发送一个I帧
I帧可以直接被解码,不依赖外部
P帧解码需要依赖前一个P帧or I帧
B帧解码通常依赖前和后一个I帧 or P帧
下图中的两个B帧,按FIFO解码
注意:帧的显示顺序,和帧实际被解码的顺序是不一样的。
相关阅读: