文章一:

转自:http://blog.csdn.net/SkyGray/article/details/6223358

IDR 帧属于 I 帧。解码器收到 IDR frame  时,将所有的参考帧队列丢弃 (用 x264_reference_reset 函数实现——在encoder.c 文件中) 。这点是所有 I 帧共有的特性,但是收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和SPS 参数进行更新。由此可见,在编码器端,每发一个 IDR ,就相应地发一个  PPS&SPS_nal_unit

这是网上搜索到的一个答案,有一定参考价值吧。

先说明:所有的 IDR 帧都是 I 帧,但是并不是所有 I 帧都是 IDR 帧。就是说, IDR 帧是 I 帧的子集。 (我们程序中设定的是每250帧出现一个 IDR 帧)

我们用的程序是这样的:

/* ------------------- Setup frame context ----------------------------- */

/* 5: Init da ta dependant of frame type */

if ( h->fenc->i_type ==  X264_TYPE_IDR  )

{

/* reset ref pictures */

x264_reference_reset ( h );

i_nal_type      =  NAL_SLICE_IDR ;

i_nal_ref_idc = NAL_PRIORITY_ HIGHEST ;

i_slice_type = SLICE_TYPE_ I ;

}

else if ( h->fenc->i_type ==  X264_TYPE_I  )

{

i_nal_type      =  NAL_SLICE ;

i_nal_ref_idc = NAL_PRIORITY_ HIGH ;  /* Not completely true but for now it is (as all I/P are kept as ref)*/

i_slice_type = SLICE_TYPE_ I ;

}

else if ( h->fenc->i_type ==  X264_TYPE_P  )

{

i_nal_type      = NAL_SLICE;

i_nal_ref_idc = NAL_PRIORITY_HIGH;  /* Not completely true but for now it is (as all I/P are kept as ref)*/

i_slice_type = SLICE_TYPE_P;

}

else if ( h->fenc->i_type ==  X264_TYPE_BREF  )

{

i_nal_type      = NAL_SLICE;

i_nal_ref_idc = NAL_PRIORITY_HIGH;  /* maybe add MMCO to forget it? -> low */

i_slice_type = SLICE_TYPE_B;

}

else       /*  B  frame */

{

i_nal_type      = NAL_SLICE;

i_nal_ref_idc = NAL_PRIORITY_DISPOSABLE;

i_slice_type = SLICE_TYPE_B;

}

x264_reference_reset 函数的定义如下: (其实,因为这个代码是通用的,所以应该是参考帧队列。但是,我们只用一个参考帧,“队列”并没有意义。)

static inline void  x264_reference_reset( x264_t *h )

{

int i;

/* reset ref pictures */

for ( i = 1; i < h->frames.i_max_dpb; i++ )

{

h->frames.reference[i]->i_poc = -1;

}

h->frames.reference[0]->i_poc = 0;

}

看来,好像是遇到 IDR 帧时才会 将所有的参考帧队列丢弃( x264_reference_reset ( h ); ) 。其实,我们的程序默认只用一个参考帧,这个问题就不是十分有意义了。

多参考帧情况下。

举个例子 :有如下帧序列: IPPPP I P PPP ……(我们程序没有 B 帧,所以帧序列简单些,但道理是一样的)。按照 3 个参考帧编码。

因为“按照 3 个参考帧编码”,所以参考帧队列长度为 3 。

遇到绿色的 I 时,并不清空参考帧队列,把这个 I 帧加入参考帧队列(当然 I 编码时不用参考帧。)。再检测到红色的 P 帧时,用到的就是 PPI 三帧做参考了。

不怕自己罗嗦(好记性不如烂笔头),再强调一个: 一个参考帧,就是参考当前帧的前面的那帧(因为没涉及到 B 帧,所以“前面的那帧”既是播放顺序的,也是编码顺序的)。多个参考帧是一个道理 。 ( 我以前一直误解为从前面的几帧中找到最合适的一个参考帧)

最后,“ 但是收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和 SPS 参数进行更新。由此可见,在编码器端,每发一个 IDR ,就相应地发一个  PPS&SPS_nal_unit ”应该是对的吧。先这样认为:)

偶然机会,查到: IDR-instantaneous decoding refresh (IDR)picture ; 
      A coded picture in which all slices are I or SI slices that causes the decoding process to mark all reference pictures as "unused for reference" immediately after decoding the IDR picture. After the decoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture. 
     “也就是说 ,IDR 的出现其实是相当于向解码器发出了一个清理 reference buffer 的信号吧,上面说前于这一帧的所有已编码帧不能为 inter 做参考帧了。”  

