(转)I 帧和 IDR 帧的区别
I 帧和 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_ 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 的出现其实是相当于向解码器发出了一个清理 reference buffer 的信号吧,上面说前于这一帧的所有已编码帧不能为 inter 做参考帧了。”
还有:“ 因为 264 采用了多帧预测,就有可能在 display order 下 I 帧后的 P 会参考 I 帧前的帧,这样在 random access 时如果只找 I 帧,随后的帧的参考帧可能 unavailable , IDR 就是这样一种特殊的I 帧,把它定义为确保后面的 P 一定不参考其前面的帧,可以放心地 random access 。
(转)I 帧和 IDR 帧的区别相关推荐
- I 帧和 IDR 帧的区别
I 帧和 IDR 帧的区别: IDR 帧属于 I 帧.解码器收到 IDR frame 时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现--在 encoder.c 文 ...
- I帧和IDR帧区别(转载)
I 帧和 IDR 帧的区别: IDR 帧属于 I 帧.解码器收到 IDR frame 时,将所有的参考帧队列丢弃 (用 x264_reference_reset 函数实现--在 encoder.c ...
- 视频知识点(14)- 来,咱们聊一聊 I 帧和 IDR 帧的区别
CSDN话题挑战赛第1期活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 技术专栏 >><音视 ...
- H264编码入门(二)I 帧和 IDR 帧的区别
I 帧和 IDR 帧的区别 I 帧和 IDR 帧的区别 IDR与GOP: 疑问: 解答: 结论 QQ交流群:697773082 I 帧和 IDR 帧的区别 IDR 帧属于 I 帧.解码器收到 IDR ...
- I帧和IDR帧的区别
文章一: 转自:http://blog.csdn.net/SkyGray/article/details/6223358 IDR 帧属于 I 帧.解码器收到 IDR frame 时,将所有的参考帧队 ...
- I帧、B帧、P帧以及IDR帧之间的关系
IDR(Instantaneous Decoding Refresh)--即时解码刷新. I帧:帧内编码帧是一种自带全部信息的独立帧,无需参考其它图像便可独立进行解码,视频序列中的第一个帧始终都是I帧 ...
- GOP I帧和IDR帧
IDR 帧属于 I 帧.解码器收到 IDR frame 时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现--在 encoder.c 文件中) .这点是所有 I 帧共 ...
- H.264中IDR帧和I帧区别
IDR(Instantaneous Decoding Refresh)--即时解码刷新. I和IDR帧都是使用帧内预测的.它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I ...
- 图像和流媒体 -- I 帧,B帧,P帧,IDR帧的区别
参看:什么是I帧,P帧,B帧 参看:H264编码原理以及I帧B帧P帧 一.H246简介 H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参 ...
最新文章
- 【问题收录】Ubuntu14.04安装时黑屏处理
- ACL 2019 | 基于知识增强的语言表示模型,多项NLP任务表现超越BERT(附论文解读)...
- ALV Checkbox 单行灰显
- 浅入深出Vue:发布项目
- 期货与期权(part6)--保证金
- fabric shim安装合约_智能合约简介_智能合约开发_Hyperledger Fabric_开发指南_区块链服务 BaaS - 阿里云...
- 转 html中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
- Hadoop Hbase单机配置
- MySQL数据库储存引擎Inoodb一--记录储存结构
- Android API级别、代号、发布时间及平台亮点整理
- 【读书笔记《Android游戏编程之从零开始》】9.游戏开发基础(如何快速的进入 Android 游戏开发)
- 电信路由器怎么设置虚拟服务器,电信宽带怎么设置路由器?
- Mac用bootcamp安装Windows 11双系统
- Unsupervised Super Resolution Reconstruction of Traffic Surveillance Vehicle Images
- 人工智能聊天机器人(有详细安装教程)/ 自动学习型
- mysql上机心得体会_数据库原理上机心得体会
- android平板改成电视盒子,【当贝市场】废旧手机改造成电视盒子详细教程
- java版-五子棋-个人-源码参考
- 阿里云安装部署Oracle11g 详细教程
- 微信小程序查看组件中的data值
热门文章
- 用thttpd做Web Server
- Netbeans使用maven下载源码
- vigra1.8.0的使用
- 【Qt】监视文件和目录的修改:QFileSystemWatcher
- ajax data参数没有值,ajax $.get的data参数无法传递
- alternate端口什么意思_宽带光信号闪红灯是什么意思?
- eas 在linux下安装_有在linux系统安装eas7.5的没???求指点
- ios share extension 真机不显示_ios企业签名:APPGroups实现App之间数据共享
- listen函数的第二个参数_【图像处理】OpenCV系列十七 --- 几何图像变换函数详解(一)...
- Android项目框架综合实例