H.264视频标准中普通I帧与IDR帧的区别

时间:2022-10-09 19:55:48

http://blog.csdn.net/openspirit/article/details/10005863


普通I帧与IDR(Instantaneous Decoding Refresh,瞬时解码刷新)帧为均采用帧内预测技术的视频帧,同属于I帧。

区别是:采用IDR帧编码,会导致DPB(Decoded Picture Buffer,直译为解码图像缓冲区,即指参考帧列表)完成一次清空处理,而普通I帧不会。

那么,这样带来的直接结果是怎样的呢?

即,当前IDR帧后面的帧不会将当前IDR帧之前已经编码的帧作为参考帧;而当前普通I帧之后的帧有可能将当前I帧之前的帧作为参考帧。

那么,这样带来的直接效果是怎样的呢?

即,播放视频的时候,可以直接从IDR帧开始播放,因为IDR帧之前的帧与当前IDR帧和之后的帧再也没有直接地关联;而普通I帧则不行。


可以看到,一般来讲,一段视频的第0帧(也即首帧)是I帧,那么它算不算是IDR帧呢?答:算。

所以,IDR帧一定是I帧,反之不成立。

在H.264标准参考软件(JM)下,通过IDRIntraEnable来设置是否支持IDR帧。


I/IDR帧后如果出现PTS比它还小的帧 则说明此流为开GOP


I和IDR帧都是使用帧内预测的。在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把首个I帧叫做IDR帧,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。IDR会导致DPB(参考帧列表——这是关键所在)清空,而I帧不会。


       IDR图像一定是I图像,但是I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像课引用I图像之间的图像做运动参考。


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


        IDR图像的标识:idr_pic_id。不同的IDR图像有不同的idr_pic_id值。只有在作为IDR图像的I帧才有这个句法元素。在场模式下,IDR的两个场有相同的idr_pic_id值。idr_pic_id的取值范围是[0,65535],和frame_num类似,当它的值超过这个范围时,它会以循环的方式重新开始计数。

idr_pic_id 0 标识一个IDR图像。一个IDR图像的所有条带中的idr_pic_id 值应保持不变。当按解码顺序的两个连续访问单元都是IDR 访问单元时,第一个IDR 访问单元的条带的idr_pic_id 值应与第二个IDR 访问单元的idr_pic_id 值不同。idr_pic_id 的值应在0到65535的范围内(包括0和65535)。H.264视频标准中普通I帧与IDR帧的区别