ios 视频知识补充---分解LFLiveKit

视频:泛指将一系列的静态影像以电信号的方式捕捉、记录、处理、储存、传送、重现的各种技术。连续的静态图像变化每秒超过24帧(frame)以上时,由于视觉残留,人眼无法识别单独的静态图片,此时看上去就是平滑且连续的效果,这种连续的影像画面可以称之为视频。

帧:视频是由一帧一帧的静态图片连续播放形成的,故一帧就是视频中一个静态的画面。(可以理解为由一张一张的图片,在视频范畴称为“帧”,图片称为“静态画面”)

关键帧:也称之为 I 帧,是帧间压缩编码的最重要的帧。视频的编码是按照“组”进行的,每一个组叫"GOP(Group Of Picture,图像组)",而GOP与GOP之间没有联系,编码的关系只在一个GOP之间处理,关键帧是一幅完整的画面,GOP之间的帧都是不完整的,需要关键帧、前面帧、后面帧等一起运算得到。关键帧的间隔条件会影响到GOP的长度,继而影响到读取GOP的速度,如果关键帧间隔设置过大,在必须用到关键帧的场景就可能需要B/P帧来代替,这样会降低画面质量。关键帧是帧间压缩的基础,典型的GOP结构是 IBBPBBPBBPBBPBBPBB

前后参考帧:也称之为 B 帧,参考前面、后面两帧的数据加上本帧的变化得到本帧的数据

向前参考帧:也称之为 P 帧,如果 I 帧损坏,整个GOP就损坏了。即IBBPBBPBBPBBPBBPBB这么多帧一起坏掉,设置再长的时间间隔,编码出的数据也不稳定。

 

拓展:

I 帧是帧内压缩  而P、B帧是帧间压缩,以I帧为基础,预测P帧,以I、P帧为基础预测B帧,最后将I帧数据和预测的差值存储和传输。

帧率:一秒内传输图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。

FPS越高对显卡的性能要求越高,电脑中显示的图片都是有显卡输出的,屏幕上每个像素点的填充都是有显卡进行计算并输出的。假定一个图片分辨率1024x768,页面帧率设置24fps,那么显卡一秒内要处理的像素点为1024x768x24个。显卡处理能力=分辨率x帧率

一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

 I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列。

在H.264视频编码标准中,系统框架分为两个层面:VCL( 视频编码层面) 和 NAL(网络抽象层),前者表示视频数据内容,后者负责格式化数据并提供头信息,以保证数据适合在各种信道和存储介质上传输。每帧数据就是一个NAL单元(SPS和PPS除外),在实际的H264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为SPS与PPS,接着为I帧……

NALU: 全称Network Abstract Layer Unit (网络抽象层单元),包含一个字节的头信息和一系列来自VCL称为原始字节序列的字节流(RBSP),H264在网络上传输的是NALU,NALU的结构:NAL头+RBSP

SPS: H.264码流第一个 NALU是 SPS(序列参数集Sequence Parameter Set)

SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。但在某些特殊情况下,在码流中间也可能出现这两种结构,主要原因可能为:

  • 解码器需要在码流中间开始解码;
  • 编码器在编码的过程中改变了码流的参数(如图像分辨率等);

在做视频播放器时,为了让后续的解码过程可以使用SPS中包含的参数,必须对其中的数据进行解析。

PPS: H.264码流第二个 NALU是 PPS(图像参数集Picture Parameter Set)

通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。

IDR:  H.264码流第三个 NALU 是 IDR(即时解码器刷新)

