音视频基础知识分享

news2024/11/29 3:46:37

音视频基础知识分享

RKMedia的各个组件及其交互

首先上图:

在这里插入图片描述

考虑到公司业务主要是相机,所以,主要去关注图像数据流,对于音频数据流直接忽略。

图像数据流向:

  1. Camera Sensor将光信号转换成电信号(Raw数据) ->

  2. ISP( image signal peocess)初步对raw数据进行一些处理,此时数据格式变成了(yuv420的变种)NV12格式 ->

  3. NV12格式数据下面的流向大体有三种:MPP、RGA、DRM。

  4. 首先是MPP,在rkmedia中,该模块主要对传送过来的图像数据做编码操作,比如将数据编码成H264、H265格式。这些格式能极大的压缩图像数据的大小。具体H264里面的结构,文章后面有详细介绍。OSD对于框图中MPP上面的OSD模块,可以为MPP中每一帧图像添加一些额外的标记吧。OSD模块和MPP是 相互绑定 的,至少我目前在代码中看到的是这样。

  5. 其次是RGA,该模块独立存在,并且可以对输入的NV12图像进行裁剪、缩放、旋转,然后将处理都图像数据发送给MPP模块。

  6. 最后是DRM模块,该模块就是一个图像显示框架,可以直接将输入的数据显示到屏幕上。

  7. 在经过MPP模块编码后的图像,最后还会一个叫Muxer的模块,该模块会将编码后的图像数据和音频数据进行打包,打包成MP4或者flx等格式,最后推流给服务器。

raw原始图像格式有四种包括:BGGR、RGGB、GBRG、GRBG。也称Bayer raw。

VI是基于v4l2接口实现

RKMedia接收者和发送者绑定限制:

在这里插入图片描述

摄像头的工作方式

摄像头有三种工作方式:

typedef enum {
    RK_AIQ_WORKING_MODE_NORMAL,                 // 又称单帧模式
    RK_AIQ_WORKING_MODE_ISP_HDR2    = 0x10,     // 两帧和成一帧
    RK_AIQ_WORKING_MODE_ISP_HDR3    = 0x20,     // 三帧合成一帧
//    RK_AIQ_WORKING_MODE_SENSOR_HDR = 10, // sensor built-in hdr mode
} rk_aiq_working_mode_t;

hdr解释为高动态范围,能显示的亮度范围更大,三帧合一中的三帧对应:欠曝光帧,正常曝光帧,过度曝光帧。

一般使用常规单帧

关于MIPI接口标准也是很复杂,本文先在应用层简单了解一下它的使用,具体细节,后面需要再去深究。这里还是贴一张它的框图:

在这里插入图片描述

上面的CCI就是相机控制接口,使用I2C进行通信。下面CSI就是相机串行接口,主要是传输数据用的。

接下来根据ISP的初始化代码来进一步了解ISP:

代码如下:

// RK_S32 SAMPLE_COMM_ISP_Init(RK_S32 CamId, rk_aiq_working_mode_t WDRMode,
//                             RK_BOOL MultiCam, const char *iq_file_dir) 


rk_aiq_working_mode_t hdr_mode = RK_AIQ_WORKING_MODE_NORMAL;
int fps = 30;
SAMPLE_COMM_ISP_Init(s32CamId, hdr_mode, bMultictx, pIqfilesPath);
SAMPLE_COMM_ISP_Run(s32CamId);

// 设置isp处理帧率非视频显示帧率
SAMPLE_COMM_ISP_SetFrameRate(s32CamId, fps);

CamId:代表使用哪个mipi csi,0代表mipi csi0,1代表mipi csi1,如果只有一个摄像头就可以为0,不管摄像头插在哪个接口(默认id就是0),如果有两个摄像头,就必须有camid的区分。

WDRMode:就是上面提到的三种工作模式。

MultiCam:false代表开启一个摄像头的isp,true代表开启多个摄像头的isp,一个摄像头设置为false即可。

iq_file_dir:并且ISP的工作会依赖iq配置文件,所以函数SAMPLE_COMM_ISP_Init中iq_file_dir就是iq文件所在目录。

此外,多个摄像头使用一个isp会分时复用,

