关于I帧/IDR、B帧、P帧、SPS、PPS

news2024/10/6 6:53:08

在h264编解码中,常常有I帧/IDR/B帧/P帧/IDR/NALU/GOP/,但往往没有关注细节。或者我们本身在实际应用中与使用过很多次,但对相关的技术名词不清楚。

在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧。

H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。

在这里插入图片描述

I帧

简单地说,I帧是关键帧,属于帧内压缩。I帧表示关键帧,可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成(完整画面)。属于帧内压缩,其特点:

  1. 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
  2. 解码时仅用I帧的数据就可重构完整图像;
  3. I帧描述了图像背景和运动主体的详情;
  4. I帧不需要参考其他画面而生成;
  5. I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  6. I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
  7. I帧不需要考虑运动矢量;
  8. I帧所占数据的信息量比较大。

I帧(IDR)

IDR = instantaneous decoding refresh 即时解码刷新帧或强制刷新帧, IDR一定是I帧,但I帧不一定是IDR,为了区分帧序列的首个I帧和其他I帧,才定义首个I帧为IDR,解码器只可以从IDR开始解码,IDR表示一组新的帧序列GOP,在IDR帧之后的所有帧都不能引用该IDR之前的帧数据,在普通I帧之后的B、P帧可以引用该普通I帧之前的I帧
ID会导致DPB(decord picture buff 参考帧列表)清空,导致PPS、SPS参数更新。

P帧

P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据),是帧间压缩
P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
P帧特点:

  1. P帧是I帧后面相隔1-2帧的编码帧。
  2. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)。
  3. 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像。
  4. P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。
  5. P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。
  6. 由于P帧是参考帧,它可能造成解码错误的扩散。
  7. 由于是差值传送,P帧的压缩比较高。

B帧

B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU消耗较高。
B帧特点:

  1. B帧是由前面的I或P帧和后面的P帧来进行预测的;
  2. B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
  3. B帧是双向预测编码帧;
  4. B帧压缩比最高,因为它只反映2参考帧间运动主体的变化情况,预测比较准确;
  5. B帧不是参考帧,不会造成解码错误的扩散。

GOP

简单讲就是一个关键帧(包含)到后面关键帧之间的帧序列。注意,不一定是上一个关键帧和下一个关键帧的关系。一般情况下,一个序列是一段图像编码后的数据流, 以I帧开始,到下一个I帧结束。

一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

SPS

序列参数集 (Sequence Paramater Set, SPS)
SPS 记录了编码的 Profile、level、图像宽高等
如果其中的数据丢失或出现错误,那么解码过程很可能会失败

PPS

图像参数集 (Picture Paramater Set, PPS)
每一帧编码后数据所依赖的参数保存于 PPS 中

一般情况 SPS 和 PPS 的 NAL Unit 通常位于整个码流的起始位置。
封装文件一般进保存一次,位于文件头部,SPS/PPS 在整个解码过程中复用,不发生变化。
然而对于实时流,通常是从流中间开始解码,因此需要在每个I帧前添加SPS和PPS;
如果编码器在编码过程中改变了码流参数(如分辨率),需要重新调整SPS和PPS数据。

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

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

相关文章

【C语言】 知识点汇总--基础知识点梳理(超全超详细)

目录 一、从源代码到exe 二、基本数据类型 三、字符在屏幕上的显示原理 四、溢出现象 五、类型转换规律 六、短路问题 七、指针变量类型的作用 八、指针类型的扩展——多级指针 九、指针类型的扩展——指针数组 十、指针类型的扩展——数组指针 十一、一维数组-名-特…

Doris(24):Doris的函数—聚合函数

1 APPROX_COUNT_DISTINCT(expr) 返回类似于 COUNT(DISTINCT col) 结果的近似值聚合函数。 它比 COUNT 和 DISTINCT 组合的速度更快,并使用固定大小的内存,因此对于高基数的列可以使用更少的内存。 select city,approx_count_distinct(user_id) from site_visit group by c…

Go语言-数据结构与算法

20.4 稀疏 sparsearray 数组 20.4.1 先看一个实际的需求  编写的五子棋程序中,有存盘退出和续上盘的功能 稀疏数组的处理方法是 : 1) 记录数组一共有几行几列,有多少个不同的值 2) 思想:把具有不同值的元素的行列及值记录在一个…

前端三剑客之HTML】

⭐个人主页:书生♡博客主页🙋‍♂ 🍑博客领域:java编程,前端,算法,强训题目 写作风格:干货,干货,还是tmd的干货 支持博主:点赞、收藏⭐、留言💬 目录 1.前端1.1什么是前端…

MySQL学习笔记第七天

第07章单行函数 2. 数值函数 2.4 指数函数、对数函数 函数用法POW(x,y)&#xff0c;POWER(X,Y)返回x的y次方EXP(X)返回e的x次方&#xff0c;其中e是一个常数&#xff0c;2.718281828459045LN(X)&#xff0c;LOG(X)返回以e为底的X的对数&#xff0c;当x<0时&#xff0c;返…

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集模块设计(一)总体方案

