rk3568 适配摄像头 (双摄)

news2024/10/6 6:00:27

rk3568 适配摄像头 (mipi 双摄)

rk3568 适配双摄像其实就是逐个适配单摄像头,只是两颗摄像头的数据总线可能不同(cif+mipi),也可能相同(mipi(2lane) x 2)。几乎相同的上电时许,不同的时钟信号和总线协议决定加载过程会略有不同。
CSI-modes


提示:rk3568 双摄像头组合方式:cif+ mipi 和 mipi x 2。

文章目录

  • rk3568 适配摄像头 (mipi 双摄)
  • 圈重点 看想学
  • 1. 核查硬件,匹配摄像头
    • 1.1 内核设备树(CIF + MIPI)
    • 1.2 内核设备树(MIPI 双摄像)
  • 2 摄像头适配HAL3
    • 2.1 匹配 camera3_profiles.xml
    • 2.2 匹配摄像头标定 xxx.jason
    • 2.3 手动抓取摄像头信号
  • Tips
  • 总结


圈重点 看想学

a) 适配双摄像头
b) 双摄像头链接


1. 核查硬件,匹配摄像头

原理图核对硬件供电(vcc_2v8、vdd_1v8、vdd_1v2),时钟频率、reset、pwdn、power等控制信号,以及总线数据(i2c、mipi、cif)。逻辑分析仪只能抓取逻辑电平无法确认信号幅度和信号质量,必要时要用示波器抓取。

1.1 内核设备树(CIF + MIPI)

设配CIF+MIPI的双摄像头时,CIF占用cif编码,MIPI占用rkisp。此时mipi可使用1-4lane信号,须注意它要使用csi2_dphy0。

mipi
cif
rkisp_vir0
rkcif_dvp_sditf
os04a10
csi2_dphy0
GC2154
rkcif_dvp
rk3568

双摄像头适配时,先硬件后软件。硬件核对供电 vcc_1v8、vcc_1v2、vcc_2v8以i2c和总线信号;软件则是依次核查时钟信号、reset、pwdn、power等控制电平,驱动加载过程以及media/video拓扑树。摄像头(CIF协议)需要参照手册设定与之匹配总线数据宽度,以及cif总线众多GPIO复用。

/ {
	vcc_camera: vcc-camera-regulator {
		compatible = "regulator-fixed";
		gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
		pinctrl-names = "default";
		pinctrl-0 = <&camera_pwr>;
		regulator-name = "vcc_camera";
		enable-active-high;
		regulator-always-on;
		regulator-boot-on;
	};
};

&i2c4 {
	status = "okay";

	os04a10: os04a10@36 {
		compatible = "ovti,os04a10";
		reg = <0x36>;
		clocks = <&cru CLK_CIF_OUT>;
		clock-names = "xvclk";
		power-domains = <&power RK3568_PD_VI>;
		pinctrl-names = "default";
		pinctrl-0 = <&cif_clk>;
		reset-gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_LOW>;
		pwdn-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "CMK-OT1607-FV1";
		rockchip,camera-module-lens-name = "M12-40IRC-4MP-F16";
		port {
			ucam_out0: endpoint {
				remote-endpoint = <&mipi_in_ucam0>;
				data-lanes = <1 2 3 4>;
			};
		};
	};

	/*
	 * gc2145 needs to be disabled,
	 * when gmac1 is enabled;
	 * pinctrl conflicts;
	 */
	gc2145: gc2145@3c {
		compatible = "galaxycore,gc2145";
		reg = <0x3c>;
		clocks = <&cru CLK_CIF_OUT>;
		clock-names = "xvclk";
		power-domains = <&power RK3568_PD_VI>;
		pinctrl-names = "default";
		/* conflict with gmac1m1_rgmii_pins & cif_clk*/
		pinctrl-0 = <&cif_clk &cif_dvp_clk &cif_dvp_bus16>;

		/*avdd-supply = <&vcc2v8_dvp>;*/
		/*dovdd-supply = <&vcc1v8_dvp>;*/
		/*dvdd-supply = <&vcc1v8_dvp>;*/

		reset-gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_LOW>;
		pwdn-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "CameraKing";
		rockchip,camera-module-lens-name = "Largan";
		port {
			gc2145_out: endpoint {
				remote-endpoint = <&dvp_in_bcam>;
			};
		};
	};
};

&csi2_dphy_hw {
	status = "okay";
};

