当前位置: 首页 > ds >正文

音视频学习(三十九):IDR帧和I帧

主要区分:

I 帧 是帧内编码帧,IDR 帧 是一种特殊的 I 帧,它是“清除参考帧链的强制切断点”。

H.264 视频结构

结构

H.264 视频由多个 NAL(Network Abstraction Layer)单元 构成,每一帧图像可由一个或多个 NAL 单元组成。

典型结构:

H.264码流 =
| SPS | PPS | IDR | P帧 | B帧 | ... |每帧 =
| Start Code | NAL Header | Payload |

NAL 单元结构

NAL 单元基本结构(以 Annex-B 为例):

起始码 (Start Code):    0x000001 或 0x00000001
NAL Header(1 字节):   |F|NRI| Type|
Payload(变长):        编码图像、参数等
字段说明
Fforbidden_zero_bit(固定为 0)
NRInal_ref_idc(参考强度)
Typenal_unit_type(表示内容类型)

关键类型:nal_unit_type

Type 值类型说明是否关键帧
1非 IDR 的帧(P/B/I)❌ 非关键帧
5IDR 帧(关键帧)✅ 关键帧
6SEI(辅助信息)
7SPS(序列参数集)
8PPS(图像参数集)

所以:

  • nal_unit_type == 5 → 表示这是一个 IDR 帧(关键帧);
  • nal_unit_type == 1 → 表示普通非 IDR 帧(可为 I、P、B 等);

IDR 帧识别

码流(16进制)示例(部分):
00 00 00 01 65 88 ... ← IDR 帧开始解释:
00 00 00 01  → 起始码
65           → NAL Header = 0x65二进制 0110 0101F=0, NRI=3, Type=5 → IDR 帧
码流(另一个例子):
00 00 00 01 41 ... ← 普通 P/B 帧41 → 0100 0001 → Type = 1 → 非 IDR

I 帧(Intra Frame)

特点:

  • 使用帧内预测压缩(不参考其他帧);
  • 可独立解码;
  • 用作压缩起点或恢复点。

但:不是所有 I 帧 都是 IDR 帧

  • 普通的 I 帧 可以被后续 P/B 帧作为参考帧
  • 所以如果你从某个普通 I 帧开始播放,仍可能缺少参考帧,造成花屏或播放错误。

IDR 帧(Instantaneous Decoder Refresh)

特点:

  • I 帧的一种特殊类型
  • 在 H.264 的语法中属于 IDR picture
  • 出现 IDR 帧时,所有之前的参考帧立即失效,后续帧 不会引用 IDR 帧之前的任何帧

作用:

  • 解码器会清空参考帧缓冲区;
  • 强制视频从此帧开始“清零重建”;
  • 是流媒体中的**“关键帧”**,播放器可以从此帧快速切入播放;
  • 典型用于 GOP(Group of Pictures)起始帧、场景切换、快速跳转点。

GOP 结构与 IDR 关联

时间线 →
GOP 1:  [IDR] P   B   B   P   B   B   P   B   B↑———— 引用帧只在 GOP 内部 ———↑GOP 2:  [IDR] P   B   B   P   B   B   P   B   B

注意:

  • 每个 GOP 的帧只引用其内部的帧;
  • IDR 帧确保后续帧 不引用前一个 GOP 的内容
  • 这样可以实现无依赖的片段播放或解码
  • 一个GOP中通常只有1个I帧(即IDR帧);
http://www.xdnf.cn/news/15623.html

相关文章:

  • 《黑马笔记》 --- C++核心编程
  • PHP安全漏洞深度解析:文件包含与SSRF攻击的攻防实战
  • 在新闻资讯 APP 中添加不同新闻分类页面,通过 ViewPager2 实现滑动切换
  • 网络基础协议综合实验
  • GeoTools 工厂设计模式
  • 【Linux庖丁解牛】— 保存信号!
  • SAP学习笔记 - 开发45 - RAP开发 Managed App New Service Definition,Metadata Extension
  • C++中list各种基本接口的模拟实现
  • 25、企业能源管理(Energy):锚定双碳目标,从分类管控到智能优化的数字化转型之路
  • npu-smi info命令参数解释
  • C++-linux系统编程 8.进程(三)孤儿进程、僵尸进程与进程回收
  • 数据结构之单链表
  • Java :List,LinkedList,ArrayList
  • sqli-labs靶场通关笔记:第17关 POST请求的密码重置
  • 连接new服务器注意事项
  • kiro, 新款 AI 编辑器, 简单了解一下
  • Java基础(八):封装、继承、多态与关键字this、super详解
  • 笔试——Day8
  • Scrapy扩展深度解析:构建可定制化爬虫生态系统的核心技术
  • 直播数据统计:如何让数据为我们所用?
  • CommunityToolkit.Mvvm IOC 示例
  • C++回顾 Day8
  • 一文深入:AI 智能体系统架构设计
  • 简单工厂设计模式
  • QT 中各种坑
  • 算法学习day16----Python数据结构--模拟队列
  • haproxy负载均衡
  • 【雅思播客016】New Year Resolution 新年决心
  • vue实现el-table-column中自定义label
  • 深入理解C++11 std::iota:从原理到实践