注意这里提一下ISPP输出码流格式限制:

在这里插入图片描述

RGA模块的使用

接下来深入认识一下RGA模块的使用:

RGA_ATTR_S stRgaAttr;
memset(&stRgaAttr, 0, sizeof(stRgaAttr));
stRgaAttr.bEnBufPool = RK_TRUE;             // 使用缓冲池
stRgaAttr.u16BufPoolCnt = 3;                // 缓冲池的数量
stRgaAttr.u16Rotaion = 90;                  // 旋转90度
stRgaAttr.stImgIn.u32X = 0;                 // 在输入图像的横坐标为x处取样
stRgaAttr.stImgIn.u32Y = 0;                 // 在输入图像的纵坐标为y处取样
stRgaAttr.stImgIn.imgType = IMAGE_TYPE_NV12;// 输入图像格式
stRgaAttr.stImgIn.u32Width = video_width;   // 输入图像宽
stRgaAttr.stImgIn.u32Height = video_height; // 输入图像高
stRgaAttr.stImgIn.u32HorStride = video_width; // 水平跨距
stRgaAttr.stImgIn.u32VirStride = video_height;  // 垂直跨距
stRgaAttr.stImgOut.u32X = 0;                    // 相对stImgIn.u32X
stRgaAttr.stImgOut.u32Y = 0;                    // 相对stImgIn.u32Y
stRgaAttr.stImgOut.imgType = IMAGE_TYPE_RGB888; // 输出图像格式
stRgaAttr.stImgOut.u32Width = disp_width;       // 输出宽
stRgaAttr.stImgOut.u32Height = disp_height;     // 输出高
stRgaAttr.stImgOut.u32HorStride = disp_width;   // 含义同输入
stRgaAttr.stImgOut.u32VirStride = disp_height;  // 含义同输入
ret = RK_MPI_RGA_CreateChn(0, &stRgaAttr);

前后还其实涉及VI模块、以及VI和RGA模块的绑定,考虑到篇幅太大,这里就掠过了,主要看RGA模块的配置。

总结一下:stImgIn可以利用stImgIn.u32X、stImgIn.u32Y进行裁剪,stImgOut可以利用stImgOut.u32Width、stImgOut.u32Height进行缩放。

RGA模块对图像格式的支持也是有限的,参考如下:

在这里插入图片描述

modetest命令可查看各个图层支持的格式

VOP对 VO_PLANE_PRIMARY = 0,
VO_PLANE_OVERLAY,两层有裁剪功能。并且VO_PLANE_OVERLAY还支持缩放

VO_PLANE_OVERLAY -> win0
VO_PLANE_PRIMARY -> win2
VO_PLANE_CURSOR -> 背景层(rv1126不支持)

杂项

I帧(IDR帧,Instantaneous Decoding Refresh) :帧内编码帧是一种自带全部信息的独立帧,无需参考其它图像便可独立进行解码,视频序列中的第一个帧始终都是I帧。 属于帧内压缩,压缩质量好,压缩比例小。IDR帧一定是I帧,I帧不一定是IDR帧。

P帧 :前向参考,采用帧内、帧间压缩。

B帧 :前后参考,采用帧内、帧间压缩,实时视频传输会关闭B帧。未来无法预测,需要先将B帧缓冲,等待后面的帧解码后,再从B帧往后开始播放。

压缩比:B>P>I

GOP :H264中GOP就是一个图像序列,即从I帧开始到最后一个连续的非I帧为止的一组帧,一般而言同一组GOP的帧之间相似度很高。

GOP又分两种:

  • open GOP:不同GOP之间的P、B帧可以跨GOP进行参考

  • close GOP:不同GOP之间的P、B帧不能跨GOP参考,也即不能参考IDR帧之前的帧。

RKKmedia的GOP有三种模式:如下:

在这里插入图片描述

再细分

一帧图像可以划分成一个或者多个slice,slice称为片或者条带。

slice:I条带、P条带、B条带。为支持不同编码流之间的切换,还定义了SI条带、SP条带。

设置条带的目的就是为了并行编码,使编码片之间相互独立进行编码,能够限制误码的扩散和传播。

