无损压缩
和有损压缩
。无损压缩的特征是完整重建包含在原始影像中所有的原始数据。比如,文档压缩就是一种无损压缩,压缩后的文档在内容上必须和原始文档一模一样,而不能近似。但是在视觉世界中,无损压缩会使影像包含大量的重复信息,其压缩率一般为2~5。无损压缩广泛用于文本数据,程序和特殊应用场合的图像数据(如指纹图像,医学图像等)的压缩。帧内(Intraframe)压缩
也称为空间压缩(Spatial compression)
,利用的是空间冗余或者说帧内空间的重复数据来定义可以丢弃的数据。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,达不到很高的压缩比。时间压缩(Temporal_compression)
,是基于许多视频或动画的连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的。时间相关性的统计分析结果表明,在间隔1~2帧的图像中,各像素只有10%以下的点其亮度差值变化超过2%,而色度差值的变化只有1%以下(人类对亮度的敏感度高于色度,因此视频一般采用YUV模型进行编码,提高压缩率,具体见《音视频处理入门基础知识》)。通过比较时间轴上不同帧之间的数据采用差值编码和运动补偿等方式实施压缩,提高压缩比。一般采用有损压缩。IPB(Intracoded frames, Predicted pictures, and Bi-directional predictive pictures)
。简单地说,I帧是关键帧,属于帧内压缩。P帧和B帧都是基于I帧来压缩数据,即属于帧间压缩,P是向前搜索的意思,B是双向搜索的意思。I帧是靠尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像。I帧又称为内部画面 (intra picture)
,通常是每个GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩(做为随机访问的参考点)可以当成图象。在MPEG编码的过程中,部分视频帧序列压缩成为I帧,部分压缩成P帧,还有部分压缩成B帧。I帧法是帧内压缩法,也称为“关键帧”压缩法。I帧是基于离散余弦变换DCT(Discrete Cosine Transform)的压缩技术,这种算法与JPEG压缩算法类似。采用I帧压缩可达到压缩比6而无明显的压缩痕迹。
P帧是通过充分降低图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫 预测帧
。在针对连续动态图像编码时,将连续若干幅图像分成P/B/I三种类型,P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑运动的特性进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取P帧和I帧联合压缩的方法可达到更高的压缩且无明显的压缩痕迹。
B帧是既考虑源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧
。B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200的高压缩比。一般地,I帧压缩效率最低,P帧较高,B帧最高。
注意,I、B、P帧是根据压缩算法的需要人为定义的,它们都是实实在在的物理帧。至于,图像中的哪一帧是I帧,是随机的。一旦确定了I帧,以后的各帧就严格按规定顺序排列。
I帧采用帧内预测编码,仅仅使用前一个基准帧来编码的帧被称为P帧,同时使用前一个显示帧和未来帧作为基准帧进行编码的帧称为B帧 (注,只有I帧和P帧才是基准帧/参考帧)。在通常的场景中,编解码器编码一个I帧,然后向前跳过几个帧,用编码I帧作为基准帧对一个未来P帧进行编码,然后跳回到I帧之后的下一个帧。编码的I帧和P帧之间的帧被编码为B帧。之后,编码器会再次跳过几个帧,使用第一个P帧作为基准帧编码另外一个P帧,然后再次跳回,用B帧填充显示序列中的空隙。这个过程不断继续。 P帧由前一个I帧或P帧图像来预测,而B帧由前后的两个P帧或一个I帧和一个P帧来预测,因而编解码和帧的显示顺序有所不同,如图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 IPB帧编码序和显示序
通常,更换场景后的第一帧就是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帧所占比例越大,图像压缩比越高。
下面以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帧。不过最后输出时,还是应当按照实际播放顺序重组读出,按正确顺序输出。
DTS(Decoding Time Stamp)
:即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据;PTS(Presentation Time Stamp)
:即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。需要注意的是,虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。 顺序大概如下:
Stream: I P B B
PTS: 1 4 2 3
DTS: 1 2 3 4
视频的编码(压缩)是按照“组”来进行的,每一个组叫作GOP(Group of Picture,图像组)
,表示一组连续的画面。通常意义上的GOP由I帧开始,到下一个I帧之前的帧结束(严格意义上讲,GOP由IDR帧开始,到下一个IDR帧之前的帧结束,这种情形下一个GOP中会有多个I帧。不过,一般而言,I帧基本上都是IDR帧。)。 GOP与GOP之间是没有联系的,编码关系只在GOP之间产生。每一个GOP必须由关键帧开始和结束,以保证其作为围绕它的B帧和P帧的参考。一个GOP在I帧之间可以只包含P帧,也可以B帧和P帧都包含。关键帧是一幅完整的画面,GOP中间的帧都是不完整的,需要由关键帧、前面帧以及后面帧等一起运算得到。关键帧的间隔调节会影响GOP的长度,进而影响到读取GOP的速度,为防止运动变化,一个GOP组内帧数不宜取多。如果关键帧的间隔设置过大的话(GOP长度过大),在必须用到关键帧的场合就可能被迫使用B/P帧来代替,这就会降低画面质量。关键帧是帧间压缩的基础,典型的GOP(IBP帧包)结构一般是:IBBPBBPBBPBBPBBPBB。这时假设I帧损坏,那么整个GOP结构就坏掉了,即IBBPBBPBBPBBPBBPBB这么多帧一起坏掉,因此设置过长的间隔也会导致编码出来的东西不稳定。理论上,一个GOP组内的所有帧独立于其之前的GOP及其后面的GOP。但是在实际应用中,为了得到更大的压缩比,出现的Open GoP和Closed GoP之分:
IDR帧全称叫做Instantaneous Decoder Refresh
,是I帧的一种。它的作用是立刻刷新,重新算一个新的序列开始编码,使错误不致传播,而I帧不具有随机访问的能力。准确的说,IDR会导致DPB(DecodedPictureBuffer 参考帧列表)清空,而I不会。也就是说,解码到当前帧,解码器就可以把缓存全清了——之前的所有帧信息都没用了;后续帧不会再去参照它们。 比如,第1000帧是IDR帧,那么这一帧相当于一个分水岭,从1001帧开始,所有的帧都不能再参照1000帧之前的帧。在closed GOP规定下0~999
帧也不允许参照这个IDR帧以及之后的帧。等于说IDR帧将视频分割成两个独立的部分:前面的(closed GOP规定下)不能参照后面的,后面的不能参照前面的。 这个性质在播放的时候额外有用:如果我直接从第1000帧开始播放,我可以毫无问题的播放下去,因为我不需要 参照1000帧之前的内容完成解码。我从开头播放,直到999帧的时候,我都不需要参照1000帧及它后面的东西; 1000帧之后的数据都损坏了,0~999帧也能正常播放。
从上面的解释看,我们知道I帧和P帧的解码算法比较简单,资源占用也比较少:I帧只要自己完成就行了;P帧也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了。如果视频流只有I帧和P帧,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。
但网络上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间。但这样一来,文件小了,解码器就麻烦了。因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码
)。而且,==B帧不能简单地丢掉,因为B帧其实也包含了画面信息。如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了)。==并且,由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多对不支持B帧的播放器就造成更大的困扰,画面也就越卡。一般平均来说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50。可见,==使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。
在如上图中,GOP (Group of Pictures)长度为13,S0~S7 表示 8个视点,T0~T12 为 GOP的 13个时刻。每个 GOP包含帧数为视点数 GOP 长度的乘积。在该图中一个 GOP 中,包含94个B帧(GOP 总帧数=13*8=104)。B 帧占一个 GOP 总帧数的 90.38%。GOP 越长,B 帧所占比例更高,编码的率失真性能越高。下图测试序列 Race1 在不同 GOP 下的率失真性能对比。
视频中的关键帧,https://blog.csdn.net/cds9527/article/details/53302683
视频流中的 I帧 P帧 B帧,https://blog.csdn.net/qq_15807167/article/details/52343570
数字视频编码IPB帧编码序列,显示序列及GoP相关知识,https://www.cnblogs.com/wangyujoy/archive/2012/12/12/2814803.html
H.264中普通I帧和IDR帧究竟有什么区别,https://blog.csdn.net/Liu1314you/article/details/77185215
H2.64中I帧和IDR帧的区别(转),https://blog.csdn.net/heanyu/article/details/6255111
I帧和IDR帧,https://blog.csdn.net/dancing_night/article/details/46004693
音视频中GOP、 PTS 和 DTS,https://blog.csdn.net/lipengshiwo/article/details/79160316
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/justloveyou_/article/details/88084171
内容来源于网络,如有侵权,请联系作者删除!