H2.64中I帧和IDR帧的区别
I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担,IDR会导致DPB(参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。 (http://blog.csdn.net/leixiaohua1020/article/details/11800877)

 

以上信息,各种百度。。。。。。

 

转载于:https://www.cnblogs.com/madaha/p/9713170.html

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

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

相关文章

快速排序详解以及java实现

快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排。 快排采用了经典的分治思想(divide and conquer): Divide:选取一个基元X(一般选取数组第一个元素)&…

机票预订系统活动图_软件工程(第五版)--习题及答案技术总结.docx

PAGE \* MERGEFORMAT43《软件工程》(第五版)习题参考答案第1章 一、判断题1、()软件的维护与硬件维护本质上是相同的。 2、(√)软件在运行和使用中也存在退化问题。 3、()软件危机的产生主要是因为程序设计人员使用了不适当的程序设计语言。 4、(√)软件同其他事物一样&#xf…

android jni ——Field Method -- Accessing Field

现在我们知道了怎样使用native code访问简单的数据类型和引用参考类型(string,array),下面我们来介绍怎样让jni代码去访问java中的成员变量和成员函数,然后可以再jni中回调java中的方法。 ---------------------------…

树状数组的建树 单点修改 单点查询 区间修改 区间查询

单点修改 单点查询 用普通数组就能写出来 单点修改 区间查询 用线段树 树状数组&#xff1b; 区间修改 区间查询 用线段树 树状数组&#xff1b; 区间修改 单点查询 用线段树 树状数组&#xff1b; 建树 #include<bits/stdc.h> using namespace std; …

bert 中文 代码 谷歌_如何用最强模型BERT做NLP迁移学习?

作者 | 台湾大学网红教授李宏毅的三名爱徒来源 | 井森堡&#xff0c;不定期更新机器学习技术文并附上质量佳且可读性高的代码。编辑 | Jane谷歌此前发布的NLP模型BERT&#xff0c;在知乎、Reddit上都引起了轰动。其模型效果极好&#xff0c;BERT论文的作者在论文里做的几个实验…

安装ubuntu20.04(安装vim、gcc、VMtools、中文输入法、汉化、修改IP、无法连网问题)

目录ubuntu安装包获取ubuntu的安装安装网络配置命令ifconfig连接网络(解决ubuntu无法连网问题)如何修改IP地址安装VMtools解决VMware Tools选项灰色VMtools安装安装中文&#xff0c;汉化添加中文输入法调整分辨率安装新版的Vim安装gccubuntu安装包获取 xunlei中直接搜索下载 …

arm-2014.05 编译三星内核错误 “not support ARM mode ‘smc 0’ ”

&#xff08;1&#xff09;arch/arm/mach-exynos/include/mach/smc.h文件&#xff1a; 在第54行和第69下面添加&#xff1a; __asm__ volatile (".arch_extension sec\n""smc 0\n": "r"(reg0), "r"(reg1), "r"(reg2), &…

从servlet中获取spring的WebApplicationContext

需要做一个参数初始化类&#xff0c;当web应用被加载时从数据库里取出相关的参数设置&#xff0c;并把这些参数放置到application里&#xff0c;jsp页面可以从中取出。1.在web.xml中配置&#xff1a; <servlet><servlet-name>Dispatcher</servlet-name><s…

python频率_Python中的频率分析

我试图使用Python来检索现场音频输入的主频率。目前&#xff0c;我正在试验使用音频流我的笔记本内置麦克风&#xff0c;但当测试以下代码时&#xff0c;我得到了非常差的结果。# Read from Mic Input and find the freqsimport pyaudioimport numpy as npimport bgeimport wav…

树莓派基于Linux内核驱动开发详解

目录一、驱动认知1.1 为什么要学习写驱动1.2 文件名与设备号1.3 open函数打通上层到底层硬件的详细过程二、基于框架编写驱动代码2.1 编写上层应用代码2.2 修改内核驱动框架代码2.3 部分代码解读2.3.1 static的作用2.3.2 结构体成员变量赋值方式2.3.3 结构体file_operations(最…

Spring AOP(三)--XML方式实现

本文介绍通过XML方式实现Spring AOP&#xff0c;在上一篇中已经介绍了通过注解&#xff0b;java配置的方式&#xff0c;这篇文章主要是看XML中怎么配置&#xff0c;直接上代码了&#xff1a; 一、创建一个连接点 1⃣️定义接口 注意⚠️&#xff1a;可以定义接口&#xff0c;也…

3.X内核下设备树–platform设备驱动

1。历史的车轮总是向前&#xff0c;技术更替。在linus 同学发出那句 WFK 后内核进入了设备树时代&#xff08;站在驱动工程师角度&#xff09;。 前几天我已经被mach-imx 中的文件折磨的夜不能眠。我终于在一个清晨&#xff0c;喝完一杯咖啡后决定放弃蹩脚的传统device描述方式…

六核cpu安装SQL Server 2005时报错,提示启动服务失败

2019独角兽企业重金招聘Python工程师标准>>> 新买的IBM3650M4的服务器上安装SQL server2005 安装到一半时&#xff0c;报"提示&#xff1a;SQL Server 服务无法启动。"错。 一开始以为是操作系统的问题&#xff0c;先重装了一遍&#xff0c;还是不行&…

postgis数据库优化_PostgreSQL批量导入性能优化

现在很多企业都将数据库逐渐由Mysql转向了更加强大而且开源的PostgreSQL数据库。在数据迁移过程中&#xff0c;PostgreSQL数据库导入大量数据时候非常缓慢&#xff0c;本文我们就来说说PostgreSQL数据库批量导入数据时的优化方法和策略。概述考虑PostgreSQL数据库批量导入数据时…

智能家居 (1) ——智能家居整体功能框架

目录 智能家居整体功能框架图硬件部分清单往期文章智能家居整体功能框架图 可作为大学生毕业设计内容,亦可作求职面试话术使用 使用的硬件平台:树莓派3B(型号),CortexA53(架构),博通BCM2837(芯片) 软件平台:Linux,内核版本3.14 本项目实现的功能是通过手机app、…

docker下交叉编译环境配置

为什么在docker中搭建开发环境&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之…

jparepository查询所有_JPA – JpaRepository 中使用的查询方法

默认方法User usernew User();userRepository.findAll();userRepository.findOne(1l);userRepository.save(user);userRepository.delete(user);userRepository.count();userRepository.exists(1l);自定义查询User findByUserName(String userName);也使用一些加一些关键字And、…

Spring jdbc 对象Mapper的简单封装

一般查询实体的时候&#xff0c;都需要这么使用/** * 根据id查询 * * return */ public Emp queryEmpById(Integer id) { String sql "select * from emp where empno ?"; ParameterizedRowMapper<Emp> mappe…

网络编程知识预备(1) ——了解OSI网络模型

参考&#xff1a;简单了解OSI网络模型 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-18 20:07:09 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114968802?spm1001.2014.3001.5502 根据需求摘抄自下面这篇文章&#xff0c;内容非常详…

完全内核移植–kernel3.15.3

目标平台 明远智睿 EK314 CPU I.MAX6Q内核版本 3.15.3编译器 arm-none-linux-gnueabi-gcc-4.8.3 1。下载纯净内核 2。配置Makefile 3。拷贝cp imx_v6_v7_defconfig .config 4。# make menuconfig 退出保存 5。#make zImage 进行第一次编译&#xff0c;看能否通过 6。修改…