&csi2_dphy0 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_in_ucam0: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&ucam_out0>;
				data-lanes = <1 2 3 4>;
			};
		};
		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			csidphy_out: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&isp0_in>;
			};
		};
	};
};

&pinctrl {
	cam {
		camera_pwr: camera-pwr {
			rockchip,pins =
				/* camera power en */
				<0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};
};

&rkisp {
	status = "okay";
};

&rkisp_mmu {
	status = "okay";
};

&rkisp_vir0 {
	status = "okay";

	port {
		#address-cells = <1>;
		#size-cells = <0>;

		isp0_in: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&csidphy_out>;
		};
	};
};

&rkcif {
	status = "okay";
};

&rkcif_dvp {
	status = "okay";

	port {
		/* Parallel bus endpoint */
		dvp_in_bcam: endpoint {
			remote-endpoint = <&gc2145_out>;
			bus-width = <8>;
			vsync-active = <0>;
			hsync-active = <1>;
		};
	};
};

&rkcif_mmu {
	status = "okay";
};

&rkcif_dvp_sditf {
	status = "okay";
};

1.2 内核设备树(MIPI 双摄像)

rk3568双摄像头所用mipi信号为拆分模式,将mipi的4组信号拆分为2+2;信号线0、1使用 csi2_dph1,信号2、3使用csi2_dph2,内核启动过程需要分别对应摄像头进行初始化,但是总线使用同一组。

	/*
	 * csi2_dphy0: used for csi2 dphy full mode,
		       is mutually exclusive with
		       csi2_dphy1 and csi2_dphy2
	 * csi2_dphy1: used for csi2 dphy split mode,
		       physical lanes use lane0 and lane1,
		       can be used with csi2_dphy2  parallel
	 * csi2_dphy2: used for csi2 dphy split mode,
		       physical lanes use lane2 and lane3,
		       can be used with csi2_dphy1  parallel
	 */

设配设备树时,由于原生ISP只有一个mipi编码,其中一组则需要使用cif的进行编码。

mipi x 2line
mipi_csi2
mipi x 2line
mipi_csi2
ov5695
csi2_dphy1
rkisp_vir0
rk3568
gc5025
csi2_dphy2
rkcif_mipi_lvds

双摄像头适配时,先硬件后软件。硬件核对供电 vcc_1v8、vcc_1v2、vcc_2v8以i2c和mipi总线信号;软件则是依次核查时钟信号、reset、pwdn、power等控制电平,以及驱动加载过程和media/video拓扑树。此处不再赘述,直接看设备树。

&i2c2 {
	status = "okay";
	pinctrl-0 = <&i2c2m1_xfer>;

	/* split mode: lane0/1 */
	ov5695: ov5695@36 {
		status = "okay";
		compatible = "ovti,ov5695";
		reg = <0x36>;
		clocks = <&cru CLK_CIF_OUT>;
		clock-names = "xvclk";
		power-domains = <&power RK3568_PD_VI>;
		pinctrl-names = "default";
		pinctrl-0 = <&cif_clk>;
		reset-gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;
		pwdn-gpios = <&gpio4 RK_PB2 GPIO_ACTIVE_HIGH>;
		power-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "TongJu";
		rockchip,camera-module-lens-name = "CHT842-MD";
		port {
			ov5695_out: endpoint {
				remote-endpoint = <&dphy1_in>;
				data-lanes = <1 2>;
			};
		};
	};

	/* split mode: lane:2/3 */
	gc5025: gc5025@37 {
		status = "okay";
		compatible = "galaxycore,gc5025";
		reg = <0x37>;
		clocks = <&pmucru CLK_WIFI>;
		clock-names = "xvclk";
		pinctrl-names = "default";
		pinctrl-0 = <&refclk_pins>;
		reset-gpios = <&gpio3 RK_PA5 GPIO_ACTIVE_LOW>;
		pwdn-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
		power-domains = <&power RK3568_PD_VI>;
		power-gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
		rockchip,camera-module-index = <1>;
		rockchip,camera-module-facing = "front";
		rockchip,camera-module-name = "TongJu";
		rockchip,camera-module-lens-name = "CHT842-MD";
		port {
			gc5025_out: endpoint {
				remote-endpoint = <&dphy2_in>;
				data-lanes = <1 2>;
			};
		};
	};
};

