IDR(刷新帧)与I帧的一些知识点
2011-06-10 15:26
IDR帧属于I帧,但是I帧不一定是IDR帧。解码器收到IDR帧时,将驱动器参数块(DPB)清空。而I帧不会。(我自己理解为即把参考帧列表刷新从新更新,就是不再参考idr前面的帧)由此可见,在编码器端,每发一个IDR,就相应地发一个nal。当然在现在的编码中,为了取得更高的图像质量,在一个视频文件中有好多个IDR帧,这些IDR帧把视频文件分成了片,但是每片中第一个帧是IDR,而且仅此一个
例如:存在这样一段视频:
码流
|
IDR
|
B
|
B
|
P
|
B
|
B
|
P
|
……
|
帧号
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
……
|
对IDR帧的处理(与I帧的处理相同):(1) 进行帧内预测,决定所采用的帧内预测模式。(2) 像素值减去预测值,得到残差。(3) 对残差进行变换和量化。(4) 变长编码和算术编码。(5) 重构图像并滤波,得到的图像作为其它帧的参考帧。
这里要提一下,当编码器处理完IDR帧遇到B帧时,编码期先把其放入缓存器中存放起来。直接对P进行编码。即编码器中编码的实际顺序是IDR P B B P B B…..即1423756……
有用的来了
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。”
多参考帧情况下:
举个例子:有如下帧序列:IPPPPIPPPP……(我们程序没有B帧,所以帧序列简单些,但道理是一样的)。按照3个参考帧编码。因为“按照3个参考帧编码”,所以参考帧队列长度为3。遇到绿色的I时,并不清空参考帧队列,把这个I帧加入参考帧队列(当然I编码时不用参考帧。)。再检测到红色的P帧时,用到的就是PPI三帧做参考了。
不怕自己罗嗦(好记性不如烂笔头),再强调一个:一个参考帧,就是参考当前帧的前面的那帧(因为没涉及到B帧,所以“前面的那帧”既是播放顺序的,也是编码顺序的)。多个参考帧是一个道理。(我以前一直误解为从前面的几帧中找到最合适的一个参考帧)
最后,“但是收到IDR帧时,解码器另外需要做的工作就是:把所有的PPS和SPS参数进行更新。由此可见,在编码器端,每发一个IDR,就相应地发一个PPS&SPS_nal_unit”应该是对的吧。先这样认为:)
分享到:
相关推荐
更多详情可参考博客一:https://qianlingjun.blog.csdn.net/article/details/125051953 博客二:https://qianlingjun.blog.csdn.net/article/details/125064999 数据集部分是LIDC-IDRI的CT结节的数据集,其中供...
LIDC-IDRI数据集由胸部医学图像文件(如CT、X光片)和对应的诊断结果病变标注组成。该数据是由美国国家癌症研究所(National Cancer Institute)发起收集,该数据集中,共收录了1018个研究实例。对于每个实例中的图像,...
CHtmlView访问文件内部资源与innerHTML演示代码例子...... 1、访问文件内部资源 void CInerHTMLView::OnRes() { // TODO: Add your command handler code here //--资源访问 CString s; s.Format("res://%s....
在MFC中,通过利用CWinApp和CFrameWnd类的一些特性,可以轻松地实现对话框程序最小化到托盘的功能。 首先,我们需要在MFC应用程序的主对话框类中添加必要的成员变量和函数。这包括一个CMenu对象用于管理托盘菜单,...
例如,GPIO端口有数据输出寄存器(GPIOx_ODR)、数据输入寄存器(GPIOx_IDR)、数据状态寄存器(GPIOx_BSRR)等,通过写入或读取这些寄存器,可以实现对GPIO端口的操作。 对于STM32F103的中断处理,需要设置中断使...
在资源视图中,你可以在` IDR_MAINFRAME `资源的` STATUSBAR `部分看到它。 接下来,为了在状态栏上添加进度条控件,我们需要遵循以下步骤: 1. **定义进度条类**:创建一个新的CProgressCtrl类成员变量,例如` m_...
### MapXtreme在ASP.NET中的应用:创建动态图层及样式详解 #### 一、概述 MapXtreme是一款强大的地图开发工具,它能够帮助开发者轻松地在Web应用程序中集成地图功能。本文档旨在介绍如何利用MapXtreme在ASP.NET...
在嵌入式系统开发中,GPIO(General-Purpose Input/Output)是使用最广泛的功能之一,用于实现MCU与外部硬件的交互。在STM32中,GPIO口的配置是开发工作的基础。 STM32的GPIO口具有以下特性: 1. **多模式**:每个...
IDR帧是H.264编码中的特殊类型帧,它的主要功能是提供一个解码刷新点。当解码器遇到IDR帧时,它会丢弃所有先前的解码状态,重新初始化解码过程,确保后续的帧可以独立解码,不受之前帧的影响。这在视频切片、重播放...
一眼看出NALU中SPS与PPS与SEI与IDR与P帧
m_pMainWnd->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL)) { // ... 错误处理 ... } else { // 主窗口可见 m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow()...
### H264编码原理与I帧、B帧、P帧详解 #### 一、H264编码标准概述 H264作为新一代视频编码标准,以其出色的压缩效率、高质量的视频表现以及对多种网络环境的支持而在视频流媒体领域占据重要地位。该标准的核心优势...
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CADOXCreateDatabaseDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CADOXCreateDatabaseDlg) DDX_Text...
m_trayIcon.Create(this, IDI_ICON1, "我的程序", IDR_MAINFRAME, WM_USER); // ... } ``` 3. **处理消息**:在消息映射中,添加对WM_USER消息的处理,这是当用户点击托盘图标时触发的。你可以定义自己的消息处理...
http://blog.csdn.net/xjm199 void CMainFrame::OnTest() { // TODO: Add your command handler code here MessageBox("Test Click!"); }
我们通过编码得到的h264和aac数据通常需要封装成mp4文件,可以使用mp4v2实现这样的封装,封装的时候需要注意一些细节,比如...文章附件资源,原文链接:https://blog.csdn.net/u013113678/article/details/122833036
3 files (Main.cpp, Main.h and Main.dfm) of IDR (Interactive Delphi Reconstructor) at http://idr32.com/