IPB帧编码顺序(解码顺序)与显示顺序
仅仅使用前一个显示的基准帧来编码的帧被称为“P帧”,同时使用前一个显示帧和未来帧作为基准帧进行编码的帧称为“B帧”。在通常的场景中,编解码器编码一个I帧,然后向前跳过几个帧,用编码I帧作为基准帧对一个未来P帧进行编码,然后跳回到I帧之后的下一个帧。编码的I帧和P帧之间的帧被编码为B帧。之后,编码器会再次跳过几个帧,使用第一个P帧作为基准帧编码另外一个P帧,然后再次跳回,用B帧填充显示序列中的空隙。这个过程不断继续,每12到15个P帧和B帧内插入一个新的I帧。例如,图1种给出了一个典型的视频帧序列。
通常,更换场景后的第一帧就是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帧。不过最后输出时,还是应当按照实际播放顺序重组读出,按正确顺序输出。
I B B P B B P…B B I I P B B P B B … I B B
1 2 3 4 5 6 7 … 1 4 2 3 7 5 6 …
(a) 显示顺序 (b) 编解码顺序
图 1
在此有两个问题需要说明:首先是插多少B 帧最合适?理论上说I、P之间插入的B帧越多,压缩比越高,但是编解码器所需的帧存储器也越大,因此实际应用中一般最多两个。其次,B帧的引入会增加编解码端的延迟,如果追求网络监视的时延,最好是不使用B帧。
MPEG-1标准的一个成功应用范例是小型激光视盘(VCD)。由于它的压缩比相对于M- JPEG大为提高,因而在数字监控系统中得到广泛的应用。但是并不是最适合数字监控系统的应用,主要表现在码率固定,代价是引起图像质量的抖动,而数字监控系统最需要的不是恒定码率,而是恒定质量。同时MPEG-1本身的技术限制,其压缩比也没有达到用户满意的程度。而2000年提出的MPEG-4不仅是一个非常开放的标准,而且增加了许多新的工具,以达到降低某些应用或图像场景中要求的图像质量所需的比特率。值得注意的是虽然大部分用来降低比特率的工具是为非实时应用开发的,无法使用到数字监控系统中,但是相对MPEG-1,由于使用半像素和1/4像素图像匹配、帧内预测、高级运动矢量预测等新的技术,因而采用MPEG-4的压缩标准之后,在PAL CIF 25fps情况下,大部分情况下码率在300k-500k的MPEG-4压缩图像质量超过1.25Mbit的MPEG-1图像,因而在数字监控系统中得到最广泛和成功的应用。
posted on 2010-06-21 13:05 叶子 阅读(7193) 评论(4) 编辑 收藏 引用 所属分类: MPEG
Feedback
# re: IPB帧编码顺序(解码顺序)与显示顺序 2012-09-11 11:30 操权力
您好,今天看了您的这篇博客,有个疑问想请教下您。
显示顺序是 I B B P
编码顺序是 I P B B
解码顺序是 I P B B
那么,在MP4封装格式中的存储顺序又是怎么样的呢?
是按照编码顺序还是按照解码顺序呢? 回复 更多评论
# re: IPB帧编码顺序(解码顺序)与显示顺序 2012-09-13 10:18 elva
@操权力
无论以任何容器封装,在文件中存储时是以编解码顺序存的 回复 更多评论
# re: IPB帧编码顺序(解码顺序)与显示顺序 2012-09-14 11:27 操权力
@elva
编解码顺序?
应该是解码顺序吧?
一下是我对解码时间和现实时间的理解:
在容器中存储的是解码时间,在获取到一个解码包的时候,默认的打上DTS和PTS。这个时候,不知道这个解码包的帧类型。这个过程应该属于parser过程吧。
将获取的包按照顺序给解码器。解码器会判断这个包中的数据帧的类型,是I,或者P,或者B。如果是非B帧,那么DTS和PTS是相等的;如果是B帧的话,就重新计算PTS.
负责显示的task会对解码之后的帧的pts进行重新排序,然后进行显示。