帧内压缩
帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,达不到很高的压缩比。
在视频中,帧内压缩就是压缩 GOP 图像组中的 I 帧。
帧内压缩是空域, 在空间XY轴进行压缩,进行压缩参考本帧数据,压缩率较小。
预测模式
一共有 9 种预测模式,如下图,第一种是按照纵向预测,第二种是横向预测,第三种是求平均值,
帧间压缩
帧间压缩(Interframe compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的;通过比较时间轴上不同帧之间的数据实施压缩,进一步提高压缩比。
在视频中,帧内压缩就是压缩 GOP 图像组中的 B 帧与 P 帧。
帧间压缩的主要过程先进行宏块查找,寻找出残差值,进行运动矢量计算,最后通过残差值和运动矢量推算出下一帧的数据。
宏块查找:查找帧之间有差别的部分,算法有:三步搜索,二维对数搜索,四步搜索,钻石搜索等;
残差值是指帧之间有差别的部分;
运动矢量:当前编码块与其参考图像中的最佳匹配块之间的相对位移,也就是变化部分下一帧与上一帧的位移;
运动估计:针对当前块从上一帧中搜索最相似的块;
运动补偿:通过残差值和运动矢量推断出下一帧的数据;
概念不容易懂,举个离职:
比如两张相邻的帧之间,一个人在说话,此时只有嘴巴是动的,就可以不用考虑其他部分,只找到帧之间有差别的部分,这就叫宏块查找,帧之间有差别的部分就叫残差值,记录下来嘴巴相对于上一帧变动的坐标,这就是运动矢量,嘴巴动的过程在宏块中的变化就叫运动估计。
通过上面的计算流程之后,不需要存储下一帧完整图片,只需要记录残差值和运动矢量,就可以推断出下一帧的数据,这就是运动补偿。
帧内压缩与帧间压缩都属于有损压缩。
视频花屏的产生原因:一组 GOP 中有帧丢失,主要是 P 帧和 B 帧的丢失,这样残差值和运动矢量也会丢失,造成了当前帧解码失败,就会出现花屏。
视频卡顿的原因:当有帧丢失,就丢弃 GOP 内所有帧,直到下一个 I 帧出现,重新刷新图像。I 帧是 GOP 的第一帧,时间周期可能长,等待下一个 I 帧来之前的这段时间,就会出现卡顿。
这两者是不能同时兼顾的,比如微信视频通话没有花屏,但是会出现卡顿。一般视频录制的时候一般会有花屏,但不会出现卡顿。