基本概念:
I frame : 帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。
P frame: 前向预测编码帧 又称predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;
B frame: 双向预测内插编码帧 又称bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;
PTS: Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来.
DTS: Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。
在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。
I P B帧的不同:
I frame:自身可以通过视频解压算法解压成一张单独的完整的图片。
P frame:需要参考其前面的一个I frame 或者B frame来生成一张完整的图片。
B frame:则要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。
两个I frame之间形成一个GOP,在x264中同时可以通过参数来设定bf的大小,即:I 和p或者两个P之间B的数量。
通过上述基本可以说明如果有B frame 存在的情况下一个GOP的最后一个frame一定是P.
看x264代码,感觉GOP 就是IDR帧到另一个IDR帧之间 就是一个GOP.在视频编码序列中,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响应的时间也越长。
DTS和PTS的不同:
DTS主要用于视频的解码,在解码阶段使用.PTS主要用于视频的同步和输出.在display的时候使用.在没有B frame的情况下.DTS和PTS的输出顺序是一样的.
例子:
下面给出一个GOP为15的例子,其解码的参照frame及其解码的顺序都在里面:
如上图:I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.
Slice-I: 指的是I帧,即没有用到帧间的冗余信息,但是并不表示他不能使用预测方式,他可以使用同一帧中相邻宏块之间的空间关联性,因此,对I帧图像某一MB进行编码时,我们可以根据周围的MB来预测我们当前的MB,通常我们会选择当前MB左侧和上侧的MB,因为这些MB已经经过编码了。然后再对实际的MB与预测MB之间的差值进行编码。这样就可以减少bit。但是需要用13种帧内预测模式进行预测比较,复杂度较以往标准采用的直接DEF变换编码大大提高了;
(注:只有H.264中I帧才用到了预测方式,其余的协议都没有用到预测方式,而是直接对一帧中的各MB进行变换得到的)
slice-P: 指的是P帧,在帧间编码图像内的MB,各种模式的帧内预测相对于参考图像中的大范围搜索,复杂度和存储量增加的比例就比较小。
当数字视频信号送入H. 264 编码器进行编码时,编码器读出头信息后,以宏块为单位进行编码. 在对当前宏块进行编码时,首先通过运动估计,在上一帧重构图像中选出最佳匹配宏块. 然后,根据匹配效果、图像局部的性质、编码器当时的工作状况,决定对当前宏块是采用帧内编码还是帧间编码. 若前后两帧很相似,即相关性很强,则进行的是帧间预测编码,即对帧间预测的误差进行4 ×4 整数变换、量化,得到的数据一方面进行熵编码,另一方面通过反量化和4 ×4 反整数变换重构,以便下一个宏块进行运动估计; 若前后两帧图像相关性较弱,则进行的是帧内编码.