基本概念: I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。 P frame: 前向预测编码帧 又称predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧; B frame: 双向预测内插编码帧 又称bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧; GOP:Group of Pictures 画面组 GOP(Group of Pictures)策略影响编码质量:所谓 GOP,意思是画面组,一个 GOP 就是一组连续的画面。MPEG编码将画面(即帧)分为 I、P、B 三种,I 是内部编码帧,P 是前向预测帧,B 是双向内插帧。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。没有 I 帧,P 帧和 B 帧就无法解码,这就是 MPEG 格式难以精确剪辑的原因,也是我们之所以要微调头和尾的原因。 PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来 DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。 在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。 IPB帧的不同: 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. 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. I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I 帧,是随机的,一但确定了I 帧,以后的各帧就严格按规定顺序排列
从上面的解释看,我们知道I和P的解码算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,
也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。 1.I、P、B帧概念简述 视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。简单地说,I帧是关键帧,属于帧内压缩,解码时单独的该帧便可完成解码;P帧为向前预测编码帧,即P帧解码时需要参考前面相关帧的信息才能解码;B帧为双向预测编码帧,解码时既需要参考前面已有的帧又需要参考后面待解码的帧;他们都是基于I帧来压缩数据。 I帧表示关键帧,I帧画面完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面)。 P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据) B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。 因此,I帧 和P帧的解码算法比较简单,资源占用也比较少,I帧只要自己完成就行了,至于P帧,也只需要解码器把前一个画面缓存一下,遇到P帧时就使用之前缓存的画面 就行。如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进。如果视频流还有B帧,则需要缓存前面和当前的视频帧,待后面视频帧获得 后,再解码。 2.I、P、B帧特点分析 I帧特点: 1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输; 2.解码时仅用I帧的数据就可重构完整图像; 3.I帧描述了图像背景和运动主体的详情; 4.I帧不需要参考其他画面而生成; 5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量); 6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧; 7.I帧不需要考虑运动矢量; 8.I帧所占数据的信息量比较大。 P帧特点: 2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差); 3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像; 4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧; 5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧; 6.由于P帧是参考帧,它可能造成解码错误的扩散; 7.由于是差值传送,P帧的压缩比较高。 B帧特点 2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量; 3.B帧是双向预测编码帧; 4.B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确; 5.B帧不是参考帧,不会造成解码错误的扩散。 3.I、P、B帧的判断 不同视频编码格式有不同的帧类型判断方法。 MPEG4视频中,I帧、P帧、B帧的判定:MPEG4的每一帧开头是固定的00 00 01 b6格式,接下来的2bit分别代表着不同类型的视频帧。00代表I Frame,01代表 P Frame,10代表 B Frame。 如果是MPEG2视频,则先找到00 00 01 00,然后根据其后的3bit来判断,001是I帧,011是B帧,010是P帧,判断方法和MPEG4的判断方法完全相同,不同的是在于相关的类型标识比特位。 如果是H.264视 频,要先把H264的ES流数据解析出来,然后分析出每一个NAL(Network Abstract Layer,网络抽象层),再解析出哪些NAL为一个Frame,最后解析Slice类型,根据Slice类型就可以判断这个Frame的IPB类型。判 断方法较MPEG2与MPEG4复杂。 IPB帧编码顺序(解码顺序)与显示顺序仅仅使用前一个显示的基准帧来编码的帧被称为P帧,同时使用前一个显示帧和未来帧作为基准帧进行编码的帧称为B帧. 通 常,更换场景后的第一帧就是I帧,I帧应当全帧传送。从压缩的程度来看,I画面的压缩量最少;P画面次之,它是以I画面为基础;B画面压缩最多。为了加大 压缩比,通常在I帧后面相隔2帧(最多3帧)设置1个P帧,在I、P帧之间都是B帧,在两个P帧之间也是设置2~3帧B帧。B帧传送它与I帧或P帧之间的 差值信息,或者P帧与后面P帧或I帧之间的差值信息,或者它与前后I、P帧或P、P帧平均值之间的差值信息。当主体内容变化愈大时,两个I画面之间的帧数 值越小;当主体内容变化小时,I面画的间隔可以适当大一些。或者说,B帧、P帧所占比例越大,图像压缩比越高。一般两个I画面相隔13~15帧,相隔帧数 不宜再多。 下面以15帧为例,说明VCD图像帧的排列顺序。I、P、B三种画面的典型设置方式,对NTSC制共约需半秒时间。节目输入顺序是按实 际出现顺序排列的,即I、B、B、P、B、B、P、B、B、I、B、B、P;但为了解码时便于从I、P画面插补得到B画面,在编码录制节目时,将顺序改变 了,即按照I、P、B、B顺序,即改为按原来0、3、1、2、6、4、5、9、7、8的画面顺序。解码时先解出0帧、3帧,再由其插补预测计算得出1帧、 2帧等等。为此,须在解码器内设置动态存储器,将I、P帧先解码并存储,再计算出各个B帧。不过最后输出时,还是应当按照实际播放顺序重组读出,按正确顺 序输出。 |
|