在这里插入图片描述

宏块就是视频压缩的基本单位、H264固定16*16。

H265:编码单元的名称叫:CTU(树形编码单元),大小是64*64像素,每个CTU包含3个CTB(树形编码快),每个CTU包含若干CU(编码单元),CU还能进行更灵活的细分。

8*8小宏块压缩比小,但图像质量好

16*16大宏块压缩比大,但图像质量查,一些些细节存在失真




YUV

参考:https://zhuanlan.zhihu.com/p/113122344

首先了解一下RGB,RGB以三原色(红绿蓝)来表示一张图片,以一张1280 * 720 大小的图片为例,因为每个像素都有三个字节来控制颜色,所以占用 1280 * 720 * 3 / 1024 / 1024 = 2.63 MB 存储空间

而YUV 颜色编码采用的是 明亮度色度 来指定像素的颜色。

色度 又定义了颜色的两个方面:色调和饱和度

也即yuv中每个像素也可以使用三个字节来控制其颜色。

但是: 对于 YUV 图像来说,**并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应自己的 UV 分量,也可以几个 Y 分量共用 UV 分量。**Y 和 UV 分量是可以分离的,如果没有 UV 分量一样可以显示完整的图像,只不过是 黑白的。

yuv和rgb可以相互转化,一般来说,传输会使用yuv(节省带宽),显示的时候会使用rgb。公式如下:

在这里插入图片描述

在这里插入图片描述

接下来就是yuv图像的采样,yuv图像的采样就是基于上面rgb转换成yuv后的数据进行采样,YUV 图像的主流采样方式有如下三种:

  • YUV 4:4:4 采样

  • YUV 4:2:2 采样

  • YUV 4:2:0 采样

YUV 4:4:4 采样

YUV 4:4:4 采样是完整的将rgb->yuv,不存在分量的丢失

形如:

rgb->yuv:

假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

对yuv进行采样:

采样后的yuv码流:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

对采样后的yuv码流进行网络传输:...

将采样后的yuv码流->“完整”的yuv:

最后映射出的像素点依旧为 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3] 

可以看出来,其图像大小和rgb一样,没有达到节省带宽的目的。

YUV 4:4:4 也是采样进行的第一步,先将rgb码流转换成完整的yuv码流,再根据需求,对vu分量按比例进行采样。(注意:y分量不可漏采!

YUV 4:2:2 采样

表示uv分量占y分量的一半,形如:

rgb->yuv:

假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

对yuv进行采样:

采样后的yuv码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3 

对采样后的yuv码流进行网络传输:...

将采样后的yuv码流->“完整”的yuv:

最后映射出的像素点为 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]

采样规则: 每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会 间隔一列 采样。也即uv分量是YUV 4:4:4的1/2

可以看到再最后将采样后的yuv”还原“成”完整“的yuv后,第一个像素和第二个像素共用一个uv分量。第三像素和第四像素也一样。并且采样后的yuv码流大小为:(1280 * 720 * 1 + (1280 * 720) / 2 + (1280 * 720) / 2)/ 1024 / 1024 = 1.7578125 MB 可以看到压缩了近三分之一的带宽。

YUV 4:2:0 采样

YUV 4:2:0采样会比较难理解,举个例子,如下:

rgb->yuv:
 
假设图像像素为:
 
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
 
对yuv进行采样:

采样后的yuv码流为:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8

对采样后的yuv码流进行网络传输:...
 
将采样后的yuv码流->“完整”的yuv:

最后映射出的像素点为:

[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]

采样规则: 每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会交替 间隔一行 采样,并且一行采样中,隔一列 采样。也即uv分量是YUV 4:2:2 采样的1/2

最后在将采样的yuv”还原“成”完整“的yuv后,每四方格像素会共用一个uv分量。并且采样后的yuv码流大小为: (1280 * 720 * 1 + ((1280 / 2) * (720 / 2)) + ((1280 / 2) * (720 / 2)))/ 1024 / 1024 = 1.318359375 MB 将原来的rgb码流大小压缩了1/2倍!

YUV 4:2:2 变种

YUV 4:2:2 采样又有很多变种,比如:YUYV 格式、UYVY 格式、YUV 422P 格式。

