由上一节了解到H.264帧内编码的基本原理,本节介绍帧间编码原理
所谓帧间编码,顾名思义,就是连续帧的编码方式,最终输出为I、P、B等类型帧。
为方便解释,我截取了某视频中连续的两帧作为说明:
上图两帧数据中,除了车子和镜头在移动,大部分内容并没有发生大的改变。
这里以点盖面,以车子的车牌为例:车牌向左移动了,就是宏块位置发生了变化,在第二帧数据中就不用再次编码宏块的左侧和上侧的像素信息,只需要记录宏块的坐标信息(运动矢量),从而减少编码和传输的数据量(P帧和B帧的来源)。
由此可以归纳出,假如第一帧图像为I帧,那么第二帧运动矢量图像可能是B帧也可能是P帧,也是取决于H.264内部算法。
为了方便解释,可以做如下总结:与I帧相似程度高达到95%以上会编码成B帧,相似程度70%编码成P帧。可以得出一个初步结论:
视频录制/播放顺序:I帧->B帧->P帧
再结合上一节的编码器来看,当传输缓冲器接收到B帧时会暂时缓冲在传输缓冲器中,直到获取到I帧或P帧时,会将传输缓冲器中的B帧通过编码控制重新经过视频信源编码器、视频复合编码器、传输缓冲器一起依次排在P帧之后通过传输编码器输出。
由此可以推出另一个结论:
编码/解码顺序:I帧->P帧->B帧
注:
如果在录制视频中P帧之后又产生B帧,这些B帧一定是在下一次再遇到帧或者P帧才会输出
实质上H.264就是由一个一个NALU组成的,其结构如下:
帧类型 | 宏块预测数据 | 残差数据 |
I帧 | 帧内预测数据 | 宏块上侧、左侧编码数据 |
P帧 | 量化变换(差异数据) | 运动矢量 |
B帧 | 运动矢量 |
所以论数据量:
I帧 > P帧 > B帧
本节内容主要介绍了帧间编码原理,也就是I、P、B帧是如何产生的,下一节介绍H.264码流数据组成以及哥伦布编码