H.264中普通I帧和IDR帧究竟有什么区别
原文:https://blog.csdn.net/Liu1314you/article/details/77185215
I帧中,有一类特殊的I帧,叫做IDR帧。IDR帧的性质是,比如第1000帧是IDR帧,那么这一帧相当于一个分水岭,从1001帧开始,所有的帧都不能再参照1000帧之前的帧。在closed GOP规定下,0~999帧也不允许参照这个IDR帧以及之后的帧。等于说IDR帧将视频分割成两个独立的 部分:前面的(closed GOP规定下)不能参照后面的,后面的不能参照前面的。 这个性质在播放的时候额外有用:如果我直接从第1000帧开始播放,我可以毫无问题的播放下去,因为我不需要 参照1000帧之前的内容完成解码。我从开头播放,直到999帧的时候,我都不需要参照1000帧及它后面的东西; 1000帧之后的数据都损坏了,0~999帧也能正常播放。
IDR的全称叫做Instantaneous Decoder Refresh,意思是,解码到当前帧,解码器就可以把缓存全清了——之前 的所有帧信息都没用了;后续帧不会再去参照它们。
视频开头的I帧一定是IDR帧。
有时候,我们用I帧表示IDR帧,i帧表示非IDR的I帧。这种场合下,I帧和i帧都是independent frame,区别
在是否是IDR。
两个IDR帧之间的区间,从一个IDR帧开始,到下一个IDR前的帧结束,叫做IDR区间,又叫做GOP区间。closed GOP设定下,GOP区间可以看做是独立的一段视频:它里面的所有帧,都不需要参照任何区间之外的东西,只要 一个GOP区间是齐全的,区间里面所有的帧都能被解码。我们平时看的视频就是多段GOP区间连接起来的。
原文:https://blog.csdn.net/fang437385323/article/details/80470985
IDR(Instantaneous Decoding Refresh)--即时解码刷新。
I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。IDR会导致DPB(DecodedPictureBuffer参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。
对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。
[图片上传失败...(image-4b703e-1622168911831)]
IDR: 在H.264中,图像以序列为单位进行组织。一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。 IDR 图像一定是 I 图像,但 I 图像不一定是 IDR 图像。I帧之后的图像有可能会使用I帧之前的图像做运动参考。
另外,一个或者多个图像参数集对应一个序列参数集。