YUYV(打包格式)形如:

rgb->yuv:

假如图像像素为:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]

对yuv进行采样:

采样后的yuv码流为:Y0 U0 Y1 V0 Y2 U1 Y3 V1 

对采样后的yuv码流进行网络传输:...

将采样后的yuv码流->“完整”的yuv:

最后映射出的像素点为 [Y0 U0 V0]、[Y1 U0 V0]、[Y2 U1 V1]、[Y3 U1 V1]

采样规则: 每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量逐帧依次采样。

UYVY(打包格式) 和YUYV同理,仅仅存储的顺序不同。

YUV 422P(平面格式) :先存储所有Y分量,再存储U,最后V。

YUV 4:2:0 变种

主要包括两大类:YUV 420P 和 YUV 420SP,YUV 420P对应YU12、YV12,YUV 420SP对应NV12、NV21。YUV 420P 和 YUV 420SP都是基于平面模式存储。这里就不展开讨论。




H264

可以参考网站: https://www.zzsin.com/article/avc_0_start.html

H264没有音频、没有时间戳,处理图像本身,啥都没有。

H264又称avc,由一个个nalu组成。

有两种标准:AnnexB、avcC

AnnexB,nalu之间使用起始码分隔(一般是001或者0001(每位代表一字节)),并且类型为sps、pps的nalu当作普通nalu处理。当然,如果原数据中本身存在001字节序列,为使其正常传输,在发送数据前,会将原数据中的所有的”已定义字符“(001/0001)转义一下,这也是防竞争字节的概念。规则如下:

0 0 0 => 0 0 3 0
0 0 1 => 0 0 3 1
0 0 2 => 0 0 3 2
0 0 3 => 0 0 3 3

avcC,在每个nalu前面有一个固定长度的字节,这些字节会描述紧跟着的nalu有效载荷数据的长度。并且在一路采用 avcC 打包的 H.264 流之中,我们首先看到的将是一段被称之为 extradata 的数据,这段数据定义了这个 H.264 流的基本属性数据,当然,也包含了 SPS 和 PPS 数据。和AnnexB不同,avcC会将SPS和PPS放到extradata中(也可以把extradata看作协议头)。extradata还会定义,固定长度的字节的固定长度。extradata格式如下:

长度(bits)名称备注
8version总是等于 0x01
8avc profile所存放第一个 SPS 的第一个字节
8avc compatibility所存放第一个 SPS 的第二个字节
8avc level所存放第一个 SPS 的第三个字节
6reserved保留字段
2NALULengthSizeMinusOneNALU Body Length 数据的长度减去 1
3reserved保留字段
5number of SPS NALUs有几个 SPS,一般情况下这里是 1
for(int i=0; i<number of SPS NALUs; i++){~
16SPS sizeSPS 的长度
变长SPS NALU dataSPS NALU 的数据
}~
8number of PPS NALUs有几个 PPS,一般情况下这里是 1
for(int i=0; i<number of PPS NALUs; i++){~
16PPS sizePPS 的长度
变长PPS NALU dataPPS NALU 的数据
}~

nalu的第一个字节依次存放:禁止位、该nalu的重要性、nalu的类型。格式如下:

nal_unit( NumBytesInNALunit )CDescriptor
forbidden_zero_bitAllf(1)
nal_ref_idcAllu(2)
nal_unit_typeAllu(5)

典型的nalu类型有:

nalu的类型为sps(Sequence Paramater Set)的level表示视频质量(5.1)

nalu的类型为sps(Sequence Paramater Set)的profile表示码流压缩档次(100)