&csi2_dphy1 {
	status = "okay";

	/*
	 * dphy1 only used for split mode,
	 * can be used  concurrently  with dphy2
	 * full mode and split mode are mutually exclusive
	 */
	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			dphy1_in: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&ov5695_out>;
				data-lanes = <1 2>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			dphy1_out: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&isp0_in>;
			};
		};
	};
};

&csi2_dphy2 {
	status = "okay";

	/*
	 * dphy2 only used for split mode,
	 * can be used  concurrently  with dphy1
	 * full mode and split mode are mutually exclusive
	 */
	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			dphy2_in: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&gc5025_out>;
				data-lanes = <1 2>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			dphy2_out: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&mipi_csi2_input>;
			};
		};
	};
};

&mipi_csi2 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_csi2_input: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&dphy2_out>;
				data-lanes = <1 2>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_csi2_output: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&cif_mipi_in>;
				data-lanes = <1 2>;
			};
		};
	};
};

&rkcif_mipi_lvds {
	status = "okay";

	port {
		cif_mipi_in: endpoint {
			remote-endpoint = <&mipi_csi2_output>;
			data-lanes = <1 2>;
		};
	};
};

&rkisp {
	status = "okay";
};

&rkisp_mmu {
	status = "okay";
};

&rkisp_vir0 {
	status = "okay";

	port {
		#address-cells = <1>;
		#size-cells = <0>;

		isp0_in: endpoint@0 {
			reg = <0>;
			remote-endpoint = <&dphy1_out>;
		};
		isp0_in_dphy0: endpoint@1 {
			reg = <1>;
			remote-endpoint = <&dphy0_out>;
		};
	};
};

核查v4l2视频流节点,可以发现 video0~4可证明驱动正常加载。

ls /dev/video*
/dev/video0   /dev/video11  /dev/video14  /dev/video17  /dev/video2   /dev/video22  /dev/video5  /dev/video8
/dev/video1   /dev/video12  /dev/video15  /dev/video18  /dev/video20  /dev/video3   /dev/video6  /dev/video9
/dev/video10  /dev/video13  /dev/video16  /dev/video19  /dev/video21  /dev/video4   /dev/video7

核查拓扑树,确认camera链路是否正常。如无法看到完整链路则需要重新调配设备树解码链路。

media-ctl -p -d /dev/media0

Opening media device /dev/media0
Enumerating entities
Found 9 entities
Enumerating pads and links
Media controller API version 0.0.193

Media device information
------------------------
driver          rkcif
model           rkcif_mipi_lvds
serial
bus info
hw revision     0x0
driver version  0.0.193

2 摄像头适配HAL3

驱动和ISP均匹配后可在系统查看到两颗摄像头,且每颗具体参数都有详细属性说明。如有不匹配系统无法正常识别。

dumpsys media.camera | head -n 20

== Service global info: ==

Number of camera devices: 2
Number of normal camera devices: 2
Number of public camera devices visible to API1: 2
    Device 0 maps to "0"
    Device 1 maps to "1"
Active Camera Clients:
[]
Allowed user IDs: 0

== Camera service events log (most recent at top): ==
  05-04 17:11:26 : USER_SWITCH previous allowed user IDs: <None>, current allowed user IDs: 0
  05-04 17:11:14 : ADD device 1, reason: (Device added)
  05-04 17:11:14 : ADD device 0, reason: (Device added)

== Camera device 0 dynamic info: ==
  Device 0 is closed, no client instance
== Camera device 1 dynamic info: ==
Failed to write while dumping service media.camera: Broken pipe

2.1 匹配 camera3_profiles.xml

Camera驱动需要与HAL3 的camera3_profiles.xml清单相互匹配。