本章将根据高速数据采集指标要求&#xff0c;分析并确定高速数据采集模块的设计方 案&#xff0c;由此分析数据存储需求及存储速度需求给出高速大容量数据存储方案&#xff0c;完成 双通道高速数据采集模块总体设计方案&#xff0c;并综合采集、存储方案及 AXIe 接口需求 …

第一个C++程序

一、c结构 计算两个数的和&#xff1a; #include <iostream> using namespace std;int main(){int a,b;cin>>a>>b;cout<<"ab"<<ab<<endl;return 0; } #include <iostream> 是 C 标准库中的头文件之一&#xff0c;它包含…

Python程序员的薪资待遇怎么样?我来讲述一下自己五年的工作经历

大家好&#xff0c;我是一名毕业五年的程序员。接下来我将讲述一下我的五年经历&#xff0c;以及一些关于程序员薪资的问题。大学时学的是计算机专业&#xff0c;当时选择这个专业是因为听说这个专业比较好找工作。于是我就选了计算机专业&#xff0c;然后在大四的时候开始找工…

权限提升:漏洞探针.(Linux系统)

权限提升&#xff1a;漏洞探针. 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动的&#xff0c;因此通过 Webshel…

同一云厂商同一内网云服务器中使用CentOS 7.6安装Kubernetes集群

查看Linux发行版版本号 cat /etc/redhat-release查看版本号。 更改yum源 参考我写的博客。 主节点操作系统参数配置和软件安装 cat >> /etc/hosts <<OFF&#xff0c;将你的两台云服务器的内网IP和对应的主机名写到/etc/hosts。 需要修改“/etc/fstab”&…

Redis监控步骤get!Google精髓的四大法则直接掌握

Redis也是对外服务&#xff0c;所以Google四个黄金指标同样适用&#xff0c;还从延迟、流量、错误、饱和度分析Redis关键指标。 1 延迟 选择Redis是想得到更快响应速度和更高吞吐量&#xff0c;所以延迟数据对使用Redis的应用程序至关重要。 1.1 如何监控延迟 ① 客户端应用…

C++基础——运算符详解

详解运算符 初识运算符位运算认识位运算的相关运算符。能实现什么样的操作&#xff1f;及实现原理。 比较运算符逻辑运算符赋值运算符 初识运算符 运算符分为5大类&#xff1a;算数运算符、赋值运算符、复合赋值运算符、比较运算符、逻辑运算符。算数运算符就是加减乘除运算&a…

bytetrack 多目标跟踪 学习笔记

效果&#xff1a; ByteTrack在遮挡情况下ID不丢失演示 最近几天在看Bytetrack,感觉自己的学习方法有点问题, 应该先断点跑通&#xff0c;总体把握 然后完全理解算法代码的每一行,可以自己复现(这个就很难,看github的大佬把python转C 好羡慕) 所以如果学习Bytetrack,需要: 了…

【Git】Git(分布式项目管理工具)在Windows本地/命令行中的基本操作以及在gitee中的操作,使用命令行、图形化界面,进行提交,同步,克隆

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

菜鸡shader:L1基于兰伯特原理的玉石、条纹、点阵材质

目录 玉石材质条纹材质点阵效果 这里就简单说下原理吧&#xff0c;使用unity很久之前的一个插件shaderforge&#xff0c;最近几年好像在unity资源商店已经不再维护了&#xff0c;但是有shader forge的官网&#xff1a;在这&#xff0c;碰到节点不会的时候可以查一下官方文档&am…

手把手,带你发布你的第一个npm包

我们在编写项目的时候&#xff0c;都会引入很多很好用的工具包&#xff0c;例如VueX、axios、Router、Element UId等。这些包很好用&#xff0c;安装引入也很方便。那如果我们也想发布一个我们自己的工具包&#xff0c;在以后编写项目时&#xff0c;直接引入我们自己的工具包要…

干货 | 正确引用参考文献的6大技巧

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐&#xff5e; 对于学术研究而言&#xff0c;正确引用参考文献非常重要。参考文献不仅展现了自己的学术水平&#xff0c;同时也给研究定位&#xff0c;突显研究在前人研究基础上作出的贡献。 …

牛客_华为_HJ32 密码截取

HJ32 密码截取 647. 回文子串 516.最长回文子序列 ## 这不就是 最长回文子串&#xff01;&#xff01; ## 回文子串有两种模式 ## ABA ##CAACst input() n len(st) ## 双指针 def func(s,i,j,n):res 0while i>0 and j<n and s[i]s[j]:i-1j1return j-i-1 ## 由于i j…

五本计算机必读书籍总结

一、计算机组成原理 思维导图&#xff1a; 1、计算机系统概述 主要讲授信息的数字化表示、存储程序与冯诺依曼体制&#xff1b;计算机的诞生和发展&#xff1b;计算机系统的层次结构和硬件系统组织&#xff1b;计算机的主要性能指标。 2、数据的表示、运算与校验 主要讲授数值…

C语言中链表中经典面试题

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…