nalu的类型为sei:补充增强信息单元。存放用户自定义的信息(可有可无

其余的参考下图:

在这里插入图片描述

sps的profile值可以参考如下:

在这里插入图片描述

nalu后续字节就是图像的有效载荷。




其他

H264中,码率控制模式(RCMode)包括:CBR、VBR、AVBR

  1. CBR:恒定码率,码率变化平稳,但是当有运动画面时,图像质量会变差只考虑带宽、不考虑图像质量,可以使用这种模式

  2. VBR:可变码率,码率会依据图像质量的变化而变化,在意图像质量可以使用该模式。

  3. AVBR:自适应可变码率,会自动检测当前编码的图像画面是运动的还是静止的,如果是运动的,会提高码率,否则会降低码率,同时考虑带宽和图像质量就使用该模式。结合了CBR和VBR的优点。

RKMedia中有专门的成员来配置选择哪种模式。

英文缩写注释:

ROI:region of interest:感兴趣的区域。

SVC和AVC都属于H264但是属于不同标准


本章完结

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

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

相关文章

【大模型】AI视频课程制作工具开发

1. 需求信息 1.1 需求背景 讲师们在制作视频的过程中&#xff0c;发现录制课程比较麻烦&#xff0c;要保证环境安静&#xff0c;保证录制过程不出错&#xff0c;很容易反复重复录制&#xff0c;为了解决重复录制的工作量&#xff0c;想通过 ai 课程制作工具&#xff0c;来解决…

Rust引用与C++取地址、引用的区别(C++引用、Rust解引用、C++指针)

文章目录 Rust引用与C取地址和引用的比较一、内存安全与管理Rust的内存安全机制C的内存管理 二、引用和取地址Rust的引用C的引用和取地址 三、代码示例比较修改数据的安全性Rust示例C示例 四、结论 Rust引用与C取地址和引用的比较 在程序设计语言的世界里&#xff0c;Rust和C都…

【C++】string类(接口使用详解 下)

我们接着【C】string类&#xff08;接口使用详解 上&#xff09;-CSDN博客 继续介绍string的使用。 1.string类对象的修改操作 我们就说一下用的比较多的接口。 1.1 operator 这个接口可以尾插一个字符&#xff0c;或者一个字符串&#xff0c;或者一个对象。 string s1(&qu…

Java—类和对象习题讲解

如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 目录 习题一&#xff1a; 习题二&#xff1a; 习题三&#xff1a;.import static 能够导入一些静态方法 习题四&#xff1a; 习题五&#xff1a; 习题六&#xff1…

[LeetCode] 415.字符串相加

给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 示例 1&#xff1a; 输入&#xff…

SHELL脚本之数组介绍

shell数组 一.数组介绍 一段连续的内存空间&#xff0c;根据需要可以存多个数据。 变量定义&#xff1a;从内存中申请一段空间&#xff0c;用来存储数据。 如果同一种类型的数据&#xff0c;每一个数据都定义一个变量&#xff0c;当机器对这些变量进行寻址的时候&#xff0…

【Neo4j】- 轻松入门图数据库

文章目录 前言-场景一、Neo4j概述二、软件安装部署1.软件下载2.软件部署3.软件使用4.语法学习 总结 前言-场景 这里用大家都了解的关系数据与图数据据库对比着说,更加方便大家理解图数据库的作用 图形数据库和关系数据库均存储信息并表示数据之间的关系。但是&#xff0c;关系…

Aspose.PDF功能演示:使用 JavaScript 从 PDF 中提取文本

在数据提取、业务文档自动化和文本挖掘方面&#xff0c;使用 JavaScript 从PDF中提取文本非常有用。它允许开发人员自动执行从 PDF 收集信息的过程&#xff0c;从而显著提高处理大量文档的生产力和效率。在这篇博文中&#xff0c;我们将学习如何使用 JavaScript 从 PDF 中提取文…

功能安全实战系列-软件FEMA分析与组件鉴定

本文框架 前言1. 功能安全分析1.1 Why1.2 What?1.3 How?1.3.1 分析范围确定1.3.2 失效模式分析1.3.3 安全措施制定1.3.4 确认是否满足功能安全目标2. 软件组件鉴定2.1 Why2.2 How?前言 在本系列笔者将结合工作中对功能安全实战部分的开发经验进一步介绍常用,包括Memory(Fl…

stable diffusion 大模型及lora等下载安装使用教程及项目目录说明

首先说明&#xff0c;stable diffusion大模型并非controlNet中使用的模型&#xff0c;这两者有根本的区别&#xff0c;请仔细区分。 国内可下载模型的站点&#xff1a; 哩布哩布 https://liblib.ai 模型分为几类&#xff0c;下载的时候看清楚类型&#xff0c;都会标记在模型…

Python编程探索:从基础语法到循环结构实践(下)

文章目录 前言&#x1f377;四、 字符串拼接&#xff1a;连接多个字符串&#x1f378;4.1 使用 操作符进行字符串拼接&#x1f378;4.2 使用 join() 方法进行字符串拼接&#x1f378;4.3 使用 format() 方法进行格式化拼接&#x1f378;4.4 使用 f-string&#xff08;格式化字…

【Linux】进程池

目录 进程池 进程池的概念&#xff1a; 手搓进程池&#xff1a; 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念&#xff1a; 定义一个池子&#xff0c;在里面放上固定数量的进程&#xff0c;有需求来了&#xff0c;就拿一个池中…

Linux fork函数

目录 0.前言 1.fork函数初识 2.写时拷贝 3.fork常规用法 4.fork调用失败的原因 5.小结 &#xff08;图像《分叉之光&#xff1a;科幻视角下的Linux进程复制》由AI生成&#xff09; 0.前言 在Linux操作系统中&#xff0c;进程是系统资源管理的核心单元。每一个程序的执行都对…

机器学习(MachineLearning)(8)——模型评估与优化

机器学习&#xff08;MachineLearning&#xff09;&#xff08;1&#xff09;——机器学习概述 机器学习&#xff08;MachineLearning&#xff09;&#xff08;2&#xff09;——线性回归 机器学习&#xff08;MachineLearning&#xff09;&#xff08;3&#xff09;——决策树…

Java网络编程-简单的API调用

Get请求 - 无参数 安装依赖库 首先需要安装一个库&#xff1a; Okhttp3&#xff0c;这是一个非常流行的 HTTP 库&#xff0c;可以简单、快速的实现 HTTP 调用。 安装 Okhttp3 的方式是在 pom.xml 文件中增加依赖&#xff1a; <!-- https://mvnrepository.com/artifact/co…

【Vue.js设计与实现】第三篇第9章:渲染器-简单Diff算法-阅读笔记

文章目录 9.1 减少 DOM 操作的性能开销9.2 DOM 复用与 key 的作用9.3 找到需要移动的元素9.4 如何移动元素9.5 添加新元素9.6 移除不存在的元素 系列目录&#xff1a;【Vue.js设计与实现】阅读笔记目录 当新旧vnode 的子节点都是一组节点时&#xff0c;为了以最小的性能…

PSPICE FOR TI笔记记录1

快捷放置器件 R旋转 连线 w,单击器件引脚方块部分 电压探测笔 创建仿真文件 Analysis Type 分析模式&#xff1a;比如时域分析&#xff0c;频域分析 Run To Time 仿真时长 Skip intial transient bias point calculation (跳过初始瞬态偏置点计算(SKIPBP))一定要勾选 编辑…

高级语言源程序转换为可执行目标文件

将高级语言源程序转换为可执行目标文件的过程通常包括以下几个主要步骤&#xff1a; ​ 1. 预处理&#xff08;Preprocessing&#xff09;&#xff1a; 由谁完成预处理器&#xff08;cpp&#xff09;操作处理源代码中的预处理指令&#xff08;如宏定义、文件包含、条件编译等&…

k8s 1.28.2 集群部署 harbor v2.11.1 接入 MinIO 对象存储

文章目录 [toc]提前准备什么是 HarborHarbor 架构描述Harbor 安装的先决条件硬件资源软件依赖端口依赖 Harbor 在 k8s 的高可用Harbor 部署Helm 编排YAML 编排创建 namespace导入镜像部署 Redis部署 PostgreSQL部署 Harbor core部署 Harbor trivy部署 Harbor jobservice部署 Ha…

《Sui区块链:重塑去中心化应用的新星与未来潜力》

目录 引言 一、Sui 1、 技术架构 2、 编程语言 3、Move起源 4、Move的几个关键点&#xff1a; 5、Move 智能合约编程语言 6、智能合约编程语言可以做什么 7、和其他编程语言有什么不同 8、 安全性 9、开发者体验 10、生态系统 11、 未来发展 总结 引言 在区块链技…