elva

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帧。不过最后输出时,还是应当按照实际播放顺序重组读出,按正确顺序输出。


音视频编码卡的视频编码算法从JPEG 发展到MPEG-1、MPEG-2、MPEG-4和H.264。JPEG是一种著名的图像压缩方法,最初由Joint Photographic Experts Group在1986年提出并于1992年正式成为ISO标准(ISO/IEC 10918),主要应用于静态图像压缩,如果把它用在运动图像压缩的时候,就是我们通常所说的Motion-JPEG,由于JPEG相当于MPEG的帧内压缩,因而没有去除时域上的冗余,所以在保证一定图像质量的时候,压缩比不高,通常只有10-30倍,但是它有一个固定的优点,就是延迟在40ms,实时性很好,所以在某些特殊应用的场合仍然可以看到它的踪影。MPEG运动图像编码技术标准是由Motion Picture Experts Group在1988年提出,并于1992年11月通过,1993年8月作为ISO/IEC 11172标准公布,这就是通常所说的MPEG-1。MPEG-1为了追求更高的压缩效率,更注重去除图像系列的时间冗余度。因此引入了I帧(帧内编码)、P帧(前向预测编码)、B帧(双向预测编码)。P帧由前一个I帧或P帧图像来预测,而B帧由前后的两个P帧或一个I帧和一个P帧来预测,因而编解码和帧的显示顺序有所不同,如图1所示

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 叶子 阅读(6325) 评论(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进行重新排序,然后进行显示。

我的理解正确吗?  回复  更多评论   

# re: IPB帧编码顺序(解码顺序)与显示顺序 2012-09-14 11:32 elva

打时间戳的时候知道帧类型,时间戳并不是随着文件顺序一帧一帧累加的,有些帧会提前显示   回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理