数字产品代购's Archiver

JPPV 2015-7-15 19:09

视频压缩:I帧、P帧、B帧

[align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]/**************************************************************************************************************************************************************************************[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]**说明:    [/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        1.本文通过整理而来,集多个高手的精华,此为最重点!!!
        2.因为在海思平台做多媒体视频处理,所以了解I帧、P帧、B帧等压缩-编解码特点是必须的。
        3.海思I帧间隔即[b]GOP[/b]取值范围:[0, 1000],以帧为单位,为动态属性。
        4.欢迎拍砖。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px] ***************************************************************************************************************************************************************************************/[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    简单地说,[b]I帧是关键帧,属于帧内压缩[/b]。就是和AVI的压缩是一样的。[b]P是向前搜索的意思。B是双向搜索[/b]。他们都是基于I帧来压缩数据。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]   [b]I帧[/b]表示关键帧,你可以理解为这一帧画面的[b]完整保留[/b];解码时只需要本帧数据就可以完成(因为包含完整画面)[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]   [b]P帧[/b]表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是[b]差别帧[/b],P帧[b]没有[/b]完整画面数据,[b]只有[/b]与前一帧的画面差别的数据)[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]   [b]B帧[/b]是双向差别帧,也就是B帧记录的是[b]本帧与前后帧的差别[/b](具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    [b]采用的压缩方法:[/b] 分组:[b]把几帧图像分为一组(GOP)[/b],为防止运动变化,帧数不宜取多。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        1.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        2.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        3.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。[/size][/font][/align]
[align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][b]一、I帧  [/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    I图像(帧)是靠尽可能去除图像[b]空间冗余信息[/b]来压缩传输数据量的帧内编码图像。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    I帧又称为[b]内部画面 (intra picture)[/b],I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩(做为随机访问的参考点)可以当成图象。在MPEG编码的过程中部分视频帧序列压缩成为I帧,部分压缩成P帧,还有部分压缩成B帧。I帧法是[b]帧内压缩法(P、B为帧间)[/b],也称为[b]“关键帧”[/b]压缩法。I帧法是基于[b]离散余弦变换DCT[/b](Discrete Cosine Transform)的压缩技术,这种算法与JPEG压缩算法类似。采用I帧压缩可达到1/6的压缩比而无明显的压缩痕迹。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    [b]I帧特点[/b]:[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        2.解码时仅用I帧的数据就可重构完整图像;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        3.I帧描述了图像背景和运动主体的详情;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        4.I帧不需要参考其他画面而生成;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        5[b].[/b]I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        7.I帧不需要考虑运动矢量;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]       8.I帧所占数据的信息量比较大。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][b]    I帧编码流程:[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (1)进行帧内预测,决定所采用的帧内预测模式。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (2)像素值减去预测值,得到残差。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (3)对残差进行变换和量化。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (4)变长编码和算术编码。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (5)重构图像并滤波,得到的图像作为其它帧的参考帧。[/size][/font][/align]
[align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][b]二、P帧[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]     P图像(帧)是通过充分降低于图像序列中前面已编码帧的[b]时间冗余信息[/b]来压缩传输数据量的编码图像,也叫[b]预测帧[/b]。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    在针对连续动态图像编码时,[b]将连续若干幅图像分成P,B,I三种类型[/b],P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑[b]运动的特性[/b]进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取[b]P帧和I帧联合压缩[/b]的方法可达到更高的压缩且无明显的压缩痕迹。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    [b]P帧的预测与重构:[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][b]    P帧特点:[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        ①P帧是I帧后面相隔1-2帧的编码帧。  [/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        ②P帧采用运动补偿的方法传送它与前面的I或P帧的[b]差值及运动矢量(预测误差)[/b]。  [/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        ③解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像。  [/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        ④P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。  [/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        ⑤P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        ⑥由于P帧是参考帧,它可能造成解码错误的扩散。 [/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        ⑦由于是差值传送,P帧的压缩比较高。[/size][/font][/align]
[align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][b]三、B帧[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    B图像(帧)是既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫[b]双向预测帧[/b]。   [/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即[b]仅记录本帧与前后帧的差值[/b]。只有采用B帧压缩才能达到200:1的高压缩。一般地,I帧压缩效率最低,P帧较高,B帧最高。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][b]    B帧的预测与重构:[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    [b]B帧特点:[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        1.B帧是由前面的I或P帧和后面的P帧来进行预测的;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        3.B帧是双向预测编码帧;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        4.B帧压缩比最高,因为它只反映2参考帧间运动主体的变化情况,预测比较准确;[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        5.B帧不是参考帧,不会造成解码错误的扩散。 [/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][b]    P 帧和 B 帧编码的基本流程为:[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (1)进行运动估计,计算采用帧间编码模式的率失真函数(节)值。P 帧 只参考前面的帧,B 帧可参考后面的帧。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (2)进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (3)计算实际值和预测值的差值。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (4)对残差进行变换和量化。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]        (5)若编码,如果是帧间编码模式,编码运动矢量。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列。 [/size][/font][/align]
[align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][b]四、实际应用[/b][/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    从上面的解释看,我们知道I和P的解码算法比较简单,资源占用也比较少,[b]I只要自己完成就行了,[/b]P呢,也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    但网络上的电影[b]很多[/b]都采用了B帧,因为B帧记录的是前后帧的差别,[b]比P帧能节约更多的空间[/b],但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要[b]预读预解码[/b]),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px]    一般平均来说,[b]I的压缩率是7[/b](跟JPG差不多),[b]P是20,B可以达到50[/b],可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][img]http://img.my.csdn.net/uploads/201303/30/1364622776_7342.jpg[/img]
[/size][/font][font=Verdana, Arial, Helvetica, sans-serif][size=13px] 在如上图中,GOP (Group of Pictures)长度为13,S0~S7 表示 8个视点,T0~T12 为 GOP的 13个时刻。每个 GOP包含帧数为视点数 GOP 长度的乘积。在该图中一个 GOP 中,包含94 个 B帧。B 帧占一个 GOP 总帧数的 90.38%。GOP 越长,B 帧所占比例更高,编码的率失真性能越高。下图测试序列 Race1 在不同 GOP 下的率失真性能对比。[/size][/font][/align][align=left][font=Verdana, Arial, Helvetica, sans-serif][size=13px][img]http://img.my.csdn.net/uploads/201303/30/1364622864_6562.jpg[/img]
[/size][/font][/align]

页: [1]
Powered by vBulletinTM Version 4.0.5 © 2001-2015 JPPV.NET