I帧、P帧、B帧、IDR 关键帧介绍

原文地址:https://blog.csdn.net/qq_23350817/article/details/107688071


概述

视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。

简单地说,I帧是关键帧,属于帧内压缩。就是和AVI的压缩是一样的。P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。

  • I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
  • P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
  • B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。

采用的压缩方法: 分组:把几帧图像分为一组(GOP),为防止运动变化,帧数不宜取多。

  1. 定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
  2. 预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
  3. 数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

一、I帧

I图像(帧)是靠尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像。 I帧又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩(做为随机访问的参考点)可以当成图象。在MPEG编码的过程中部分视频帧序列压缩成为I帧,部分压缩成P帧,还有部分压缩成B帧。I帧法是帧内压缩法(P、B为帧间),也称为“关键帧”压缩法。I帧法是基于离散余弦变换DCT(Discrete Cosine Transform)的压缩技术,这种算法与JPEG压缩算法类似。采用I帧压缩可达到1/6的压缩比而无明显的压缩痕迹。

I帧特点:

  1. 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
  2. 解码时仅用I帧的数据就可重构完整图像;
  3. I帧描述了图像背景和运动主体的详情;
  4. I帧不需要参考其他画面而生成;
  5. I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  6. I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
  7. I帧不需要考虑运动矢量;
  8. I帧所占数据的信息量比较大。

I帧编码流程:

  1. 进行帧内预测,决定所采用的帧内预测模式。
  2. 像素值减去预测值,得到残差。
  3. 对残差进行变换和量化。
  4. 变长编码和算术编码。
  5. 重构图像并滤波,得到的图像作为其它帧的参考帧。

二、P帧

P图像(帧)是通过充分降低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧。
在针对连续动态图像编码时,将连续若干幅图像分成P,B,I三种类型,P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑运动的特性进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取P帧和I帧联合压缩的方法可达到更高的压缩且无明显的压缩痕迹。

P帧的预测与重构:

P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。

P帧特点:

  1. P帧是I帧后面相隔1-2帧的编码帧。
  2. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)。
  3. 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像。
  4. P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。
  5. P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。
  6. 由于P帧是参考帧,它可能造成解码错误的扩散。
  7. 由于是差值传送,P帧的压缩比较高。

三、B帧

B图像(帧)是既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧。
B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200:1的高压缩。一般地,I帧压缩效率最低,P帧较高,B帧最高。

B帧的预测与重构:

B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

B帧特点:

  1. B帧是由前面的I或P帧和后面的P帧来进行预测的;
  2. B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
  3. B帧是双向预测编码帧;
  4. B帧压缩比最高,因为它只反映2参考帧间运动主体的变化情况,预测比较准确;
  5. B帧不是参考帧,不会造成解码错误的扩散。

四、实际应用

从上面的解释看,我们知道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帧,这样在相同码率下,可以提供更好的画质。
在这里插入图片描述

IDR帧

IDR 帧属于 I 帧。解码器收到 IDR frame 时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现——在 encoder.c 文件中) 。这点是所有 I 帧共有的特性,但是收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和 SPS 参数进行更新。IDR 的出现其实是相当于向解码器发出了一个清理 reference buffer 的信号吧,上面说前于这一帧的所有已编码帧不能为 inter 做参考帧了。”

IDR是强制刷新帧,因为P和B都不是记录完整信息,记录的是与其它帧的差异,所以如果I帧本身有错误,这个错误就会遗传到下面的帧,但碰到IDR帧的时候,播放器丢弃以前所以的信息,从新开始解码,错误也就到此为止。
I和IDR帧都使用帧内预测,在编码解码中为了方便,首个I帧要和其他I帧区别开,把第一个I帧叫IDR,这样方便控制编码和解码流程,所以IDR帧一定是I帧,但I帧不一定是IDR帧;IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始算新的序列开始编码。I帧有被跨帧参考的可能,IDR不会。
第一种说法是针对Mpeg2的,这里面一个GOP只有且只有一个在组头的I帧;第二种说法是针对h264的新特性

I帧不用参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。IDR就不允许这样

GOP

GOP的值是指第一个I帧,到最后一个I帧之前的帧的数量。比如:IPPPPPI,GOP=6
每个GOP一定是以一个I帧开始的,但是却不一定指代的是两个I帧之间的距离。因为一个GOP内可能包含几个I帧,只有第一个I帧(也就是第一帧)才是关键帧。

编码器将多张图像进行编码后生产成一段一段的 GOP ( Group of Pictures ) , 解码器在播放时则是读取一段一段的 GOP 进行解码后读取画面再渲染显示。GOP ( Group of Pictures) 是一组连续的画面,由一张 I 帧和数张 B / P 帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。I 帧是内部编码帧(也称为关键帧),P帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。

编解码顺序

【显示和解码顺序示意图】
在这里插入图片描述
在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流。
一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。
在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离,Reference(参考周期)指两个P帧之间的距离。两个I帧之间形成一组图片,就是GOP(Group Of Picture)。

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HEVC采用了类似H.264的NAL单元结构,每个NAL单元包含了一个完整的视频或片段的编码数据。在HEVC中,NAL单元可以是VPS、SPS、PPS、SEI或视频数据。 要判断一个NAL单元中包含的视频类型,需要解析NAL单元中的头部信息。在HEVC中,NAL单元的头部信息包括了NAL单元类型(NAL unit type)和层次(Layer ID)等信息。具体来说,NAL单元类型由header中的`nal_unit_type`字段指定,其值为0~55,其中0-32是VCL NAL单元,表示视频数据,33-35是非VCL NAL单元,表示参数集等信息。 对于VCL NAL单元,可以进一步从NAL单元的payload中获取视频类型。在HEVC中,视频类型与NAL单元类型之间的对应关系如下: - NAL_UNIT_TYPE_BLA_N_LP:前向预测(B) - NAL_UNIT_TYPE_BLA_W_LP:前向预测(B) - NAL_UNIT_TYPE_BLA_W_RADL:前向预测(B) - NAL_UNIT_TYPE_CRA:无参考(I) - NAL_UNIT_TYPE_IDR_W_RADL:关键帧(I) - NAL_UNIT_TYPE_IDR_N_LP:关键帧(I) - NAL_UNIT_TYPE_IDR_W_LP:关键帧(I) - NAL_UNIT_TYPE_P_BLA_W_LP:双向预测(P) - NAL_UNIT_TYPE_P_BLA_W_RADL:双向预测(P) - NAL_UNIT_TYPE_P_RPS_N_LP:双向预测(P) - NAL_UNIT_TYPE_P_RPS_W_LP:双向预测(P) - NAL_UNIT_TYPE_P_RPS_W_RADL:双向预测(P) - NAL_UNIT_TYPE_P_SLICE:双向预测(P) 因此,可以根据NAL单元类型和payload中的数据,判断一个NAL单元中包含的视频类型是I、P还是B

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值