(转)I 帧和 IDR 帧的区别

news/2024/7/5 1:58:17

帧和 IDR 帧的区别: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_ ;

     }

      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_ ;

     }

     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 PPP ……(我们程序没有 B 帧,所以帧序列简单些,但道理是一样的)。按照 3 个参考帧编码。

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

 

    遇到绿色的 时,并不清空参考帧队列,把这个 I 帧加入参考帧队列(当然 I 编码时不用参考帧。)。再检测到红色的 帧时,用到的就是 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://lihuaxi.xjx100.cn/news/245849.html

相关文章

Hulu直播服务难点解析(一):系统需求

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/83053654 Hulu在其博客发布了建立直播服务遇到的挑战及解决方案&#xff0c;这对于以前只提供点播服务的系统而言是一次彻底的升级。Li…

JDK动态代理和Cglib的动态代理

2019独角兽企业重金招聘Python工程师标准>>> 最简单的是静态代理方法&#xff0c;即代理模式&#xff0c;这里就不多啰嗦了。。 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的&#xff0c;需要被代理的类需要有接口&#xff0c;否则无法实现 package proxy…

滚动屏幕显示隐藏div_HTML结构-常用标签:a·img·table·form·input·iframe·div

学习目标&#xff1a;掌握html的结构,head与body的区别 掌握常用标签 掌握a标签,img标签 掌握table标签 掌握form标签,input标签 掌握iframe 和frameSet标签 掌握div标签互联网的三大基石互联网中的三大基石是什么?HTML:超文本标记语言 HTTP:超文本传输协议 URL:统一资源定位符…

如何更快速加载你的JS页面

确保代码尽量简洁 不要什么都依赖JavaScript。不要编写重复性的脚本。要把JavaScript当作糖果工具&#xff0c;只是起到美化作用。别给你的网站添加大量的JavaScript代码。只有必要的时候用一下。只有确实能改善用户体验的时候用一下。 尽量减少DOM访问 使用JavaScript访问DOM元…

Android APP全面屏适配技术要点

全面屏的概念 为什么先要解释一下全面屏&#xff0c;因为这个词在现在来讲就是一个伪命题。全面屏字面意思就是手机的正面全部都是屏幕&#xff0c;100%的屏占比。但是现在推出所谓“全面屏”手机的厂商没有一个能达到全面的。 那么下面来说一下Android开发领域对全面屏的理解和…

mgr未同步 mysql_MySQL Group Replication(多主同步复制MGR)

开启replication配置&#xff1a;server-id1 #标识服务器唯一log-binmysql-bin #二进制日志开启enforce_gtid_consistency ON #GTID模式是组复制的基础技术binlog-formatrow#必须是ROW模式gtid-modeON …

Java三大主流框架概述

Struts、Hibernate和Spring是我们Java开发中的常用关键&#xff0c;他们分别针对不同的应用场景给出最合适的解决方案。但你是否知道&#xff0c;这些知名框架最初是怎样产生的?我们知道&#xff0c;传统的Java Web应用程序是采用JSPServletJavabean来实现的&#xff0c;这种模…

Cacti Weathermap添加主机在线状态图示检测

Weathermap 中文名称翻译为 气象图weathermap版本支持&#xff1a;0.94及最新版1、首先添加气象图 图例像这样。编辑需要添加图例的气象图配置文件 (气象图配置文件默认在/var/www/html/plugins/weathermap/configs/ 目录中)其中 KEYPOS指定全局图例名称以及 图例位置和 图例标…