DTSprofiles.xml
rockchip,camera-module-indexcameraId, moduleId
ockchip,camera-module-facinglens.facing value
	ov5695: ov5695@36 {
		...	
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
</Profiles>
        <Profiles cameraId="0" name="ov5695" moduleId="m00">
        <lens.facing value="BACK"/>

正确匹配后可

2.2 匹配摄像头标定 xxx.jason

rk3568 芯片ISP2.1版本,使用ISP2。所用标定摄像头效果文件路径/vendor/etc/camera/rkisp2,该文件名字与内核摄像头描述严格的匹配格式cameraName_moduleName_module_lens_name.json,如有差别就会无法匹配。
以 ov5695为例,内核设备树中定义相关属性,与之匹配标定效果文件为ov5695_TongJu_CHT842-MD.json

	ov5695: ov5695@36 {
		...	
		rockchip,camera-module-name = "TongJu";
		rockchip,camera-module-lens-name = "CHT842-MD";
cameraNamemoduleNamemodule_lens_namejson
ov5695: ov5695@36rockchip,camera-module-name = “TongJu”;rockchip,camera-module-lens-name = “CHT842-MD”;ov5695_TongJu_CHT842-MD.json

2.3 手动抓取摄像头信号

驱动正常加载,但是Camera2无法正常预览。可选择手动抓取原始视频流确定camera是否正常,这也是标定摄像头必要流程。

v4l2-ctl -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat=NV12 --stream-mmap=3 --stream-skip=3 --stream-to=/sdcard/cif.out --stream-count=100 --stream-poll

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.04 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.04 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.04 fps
<<<<<<<<<<<

Tips

  • rk3566 CIF_CLK 无信号输出
    DTS增加参数配置
	power-domains = <&power RK3568_PD_VI>;
  • i2c 返回错误码 -6
    此错误为 i2c总线无应答,产生原因较多。可先核查硬件供电和排线信号,再核查上电时许和时钟频率。
  • 双摄像头建议配置为前摄和后摄
    Camera2 默认通过控制前后摄切换对应摄像头,不支持多路同时显示。两颗设定为相同的摄像则无法正常预览、拍照和录像。
  • 重启 camera 快速命令
adb root
adb shell "pkill provider && pkill camera"
adb shell am start -n com.android.camera2/com.android.camera.CameraLauncher

总结

活学活用,做个合格的搬运工。

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

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

相关文章

CSDN周赛第49期 - 也谈马拉车

前言 C站的周赛已经很久没有新题了&#xff0c;已考过的题目我差不多都写过题解&#xff0c;若再重复写类似的文章&#xff0c;反而会降低博文质量分&#xff0c;而想要换个角度&#xff0c;却又难以找到动笔的欲望。所以虽然比赛发生在五一假期之前&#xff0c;但直到现在五一…

camunda升级事件的用途

在Camunda中&#xff0c;升级事件&#xff08;Escalation Event&#xff09;是一种可以在工作流中出现异常情况时触发相应操作的事件类型。使用升级事件可以帮助工作流更加灵活地处理异常情况&#xff0c;以确保工作流的正常运行。 使用升级事件可以处理以下情况&#xff1a; …

【Java EE 初阶】如何保证线程安全

目录 1.线程是什么&#xff1f; 2.线程安全&#xff08;重点&#xff09; 1.概念&#xff1a; 1.举例&#xff1a;用两个线程分别对同一个变量做五万次自增&#xff0c;观察答案是否符合预期 那么是哪些原因造成了这种线程不安全的现象呢&#xff1f;我们一起来分析一下&am…

搭建Plex媒体服务器,打造家庭多媒体中心【公网远程访问】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

MAC安装MySQL

安装MySQL 登录官网dev.mysql.com/downloads/m… 下载社区版mysql&#xff0c;选择dmg格式的安装包。下载完成后&#xff0c;开始安装。 注意&#xff1a;选择Use Legacy Password Encryption。 解决无法启动MySQL问题 打开设置中的mysql图标&#xff0c;发现红点&#xff0…

Syslog-ng RHEL 的安装和配置

syslog-ng 作为 syslog 的替代工具&#xff0c;可以完全替代 syslog 的服务&#xff0c;并且通过定义规则&#xff0c;实现更好的过滤功能。 作为运维来说一个好的日志工具比什么都重要。 通常我们会管理不同的服务器&#xff0c;因此我们需要把日志集中一下以便于快速查找。…

GUI编程(二)

Swing Swing是GUI&#xff08;图形用户界面&#xff09;开发工具包。 早期的AWT&#xff08;抽象窗口工具包&#xff09;组件开发的图形用户界面&#xff0c;要依赖本地系统&#xff0c;当把AWT组件开发的应用程序移植到其他平台的系统上运行时&#xff0c;不能保证其外观风格…

贪心刷题~

1、洛谷P2240 【深基12.例1】部分背包问题 贪心策略&#xff1a;拿金币单价高的。 #include<iostream> #include<cstring> #include<algorithm> using namespace std;struct gold{int v;int m; } q[101];bool cmp(gold a,gold b){return a.v*b.m>b.v*a.m…

SpringCloud-微服务Eureka服务注册中心

微服务&服务注册中心 前言一、微服务1.什么是微服务2.单体架构和微服务架构2.1.单体架构2.2.微服务架构 二、服务注册中心1.服务注册中心简介2.Eureka服务注册中心2.1.Eureka Server开发2.2 Eureka Client开发 3.Eureka的自我保护机制3.1.Eureka自我保护机制简介3.2.Eureka…

MySQL数据库连接超时自动断开的解决方案

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

windows下msys2编译64位的ffmpeg源码

目前遇到过两次需求&#xff0c;需要编译ffmpeg源码。网上下载的编译好的源码里面可能不全&#xff0c;很多时候需要自行编译源码。本文介绍自行编译ffmpeg64位源码&#xff08;32位通过相似的方式为编译成功&#xff0c;不知道原因&#xff09; 环境&#xff1a; 2023.5.4下载…

团队密码管理器Passbolt的安装

老苏下载了吴恩达联手 OpenAI 推出的 Prompt for developer 课程&#xff0c;总长度大概在一个半小时左右&#xff0c;可以让我们学习正确的 ChatGPT Prompt 工程 虽然课程对话是英文&#xff0c;但有中文字幕&#xff0c;课程地址&#xff1a;https://www.aliyundrive.com/s/…

[Gitops--9]微服务项目sangomall代码配置修改及资源清单文件

微服务项目sangomall代码配置修改及资源清单文件 1. 中间件的地址 1.1 Nacos 集群外 nacos-server.intra.com 192.168.31.211集群内 nacos-server.sangomall.svc.cluster.local. nacos-server.sangomall.svc.cluster.local.:88481.2 Redis 集群内 redis.sangomall.svc.c…

ipad有必要用手写笔吗?电容笔和Apple pencil区别

与Apple Pencil最大的不同之处&#xff0c;在于普通的电容笔并不具备着重力压感&#xff0c;而是会给人一种倾斜的压感。如果不是频繁作画&#xff0c;那就用一支普通的电容笔。这种电容笔不但可以用于办公室&#xff0c;也可以用于记笔记、做练习。再说了&#xff0c;一支苹果…

深入理解 Linux 内核(二)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 深入理解 Linux 内核&#xff08;二&#xff09; Linux 设备驱动程序 Linux设备驱动开发详解 文章目录 系列文章目录五、定时测量1、时钟和定时器电路2、Linux 计时体系结构&#xff08;1&#xff09;计时体系机构的数据…

200G 400G光模块介绍

200G 光模块封装有2种&#xff0c;分别是QSFP56和QSFP-DD。 200G QSFP56有2种光模块&#xff0c;第一种是200G QSFP56 SR4&#xff0c;第二种是200G QSFP56 FR。 200G QSFP56 SR4的封装形式是QSFP56&#xff0c;速率是200G&#xff0c;波长是850nm&#xff0c;最远传输距离是10…

儿童书写台灯哪个牌子比较好?盘点护眼学生用台灯品牌排行

想要拥有一个健康的视力对于我们多么重要&#xff0c;日常生活多么不便利&#xff0c;就是像家里孩子考学时视力也是对于未来专业选择的一个阻碍。 想要孩子不吃近视的苦&#xff0c;从小就要开始抓孩子对于视力和眼睛的呵护。 养成好习惯必须保持一个正确的学习姿势&#xff…

redis 持久化 RDB + AOF

redis 持久化 RDB AOF 1.redis持久化----两种方式 RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09; RDB&#xff0c;简而言之&#xff0c;就是在不同的时间点&#xff0c;将redis存储的数据生成快照并存储到磁盘等介质上 AOF&am…

视频剪辑学习 pr 中视频

2023年中视频学习计划&#xff0c;学习资料全套视频。全网一手资料&#xff0c;有意者V&#xff1a; 第一章- 基础知识 第二章- 素材获取 第三章- 文案创作及搬运改写 第四章- 智能配音与自己配音修音 第五章- 剪辑基础快速入门 手机剪映零基础快速入门 电脑剪映零基础快速入门…

360SEO 360搜索引擎算法的基础知识

360搜索引擎是中国的一家互联网搜索引擎公司&#xff0c;由奇虎360公司推出。作为中国互联网领域的知名品牌之一&#xff0c;它的搜索算法一直备受关注和研究。那360搜索引擎有哪些算法的基础知识呢&#xff1f; 一、概述 360搜索引擎算法是一个非常庞大、复杂的系统&#xff…