I帧和IDR帧区别

From: http://blog.csdn.net/skygray/article/details/6223358

帧和 IDR 帧的区别:

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

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

先说明:所有的 IDR 帧都是 帧,但是并不是所有 帧都是 IDR 帧。就是说, IDR 帧是 帧的子集。 (我们程序中设定的是每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       /*   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 ……(我们程序没有 帧,所以帧序列简单些,但道理是一样的)。按照 个参考帧编码。

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

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

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

     最后,“ 但是收到 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 下 帧后的 会参考 帧前的帧,这样在 random access 时如果只找 帧,随后的帧的参考帧可能 unavailable , IDR 就是这样一种特殊的 帧,把它定义为确保后面的 一定不参考其前面的帧,可以放心地 random access 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU 3486 Interviewe RMQ

题意&#xff1a; 将\(n\)个数分成\(m\)段相邻区间&#xff0c;每段区间的长度为\(\left \lfloor \frac{n}{m} \right \rfloor\)&#xff0c;从每段区间选一个最大值&#xff0c;要让所有的最大值之和大于\(k\)。求最小的\(m\)。 分析&#xff1a; 预处理RMQ&#xff0c;维护区…

[react] 举例说明useState

[react] 举例说明useState import { useState } from react; const [count, setCount] useState(0); function Demo() {const doAdd1 () > {setCount(prevCount 1);};const doAdd2 () > {setCount(prevCount > prevCount 1);};return <><h1>{count}…

win10 vscode 无法激活python 虚拟环境的解决办法

一、powershell中 python创建虚拟环境无法激活 二、管理员模式运行powershell&#xff0c;执行策略更改&#xff1a; Set-ExecutionPolicy RemoteSigned&#xff0c;输入y 三、vscode再次激活&#xff1a; .\flask-venv\Scripts\activate 激活成功。 四、退出虚拟环境&#x…

客户端获取游客IP,获取客户地理信息,展示地图

参考自&#xff1a;http://www.cnblogs.com/phphuaibei/archive/2011/09/08/2171903.html 三维地图&#xff0c;目前只有都市圈和E都市有提供。 Google街景可以在浏览器安装google earth插件后显示。转载于:https://blog.51cto.com/icersummer/724481

vscode 升级过后自带的四种终端

一、版本 二、终端 自带了四种默认配置终端&#xff0c;删除以前Edit in settings.json的“terminal.integrated.shell.windows”字段。 四种默认终端&#xff1a; powershellwslcmdjavaScript Debug Terminal

[react] 使用ES6的class定义的组件不支持mixins了,那用什么可以替代呢?

[react] 使用ES6的class定义的组件不支持mixins了&#xff0c;那用什么可以替代呢&#xff1f; HOC 高阶组件是一个以组件为参数并返回一个新组件的函数。HOC 运行你重用代码、逻辑和引导抽象。最常见的可能是 Redux 的 connect 函数。除了简单分享工具库和简单的组合&#xf…

接口委托实现

1 TFMDesign class(TFMBase, IDataSetOperator)2 public3 //注意名称要不一样,重新定义保存方法4 procedure IDataSetOperator.DoApplyUpdates ApplyUpdates;5 6 //重写保存方法7 procedure ApplyUpdates; stdcall;8 9 //接口用对象10 property …

2015第19本:异类--不一样的成功启示录

一位移民加拿大的高中同学在2012年回国探亲&#xff0c;聚会时曾推荐了《异类--不一样的成功启示录》这本书&#xff0c;英文书名叫《Outliers - the story of success》&#xff0c;一直没有系统地看完。在整理Omnifocus的读书列表时又发现了此书&#xff0c;还是趁这个机会把…

windows10 安装mqtt服务器和client客户端进行本地调试

一、安装mqtt服务器 使用emqx作为mqtt服务器&#xff0c;下载emqx-windows-4.3.8.zip。 emqx-windows-4.3.8.zip 其他版本&#xff1a;Directory listing for broker: / | EMQ 解压到自定义目录位置&#xff0c;在cmd窗口进入解压后的bin目录 cd /d D:\Tools\exqxServer\em…

I,P,B帧和PTS,DTS的关系

From: http://www.cnblogs.com/qingquan/archive/2011/07/27/2118967.html 基本概念&#xff1a; I frame &#xff1a;帧内编码帧 又称intra picture&#xff0c;I 帧通常是每个 GOP&#xff08;MPEG 所使用的一种视频压缩技术&#xff09;的第一个帧&#xff0c;经过适度地压…

[react] 为何说虚拟DOM会提高性能?

[react] 为何说虚拟DOM会提高性能&#xff1f; 虚拟dom相当于在js和真实dom中间加了一个缓存&#xff0c;利用dom diff算法避免了没有必要的dom操作&#xff0c;从而提高性能 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定…

不断学习才能进步!

51CTO确实是一个很不错的技术性很强的社交网络&#xff0c;在这里我发现有很多东西值得我去学习&#xff0c;只不过现在从事教师职业&#xff0c;没有太多的时间。但我只要有时间就会来学习的&#xff0c;希望大家能够多多帮助&#xff01;转载于:https://blog.51cto.com/anday…

Windows Subsystem for Linux(WSL)安装emqx

一、安装 win10自带linux子系统&#xff0c;wsl ubuntu&#xff0c;安装方法同ubuntu。 脚本一键安装&#xff1a;curl https://repos.emqx.io/install_emqx.sh | bash 二、使用 $ emqx start emqx 4.0.0 is started successfully! $ emqx_ctl status Node emqx127.0.0.1 i…

丰富“WinForms” 的一个别样项目(学生管理)

一个别样的WinForms项目&#xff0c;他并没多么的新颖&#xff0c;但是它的用处确实有点多&#xff0c;或许会有你需要的地方&#xff1b;如果你对WinForms中那么多控件无法把握&#xff0c;又或者是你根本就不懂&#xff0c;那我觉得你应该好好看看&#xff0c;如果一个人的人…

opengl与Directx的区别

From: http://blog.163.com/xtdx888888126/blog/static/2955727520083661133565/ OpenGL 只是图形函数库。 DirectX 包含图形, 声音, 输入, 网络等模块。 单就图形而论, DirectX 的图形库性能不如 OpenGL OpenGL稳定&#xff0c;可跨平台使用。但 OpenGL 多需要显卡支持. …

[react] shouldComponentUpdate方法是做什么的

[react] shouldComponentUpdate方法是做什么的 shouldComponentUpdate是React组件的生命周期&#xff0c;在组件更新后触发&#xff0c;该方法继承子React.Component.方法的作用是可以在内部比较更新前后的state和props的值&#xff0c;手动控制当前组件是否需要执行render函数…

OSPF区域不能与area 0 相连的解决方法

有些时候&#xff0c;由于区域包含的路由器过多或区域的地理位置原因等&#xff0c;造成网络中配置的OSPF区域&#xff08;非area 0&#xff09;不能够与area 0相连。大家都知道&#xff0c;在OSPF的所有区域内&#xff0c;area 0 是骨干区域&#xff0c;非0区域都要与area0相连…

Spark从HDFS上读取JSON数据

代码如下&#xff1a; import org.apache.spark.sql.Row; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.VoidFunction; import org.apache.…

emqx使用webhook数据持久化到mysql

官方文档&#xff1a;WebHook | EMQ Docs 一、启用webhook和触发规则 编辑webhook规则配置文件&#xff1a;/etc/emqx/plugins/emqx_web_hook.conf 指定webhook的url位置&#xff1a;web.hook.url http://127.0.0.1:5000/mqtt/webhook 增加消息推送事件规则&#xff1a;指…

为什么你应该使用OpenGL而不是DirectX?

From: http://www.cnblogs.com/Baesky/archive/2011/04/08/2009128.html 这是一篇很意思的博文&#xff0c;原文链接为&#xff1a;http://blog.wolfire.com/2010/01/Why-you-should-use-OpenGL-and-not-DirectX 大家可以思考一下&#xff1a;why we choose a closed source AP…