帧间压缩技术
帧间压缩原理
-
GOP
帧间压缩一定是同一个GOP内的相邻帧间进行压缩,两个GOP的帧间差异较大是无法进行帧间压缩的,同一个GOP的帧间压缩是因为每一个GOP内的帧都是强相关的。
-
参考帧
所谓的参考帧是后面的帧要参考前面的帧,进行帧间压缩。
-
运动估计(宏块+运动矢量)
通过宏块匹配的方式,找到运动矢量,运动矢量就是记录了一个宏块从一个地方运动到另一个地方而且是有方向的。
所谓的运动估计就是通过宏块匹配的方法,最终实现找到运动矢量。 -
运动补偿(解码)
找到残差值,在解码的时候把残差值给补偿上去。
帧分组GOP:
每一个GOP都是包含了一组强相关的帧。
参考帧:
如图中所展示的,后面的帧参考前面的帧,进行编码。
图中第一帧是特殊标出的参考帧,实际上背景与后面帧的背景是完全一样的。
宏块查找:
将一个图片划分造成很多的小格子(宏块),在举例的图片中显示如下信息,有共同的绿色背景,一个云兄的球。球从一个角滚到另一个角。
展示的其中的连续两帧,右边的图是第一帧,左边是第二帧,先看右边的图,其中一个宏块里存在着一个小球,在进行匹配时。最笨的方法是进行逐行扫描,就是拿着这个宏块去第二帧里进行第一行、第二行。。。。的扫描,也就是每一个宏块的匹配,如果匹配度达到一定程度时就视为是同一个宏块。
假设在左边第三行图中位置达到了95%的匹配度就视为在此位置找到了此宏块。
找到宏块后记录下原始坐标与滚动的坐标(在第二帧即左面图中匹配到球的坐标)此时就可以知道小球移动的距离以及运动矢量。
对于图中的每一个宏块其实都要进行上面的操作,都要进行查找匹配,但是由于这幅图片的背景色都是绿色的,所以该步骤可以优化掉。
宏块查找算法:
- 三步搜索
- 二维对数搜索
- 四步搜索
- 钻石搜索
这几个算法是常用的算法,实际上还有更多,这里说的钻石搜索是一个菱形搜索。
运动估计:
可以看见实际要存储的数据,其实就是小球的运动轨迹,以及一张背景图。在解码时就可以根据这个数据还原回原始数据。
运动矢量与补偿压缩:
由于示例中使用的是小球,就是一个小圆点,所以变化不是太大,但是实际情境中,运动物体可能有丰富的细节需要进行处理,此时就需要引入残差值。
如果是一个复杂的图片,画面就会很丰富,对于每一个宏块,在变动时肯定有一定的损耗,或者一些变化。
比如说匹配到95%就认为找到了宏块,但是实际上这幅图片的宏块与上一幅图的宏块肯定还是有着细微的差别的,这些差别实际上就是残差值,就是图中虚的部分,而红线是矢量。
所以必须要有运动矢量与宏块残差值,然后存储起来发给对端,对端根据这些数据可以将完整图片还原出来。
帧间压缩的帧类型:
- P帧,向前参考帧
- B帧,前后参考帧,B帧后面的帧优先解码,连续的B帧之间不进行参考。
实际的例子
-
视频花屏原因:
如果GOP分组中有帧丢失,会造成解码端的图像发生错误,这会出现马赛克(花屏)
有帧丢了时,残差值与运动矢量都没有了,这个时候会有一些模糊的数据暴露出来。
更严重的说,如果是I帧出现问题,后面的所有数据几乎都会没有了。
而这里所说的丢帧主要是P帧和B帧。 -
视频卡顿原因
为了避免花屏问题的发生,当有帧丢失时,就丢弃GOP内所有的帧,直到下一个IDR帧重新刷新图像。
I帧时按照周期来的,需要一个比较长的时间周期,如果在下一个I帧来之前不显示后来的图像,那么视频就回保持静止不动的现象,也就是视频卡顿现象。