I、P、B 帧 IDR帧 GOP

I、P、B 帧

  • I 帧(Intra coded frames):I 帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。I 帧使用帧内压缩,不使用运动补偿,由于 I 帧不依赖其它帧,所以是随机存取的入点,同时是解码的基准帧。I 帧主要用于接收机的初始化和信道的获取,以及节目的切换和插入,I 帧图像的压缩倍数相对较低。I 帧图像是周期性出现在图像序列中的,出现频率可由编码器选择。
  • P 帧(Predicted frames):P 帧和 B 帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P 帧图像中可以包含帧内编码的部分,即 P 帧中的每一个宏块可以是前向预测,也可以是帧内编码。
  • B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测,可以大大提高压缩倍数。值得注意的是,由于 B 帧图像采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。

一个 I 帧可以不依赖其他帧就解码出一幅完整的图像,而 P 帧、B 帧不行。P 帧需要依赖视频流中排在它前面的帧才能解码出图像。B 帧则需要依赖视频流中排在它前面或后面的帧才能解码出图像。B帧具有更高的压缩率,但需要更多的缓冲时间以及更高的CPU占用率,因此B帧适合本地存储以及视频点播,而不适用对实时性要求较高的直播系统。 

在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就需要我们来了解另外两个概念:DTS 和 PTS。

IDR与I帧的区别

IDR全称是Instantaneous Decoding Refresh,是在H.264中定义的结构。I和IDR帧都是使用帧内预测的。在H.264中,IDR帧一定是I帧,但反之不成立。IDR会导致DPB(DecodedPictureBuffer参考帧列表)清空,而I帧不会。

对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧,与此相反,对于普通的I帧来说,位于其之后的B帧和P帧可以引用位于普通I帧之前的帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。

在这里插入图片描述

H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。

GOP

这是图像组(Group of Pictures)的意思,表示编码的视频序列分成了一组一组的有序的帧的集合进行编码。每个GOP一定是以一个I帧开始的,但是却不一定指代的是两个I帧之间的距离。因为一个GOP内可能包含几个I帧,只有第一个I帧(也就是第一帧)才是IDR帧。在编码参数中,GOP的长度和两个I帧的距离也是两个不同参数指定的(如IntraPeriod和GOP Size或者类似的参数)。所以,两个I帧的间距不可能大于GOP的长度,一般情况是更小的。

GOP的长度也不是定死不变的,在H.264的编码器中,如果判定场景发生变化,那么即使不到原定GOP的末尾,也会在这个位置加入一个IDR,作为新一个GOP的开始。此时这个GOP的长度就被缩小了。

DTS、PTS 的概念

DTS、PTS 的概念如下所述:

  • 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 告诉我们该按什么顺序显示这几帧图像。顺序大概如下:

   PTS: 1 4 2 3
   DTS: 1 2 3 4
Stream: I P B B

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值