还有:“ 因为 264 采用了多帧预测,就有可能在 display order 下 I 帧后的 P 会参考 I 帧前的帧,这样在 random access 时如果只找 I 帧,随后的帧的参考帧可能 unavailable , IDR 就是这样一种特殊的 I 帧,把它定义为确保后面的 P 一定不参考其前面的帧,可以放心地 random access 。

文章二:

转自:http://blog.csdn.net/Jammg/article/details/52357245

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帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。

IDR: 在H.264中,图像以序列为单位进行组织。一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。      IDR 图像一定是 I 图像,但 I 图像不一定是 IDR 图像。I帧之后的图像有可能会使用I帧之前的图像做运动参考。

另外,一个或者多个图像参数集对应一个序列参数集。

I帧和IDR帧的区别相关推荐

  1. (转)I 帧和 IDR 帧的区别

    I 帧和 IDR 帧的区别:http://blog.csdn.net/skygray/article/details/6223358 IDR 帧属于 I 帧.解码器收到 IDR frame  时,将所 ...

  2. I 帧和 IDR 帧的区别

    I 帧和 IDR 帧的区别: IDR 帧属于 I 帧.解码器收到 IDR frame  时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现--在 encoder.c 文 ...

  3. I帧和IDR帧区别(转载)

    I 帧和 IDR 帧的区别: IDR 帧属于 I 帧.解码器收到 IDR frame  时,将所有的参考帧队列丢弃 (用 x264_reference_reset 函数实现--在 encoder.c  ...

  4. 视频知识点(14)- 来,咱们聊一聊 I 帧和 IDR 帧的区别

    CSDN话题挑战赛第1期活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 技术专栏 >><音视 ...

  5. H264编码入门(二)I 帧和 IDR 帧的区别

    I 帧和 IDR 帧的区别 I 帧和 IDR 帧的区别 IDR与GOP: 疑问: 解答: 结论 QQ交流群:697773082 I 帧和 IDR 帧的区别 IDR 帧属于 I 帧.解码器收到 IDR ...

  6. I帧、B帧、P帧以及IDR帧之间的关系

    IDR(Instantaneous Decoding Refresh)--即时解码刷新. I帧:帧内编码帧是一种自带全部信息的独立帧,无需参考其它图像便可独立进行解码,视频序列中的第一个帧始终都是I帧 ...

  7. GOP I帧和IDR帧

    IDR 帧属于 I 帧.解码器收到 IDR frame  时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现--在 encoder.c 文件中) .这点是所有 I 帧共 ...

  8. H.264中IDR帧和I帧区别

    IDR(Instantaneous Decoding Refresh)--即时解码刷新.       I和IDR帧都是使用帧内预测的.它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I ...

  9. 图像和流媒体 -- I 帧,B帧,P帧,IDR帧的区别

    参看:什么是I帧,P帧,B帧 参看:H264编码原理以及I帧B帧P帧 一.H246简介 H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参 ...

最新文章

  1. rfc6455 WebSockets
  2. 一文梳理水下检测方法
  3. html登录界面cookie,HTML中使用cookie保存登录账户
  4. java转换CSV文件生成xml格式数据
  5. Android-ffmpeg编译so文件
  6. git服务器与客户端的安装与使用
  7. MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC
  8. Linux服务器部署常用命令
  9. Pytorch——Tensor合并+截取+拼接
  10. 【NOIP提高】飞扬的小鸟
  11. Less入门以及一些前端面试题
  12. 还记得那些老国手吗? 07
  13. Azure语音合成再添新声音,“风格迁移”技术为不同音色实现多情感演绎
  14. Java反射原理和实际用法
  15. 让资源管理器变得像Chrome一样标签化
  16. 【完结版】哥大五年CV岁月:只有开心,才能做出有影响力的工作
  17. 2020年3月中国编程语言排行榜
  18. 呆在家睡觉,倒不如在家学习
  19. 国内下载vscode速度慢解决
  20. 路由器关闭dhcp后再登录路由器

热门文章

  1. 倾囊相授:小编是如何从阿里云转战达摩院并成功上岸de?
  2. 微信小程序有哪些优点和价值
  3. HCU混和动力控制器,HEV混动串并联 混动车辆
  4. 去除硬盘安全删除硬件图标
  5. 在Windows 10中截取截图的6种方式 简介
  6. Codevs 4246 奶牛的身高
  7. linux shell 指令 诸如-d, -f, -e之类的判断表达式
  8. 3812 机器人走迷宫(枚举 + 全排列)
  9. 谷歌Adsende中的 CPC、CTR、PRM含义
  10. 助力金融科技产业发展 360金融AI之夜成功举办