海康威视摄像机和录像机的监控与回放

文章目录

  • 海康威视摄像机和录像机的监控与回放
    • 1、海康威视监控设备简介
      • 1.1、摄像机二次开发
        • 1.1.1:协议选择
      • 1.2:web集成
      • 1.2:标准协议对接
        • 1.2.1:ffmpeg软件转流
        • 1.2.2:开源监控软件shinobi
        • 1.2.3:使用nginx的RTMP模块
          • 1:windows下实现rtsp流转rtmp和http协议的flv流媒体,实现vue播放
      • 1.3:海康SDK对接
        • 1.3.1:springboot集成SDK提供接口调用
    • 2、各种流媒体协议介绍
      • 2.1:流媒体协议介绍
        • 2.1.1:RTSP (实时流传输协议)
        • 2.1.2:RTMP (实时消息协议)
        • 2.1.3:FLV(Flash Video)
        • 2.1.4:HLS (HTTP Live Streaming)
      • 2.2:流媒体协议选择与适用场景
      • 2.3:推流和拉流
        • 2.3.1:推流
        • 2.3.2:拉流

海康威视摄像机和录像机的监控与回放

1、海康威视监控设备简介

由于我们项目需要引入监控,所有作为一个小白特此研究一下,将自己的实操分享发给大家。
海康的监控设备主要是摄像机(IPC)搭配录像机NVR可以实现对监控的预览、回放、布放、告警等功能。

海康威视本身提供了非常多的方式可以进行查看监控和回放
1、比如iVMS-4200客户端、直接在浏览器输入摄像机的ip、萤石云。
2、合作伙伴后台服务(付费的):实现标准协议rtsp、hls、http-flv、rtmp取流

海康威视设备搜索:搜素局域网内在线的摄像机设备
海康威视官网工具包

由于我们需要集成到自己的系统中所以需要二次开发后集成到自己的系统中 ,且不想出钱买海康的后台管理平台,所以自己实现。

1.1、摄像机二次开发

主要流程是提供前端支持的协议进行播放,主要包括前端解决方案和后端解决方案。
若只是播放,回放等功能可以使用海康提供的前端web demo和后端解决方案

1、前端web集成
2、后端集成方案

  • 2.1 标准协议对接(可实现预览,回放需自己存放数据)
  • 2.2 海康SDK对接(可调用sdk实现预览和调用录像机数据回放)
1.1.1:协议选择

**需求:**想要二次开发在自己的系统浏览器页面实现监控的播放需要集成播放插件。
**问题:**随着IE、Chrome、Edge等主流浏览器对flash播放插件的停止更新,目前二次开发时应该要摒弃rtmp协议,采用HLS、HTTP-FLV、WebRTC、WebSocket来传输直播视频流。(各种流媒体协议介绍参考第二章节)。浏览器原生不支持rtsp协议取流。
总结如下:

RTSP:浏览器原生不支持rtsp协议取流,需通过下载安装rtsp协议的取流插件实现视频取流业务
HTTP-FLV:在播放首屏、播放延迟方面表现较好。但不支持IOS safari
HLS:将浏览器缓存视频分片后播放,流畅性很好但存在3-4s左右的延时,且录像回放功能对存储要求高
RTMP:Adobe公司2021年已不再更新和分发Flash,不推荐浏览器视频播放采用此协议

前端的Video控件标签支持HLS协议播放,经测试确实支持m3u8的播放。主要支持,几种视频格式m3u8,ogg, mp4, webm。MPEG4 = 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件

协议选择:浏览器原生不支持rtsp协议取流,所以需要进行协议转换,比如选择HLS协议

1.2:web集成

海康开发平台web集成文档
在这里插入图片描述
方案中建议一个tab页只启动一个播放插件,暂没有尝试播放多个监控,待前端测试完成后补充该部分

1.2:标准协议对接

可以实现rtmp到flv、hls等协议转换

1.2.1:ffmpeg软件转流

1、安装ffmpeg: ffmpeg官网
2、使用命令转流
-hls_time 10 代表每个片段的时长10秒
-hls_list_size 决定保留的ts片段个数。0代表全部

ffmpeg -i "rtsp://用户名:密码@IP地址:554/Streaming/Channels/101" -c copy  -hls_time 10 -hls_list_size 0 -hls_flags delete_segments+program_date_time -f hls G:\\yd\\word\\ip\\output.m3u8

3、播放该G:\yd\word\ip\output.m3u8流媒体文件即可。比如使用ffmpeg自带的播放器ffplay或者vlc播放器

ffplay G:\\yd\\word\\ip\\output.m3u8


4、优化。生产上可能有多个监控,可以使用脚本实现批量转换

#!/bin/bash# 定义摄像头列表
CAMERAS=("rtsp://admin:yd@2024@192.168.2.64:554/Streaming/Channels/101""rtsp://admin:yd@2024@192.168.2.65:554/Streaming/Channels/101"# 添加更多摄像头
)# 输出目录
OUTPUT_DIR="G:\\yd\\word\\ip"# 保留片段数量
RETAIN_COUNT=36# 定期清理旧片段
cleanup_old_segments() {for i in "${!CAMERAS[@]}"; doCAM_ID=$((i + 1))M3U8_FILE="$OUTPUT_DIR/camera_$CAM_ID.m3u8"# 获取M3U8文件中的所有TS文件TS_FILES=$(grep -oP '#EXT-X-KEY:.*\n#EXTINF:[0-9.]+,\n(.*?)\n' $M3U8_FILE | cut -d'\n' -f3)# 删除多余的TS文件while [ $(echo "$TS_FILES" | wc -l) -gt $RETAIN_COUNT ]; doOLDEST_TS=$(echo "$TS_FILES" | head -n1)rm "$OUTPUT_DIR/$OLDEST_TS"TS_FILES=$(echo "$TS_FILES" | tail -n +2)done# 更新M3U8文件sed -i '/#EXT-X-ENDLIST/d' $M3U8_FILEecho "#EXT-X-ENDLIST" >> $M3U8_FILEdone
}# 启动FFmpeg进程
for i in "${!CAMERAS[@]}"; doCAM_ID=$((i + 1))OUTPUT_FILE="$OUTPUT_DIR/camera_$CAM_ID.m3u8"# 启动FFmpeg进程ffmpeg -i "${CAMERAS[$i]}" \-c copy -map 0:v:0 -map 0:a:0 -hls_time 10 -hls_list_size 5 \-hls_flags delete_segments+program_date_time \-f hls "$OUTPUT_FILE" &
done# 定期清理旧片段
cleanup_old_segments# 设置定时任务
(crontab -l ; echo "*/5 * * * * /path/to/cleanup_old_segments.sh") | crontab -
1.2.2:开源监控软件shinobi

shinobi官网
1、安装:支持docker安装

docker run -d  --name=shinobi1 --shm-size=2048m -p 8080:8080  registry.gitlab.com/shinobi-systems/shinobi:latest

首次登录管理员:http://ip:8080/super#
后续登录普通账号:http://ip:8080/

2、添加摄像头。每个摄像头默认会生成一个唯一ID
3、查看监控,复制stream流地址。查看监控时若无法播放,确保涉摄像头设置中的视频编码格式是H.264,海康有些会是H.265导致无法查看黑屏
在这里插入图片描述

利用shinobi可以播放rtsp流并可以将其转为m3u8的流。复制m3u8地址接口播放,下面是用vlc播放器播放的
在这里插入图片描述
4、缺点:其stream流的地址会变化,有时会导致前面的stream流失效无法查看监控内容。目前个人没有总结出让其stream流固定不变的方式,欢迎共享方案

1.2.3:使用nginx的RTMP模块

nginx默认不带RTMP模块的,需要下载和nginx源码一起自行编译。

1:windows下实现rtsp流转rtmp和http协议的flv流媒体,实现vue播放
  • 1、安裝nginx、ffmpeg
    下载nginx:下载链接: http://nginx-win.ecsds.eu/download/nginx 1.7.11.3 Gryphon.zip,下载完成后解压, 将解压后的目录去除空格
  • 2、下载/nginx-rtmp-module流媒体转换module,此module非默认的,需要额外下载: 下载地址https://github.com/arut/nginx-rtmp-module/
  • 3、下载后解压放到nginx-1.7.11.3-Gryphon目录下,并将包名改为nginx-rtmp-module

修改配置文件
nginx-win.conf配置如下

worker_processes 1;events {worker_connections 1024;
}rtmp {server {listen 1935;chunk_size 4096;application live {live on;hls on;hls_path "G:/yd/word/nginx-1.7.11.3-Gryphon/hls";  # 使用反斜杠或正斜杠hls_fragment 5s;}}
}http {server {listen 880;server_name localhost;location / {root /usr/share/nginx/html;index index.html index.htm;}location /hls/ {types {application/vnd.apple.mpegurl m3u8;video/MP2T ts;}add_header Cache-Control no-cache;alias "G:/yd/word/nginx-1.7.11.3-Gryphon/hls/";  # 使用反斜杠或正斜杠}}
}

4、启动和停止nginx
启动nginx:nginx -c conf/nginx-win.conf
停止:taskkill /f /t /im nginx.exe
在这里插入图片描述

4、安装ffmpeg实现推流到nginx
你可以使用FFmpeg或其他直播软件推送流到Nginx RTMP服务器:

ffmpeg -i "rtsp://admin:password@192.168.2.64:554/Streaming/Channels/101" -c copy -f flv rtmp://localhost:1935/live/test

在这里插入图片描述

5、获取flv流播放测试
在客户端,你可以使用VLC播放器或其他支持RTMP协议的播放器来观看直播:
vlc播放器测试
在这里插入图片描述
在这里插入图片描述

ffplay拉流播放测试:ffplay.exe rtmp://192.168.2.4:1935/live/test 说明推送到rtmp没问题
在这里插入图片描述

rtmp协议url: rtmp://192.168.2.4:1935/live/test
http协议url:http://localhost:880/hls/test.m3u8

总结:比shinobi有固定的url

1.3:海康SDK对接

海康硬件设备对接SDK
在这里插入图片描述
区分了不同的操作系统,里面有不同代码语言的demo。

1.3.1:springboot集成SDK提供接口调用

@RestController
@RequestMapping("/countryside/alarms")
public class HKSdkController implements Runnable {private final HCNetSDKServiceImpl hcNetSDKService = new HCNetSDKServiceImpl();private volatile boolean running = true;private Thread listenerThread;@Overridepublic void run() {while (running) {// 监听并处理报警数据Alarm.startAlarm();}}
//使用  @PostConstruct注解实现程序启动就监听摄像头的告警信息@PostConstructpublic void startAlarm() {listenerThread = new Thread(this);listenerThread.start();}@GetMapping(value = "/latest", produces = MediaType.APPLICATION_JSON_VALUE)@Operation(summary = "获取最新报警信息")@PermitAllpublic List<AlarmData> getLatestAlarms() {return AlarmDataHandler.getLatestAlarms();}private static final Map<String, Video> videoMap = new ConcurrentHashMap<>();@GetMapping("/realPlay")@PermitAllpublic String realPlay(@RequestParam("userID") int userID,@RequestParam("channelNo") int channelNo, @RequestParam("channelNo") int ipNo) {if (!hcNetSDKService.initializeSDK()) {return "初始化失败";}String ip = getIpFromChannelNo(ipNo);// 使用找到的IP地址进行连接String key = ip + ":" + channelNo;Video video = videoMap.get(key);if (video == null) {video = new Video(userID, channelNo, ip);videoMap.put(key, video);}video.startPreview();return "取流成功";}private String getIpFromChannelNo(int ipNo) {// 这里应该是从数据库或配置文件中获取IP地址// 示例:return "192.168.1." + channelNo;return "192.168.2.64"; // 假设所有摄像头都在同一网段}@PostMapping("/stopAlarm")@Operation(summary = "停止报警监听")@PermitAllpublic void stopAlarm() {running = false;if (listenerThread != null) {listenerThread.interrupt();}}
}

下面是service进行了HCNETSDK的初始化,类似于demo里client中的代码,其中的video是demo中的

public class HCNetSDKServiceImpl   {private static HCNetSDK hCNetSDK = null;private static PlayCtrl playControl = null;private static boolean isInitialized = false;public boolean initializeSDK() {if (!isInitialized) {if (!createSDKInstance()) {return false;}if (!createPlayInstance()) {return false;}if (osSelect.isLinux()) {loadComponentLibraries();}boolean initSuc = hCNetSDK.NET_DVR_Init();if (!initSuc) {return false;}setExceptionCallback();setLogFile();isInitialized = true;}return true;}public void cleanup() {if (isInitialized && hCNetSDK != null) {hCNetSDK.NET_DVR_Cleanup();isInitialized = false;}}public static HCNetSDK getHCNetSDK() {return hCNetSDK;}private boolean createSDKInstance() {if (hCNetSDK == null) {synchronized (HCNetSDK.class) {String strDllPath = "";try {if (osSelect.isWindows()) {strDllPath = "G:\\yd\\code\\gitlab\\crc-digital-countryside-cloud\\crc-module-countryside\\crc-module-countryside-biz\\src\\main\\resources\\META-INF\\lib\\HCNetSDK.dll";} else if (osSelect.isLinux()) {strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";}hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);} catch (Exception ex) {System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());return false;}}}return true;}private boolean createPlayInstance() {if (playControl == null) {synchronized (PlayCtrl.class) {String strPlayPath = "";try {if (osSelect.isWindows()) {strPlayPath = "G:\\yd\\code\\gitlab\\crc-digital-countryside-cloud\\crc-module-countryside\\crc-module-countryside-biz\\src\\main\\resources\\META-INF\\lib\\PlayCtrl.dll";} else if (osSelect.isLinux()) {strPlayPath = System.getProperty("user.dir") + "/lib/libPlayCtrl.so";}playControl = (PlayCtrl) Native.loadLibrary(strPlayPath, PlayCtrl.class);} catch (Exception ex) {System.out.println("loadLibrary: " + strPlayPath + " Error: " + ex.getMessage());return false;}}}return true;}private void loadComponentLibraries() {HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());ptrByteArray1.write();hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());ptrByteArray2.write();hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());String strPathCom = System.getProperty("user.dir") + "/lib/";HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());struComPath.write();hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());}private void setExceptionCallback() {FExceptionCallBack_Imp fExceptionCallBack = new FExceptionCallBack_Imp();Pointer pUser = null;if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) {System.out.println("设置异常消息回调失败");} else {System.out.println("设置异常消息回调成功");}}private void setLogFile() {hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false);}static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack {public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {System.out.println("异常事件类型:" + dwType);return;}}}

video核心代码

    private int userID;private int channelNo;private String ip;private HCNetSDKServiceImpl hCNetSDKService= new HCNetSDKServiceImpl();static FRealDataCallBack fRealDataCallBack;//预览回调函数实现public void startPreview() {if (userID == -1) {System.out.println("请先注册");return;}HCNetSDK hcNetSDK = hCNetSDKService.getHCNetSDK();HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();int lUserID = hcNetSDK.NET_DVR_Login_V30(ip, (short) 8000, "admin", "yd@2024..", m_strDeviceInfo);if ((lUserID == -1) || (lUserID == 0xFFFFFFFF)) {System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());return;}HCNetSDK.NET_DVR_PREVIEWINFO strClientInfo = new HCNetSDK.NET_DVR_PREVIEWINFO();strClientInfo.read();strClientInfo.hPlayWnd = 0;  // 窗口句柄,从回调取流不显示一般设置为空strClientInfo.lChannel = channelNo;  // 通道号strClientInfo.dwStreamType = 0;  // 0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推strClientInfo.dwLinkMode = 0;  // 连接方式:0- TCP方式strClientInfo.bBlocked = 1;strClientInfo.byProtoType = 0;strClientInfo.write();// 回调函数定义必须是全局的if (fRealDataCallBack == null) {fRealDataCallBack = new FRealDataCallBack();}// 开启预览lPlay = hcNetSDK.NET_DVR_RealPlay_V40(userID, strClientInfo, fRealDataCallBack, null);if (lPlay == -1) {int iErr = hcNetSDK.NET_DVR_GetLastError();System.out.println("取流失败: " + iErr);return;}System.out.println("取流成功");// 保存视频到文件        saveVideoToFile();String path = ".\\savevideo.mp4";Boolean bSaveVideo = hcNetSDK.NET_DVR_SaveRealData_V30(lPlay, 0x2, path);if (bSaveVideo == false) {int iErr = hcNetSDK.NET_DVR_GetLastError();System.out.println("NET_DVR_SaveRealData_V30 failed" + iErr);return;}System.out.println("NET_DVR_SaveRealData_V30 suss");try {Thread.sleep(10000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}Boolean bStopSaveVideo = hcNetSDK.NET_DVR_StopSaveRealData(lPlay);if (bStopSaveVideo == false) {int iErr = hCNetSDK.NET_DVR_GetLastError();System.out.println("NET_DVR_StopSaveRealData failed" + iErr);return;}System.out.println("NET_DVR_StopSaveRealData suss");if (lPlay >= 0) {if (hCNetSDK.NET_DVR_StopRealPlay(lPlay)) {System.out.println("停止预览成功");return;}}//sendVideoData(pBuffer, dwBufSize);}
在这里插入代码片

2、各种流媒体协议介绍

常见的流媒体协议包括RTSP、RTMP、HLS、FLV等,它们在不同的应用场景中提供了各自的优势和 特性。

2.1:流媒体协议介绍

在这里插入图片描述

2.1.1:RTSP (实时流传输协议)

RTSP(Real-Time Streaming Protocol)RTSP本身并不传送数据,而仅仅是是媒体播放器能控制多媒体流的传送,暂停播放,快进快退等。实际媒体数据的传输可以用RTP协议或其他专用协议。
RTSP以客户-服务器方式工作,它是一个应用层的多媒体播放控制协议。它和Http协议有些相似,但它不像Http,而是有状态的,而且可以在TCP和UDP上传输。

    默认端口554。

在这里插入图片描述

2.1.2:RTMP (实时消息协议)

RTMP(Real-Time Messaging Protocol)是Adobe开发的用于实时视频和音频流传输的协议。它最初是为Flash Video应用设计的,但现已被广泛用于各种直播和点播服务,如YouTube、Twitch等

2.1.3:FLV(Flash Video)

格式是一种面向Flash平台的流媒体格式。它被广泛用于Adobe Flash Player的内容播放,尤其在早期的互联网视频应用中非常流行。

2.1.4:HLS (HTTP Live Streaming)

HLS(HTTP Live Streaming)是一种通过标准HTTP协议动态传输实时音视频流的技术。它将视频和音频分段并使用HTTP进行传输,使得在不同的网络环境下都能提供流畅、质量可适应的流媒体体验。
hls存储的是.ts格式的视频片段,可以使用http协议存储成m3u8格式的视频
在这里插入图片描述
m3u8文件是动态更新的,里面存放了各种的.ts格式的视频片段。获取播放的视频流并不是直接播放.m3u8文件本身,而是通过.m3u8文件来索引和播放一系列的TS(Transport Stream)视频片段。.m3u8文件是一个文本文件,它包含了指向这些视频片段的链接列表,以及可能的其他元数据(如带宽信息)。HLS播放器(如Hls.js)会首先下载.m3u8文件,然后根据文件中的列表逐个下载TS片段,并将它们拼接起来播放

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXTINF:10.000,
http://username:password@yourserver.com/path/to/segment0.ts
#EXTINF:10.000,
http://username:password@yourserver.com/path/to/segment1.ts
...

视频文件类型:.m3u8

2.2:流媒体协议选择与适用场景

在选择流媒体协议时,应考虑以下几个因素:

传输速度与稳定性:对于实时性要求高的场景,RTMP与RTSP可能更为合适。
平台支持:如果目标是跨平台应用,HLS因其基于HTTP的优势而更受欢迎。
压缩效率:FLV在Flash平台上的使用历史中表现出色,尤其在对压缩效率有较高要求的场景下。
版权保护与防盗链:HLS提供较好的版权保护机制,适合版权内容的分发。
流媒体协议的实现与设置
开发工具:对于开发者来说,使用如Python、Node.js、Java等通用编程语言搭配专门的流媒体框架(如FFmpeg、Nginx的RTMP模块)可以快速搭建流媒体服务。
在这里插入图片描述
其中的视频格式是支持的摄像机的视频编码格式,注意选择协议时进行摄像机的视频编码格式的设置

2.3:推流和拉流

在这里插入图片描述

2.3.1:推流

将直播的内容推送至服务器的过程,其实就是将现场的视频信号传到网络的过程。“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观众观看直播时就会发生卡顿等现象,观看体验很是糟糕。要想用于推流还必须把音视频数据使用传输协议进行封装,变成流数据。常用的流传输协议有 RTSP、RTMP、HLS 等,使用 RTMP 传输的延时通常在 1–3 秒,对于手机直播这种实时性要求非常高的场景,RTMP 也成为手机直播中最常用的流传输协议。最后通过一定的 QoS 算法将音视频流数据推送到网络端,并通过 CDN 进行分发。

2.3.2:拉流

拉流:指服务器已有直播内容,用指定地址进行拉取的过程。即是指服务器里面有流媒体视频文件,这些视频文件根据不同的网络协议类型(如 RTMP、RTSP、HTTP 等)被读取的过程,称之为拉流,我们日常观看视频和直播就是一个拉流的过程。

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

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

相关文章

黑神话悟空mac可以玩吗

黑神话悟空mac上能不能玩对于苹果玩家来说很重要&#xff0c;那么黑神话悟空mac可以玩吗&#xff1f;目前是玩不了了&#xff0c;没有针对ios系统的版本&#xff0c;只能之后在云平台上找找了&#xff0c;大家可以再观望下看看。 黑神话悟空mac可以玩吗 ‌使用CrossOver‌&…

【海康威视面经】

海康威视面经 Java基础java常用集合 及其优缺点ArrayListVectorLinkedList Jvm调优监控发现问题工具分析问题 &#xff1a;性能调优GC频繁 出现内存泄漏 内存溢出CPU飙升 Synchronized和Volatile的比较反射线程池和new thread利弊高并发 集群 分布式 负载均衡 MySQL调优基础优化…

neo4j安装启动教程+对应的jdk配置

参考这位博主的视频教程&#xff1a;neo4j社区windows版下载 一、官网下载neo4j的安装包 &#xff08;1&#xff09;官网下载页面 &#xff08;2&#xff09;上一步 【download】之后&#xff0c;会自动下载&#xff0c;如果没有&#xff0c;点击【here】 这里可以看到一行字…

Gradio 自定义组件

如何使用 Gradio 自定义组件&#xff0c;Gradio 前端使用 Svelte&#xff0c;后端使用的 Python。如何自定义一个组件呢&#xff1f;Gadio 提供了类似于脚手架的命令&#xff0c;可以生成需要开发组件的前后和后端代码。 创建组件 运行如下命令&#xff0c;gradio 会自动生成…

[2025]基于微信小程序慢性呼吸系统疾病的健康管理(源码+文档+解答)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

开放标准如何破解企业数字化与可持续发展的困境:The Open Group引领生态系统架构创新

应对数字化与可持续发展的双重挑战&#xff0c;开放标准是关键 在当今快速变化的商业环境中&#xff0c;企业不仅需要通过数字化转型提升竞争力&#xff0c;还面临日益严格的可持续发展要求。开放标准正在成为企业破解这一双重挑战的核心工具。The Open Group 2024生态系统架构…

【MySQL】了解并操作MySQL的缓存配置与信息

目录 一、查看缓存配置 二、查看缓存信息 查询MySQL的缓存相关信息&#xff0c;一般我们用两个命令&#xff1a; show variables like %query_cache%; show status like %qcache%; 一、查看缓存配置 查看缓存配置的相关的系统变量变量&#xff0c;返回给我们服务器缓存的配置…

【SQL】百题计划:SQL内置函数“LENGTH“的使用

【SQL】百题计划-20240912 方法一&#xff1a; Select tweet_id from Tweets where LENGTH(content) > 15;– 方法二&#xff1a; Select tweet_id from Tweets where CHAR_LENGTH(content)> 15;

WordPress建站钩子函数及使用

目录 前言&#xff1a; 使用场景&#xff1a; 一、常用的wordpress钩子&#xff08;动作钩子、过滤器钩子&#xff09; 1、动作钩子&#xff08;Action Hooks&#xff09; 2、过滤器钩子&#xff08;Filter Hooks&#xff09; 二、常用钩子示例 1、添加自定义 CSS 和 JS…

HTB-Vaccine(suid提权、sqlmap、john2zip)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天来为大家讲解Vaccine靶机 渗透过程 信息搜集 服务器开放了 21FTP服务、22SSH服务、80HTTP服务 通过匿名登录FTP服务器 通过匿名登录到服务器&#xff0c;发现backup.zip文件&#xff0c;可能存在账号密码 发现b…

硬件工程师笔试面试——滤波器

目录 12、滤波器 12.1 基础 滤波器原理图 滤波器实物图 12.1.1 概念 12.1.2 滤波器的分类 12.1.3 滤波器的工作原理 12.1.4 滤波器的应用 12.1.5 滤波器设计的关键参数 12.2 相关问题 12.2.1 不同类型的滤波器在实际应用中的具体作用是什么? 12.2.2 如何设计一个简…

ABAP-Logger ABAP 日志记录与任何其他语言一样轻松

ABAP-Logger ABAP 日志记录与任何其他语言一样轻松 ABAP Logger SAP Logging as painless as any other language. ABAP Version: 702 or higher See the mission statement Features Record message in Application Log(BC-SRV-BAL)Display message Installation Insta…

记忆化搜索

目录 引言&#xff1a; 1. 什么是记忆化搜索&#xff1f; 2. 如何实现记忆化搜索&#xff1f; 一、斐波那契数 1. 题目链接&#xff1a;509. 斐波那契数 2. 题目描述&#xff1a; 3. 解法&#xff08;暴搜 -> 记忆化搜索 -> 动态规划&#xff09;&#xff1a; &am…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题六

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

涛思数据库安装和卸载

安装 cd opt/taos/TDengine-server-2.4.0.5 sudo ./install.sh 启动taos​ 安装后&#xff0c;请使用 systemctl 命令来启动 TDengine 的服务进程 systemctl start taosd检查服务是否正常工作&#xff1a; systemctl status taosd 升级 3.0 版在之前版本的基础上&#x…

使用 SpringBoot 基础web开发的支持

首先导入项目相关的依赖&#xff1a; pom.xml 文件&#xff1a; 导入相关项目依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-in…

Git使用—把当前仓库的一个分支push到另一个仓库的指定分支、基于当前仓库创建另一个仓库的分支并推送到对应仓库(mit6828)

把学习过程中遇到的Git问题汇总如下&#xff08;后续学习遇到问题会及时更新此专栏&#xff09;&#xff1a; Git原理及常用命令小结——实用版&#xff08;ing......&#xff09;、Git设置用户名邮箱-CSDN博客 解决git每次push代码到github都需要输入用户名以及密码-CSDN博客…

硬件工程师笔试面试——变压器

目录 9、变压器 9.1 基础 变压器原理图 变压器实物图 9.1.1 概念 9.1.2 变压器组成结构 9.1.3 变压器原理 9.1.4 变压器的类型 9.1.5 应用领域 9.2 相关问题 9.2.1 变压器的工作原理是什么? 9.2.2 如何选择合适的变压器类型? 9.2.3 变压器在实际应用中,如何进行…

9.18 C++对C的扩充

使用cout实现输出斐波那契前20项的值 #include <iostream>using namespace std;int main() {int n11,n21,n3;cout << n1 <<" "<< n2<<" ";for(int i0;i<18;i){n3n1n2;cout<<n3<<" " ;n1n2;n2n3;}…

算法备案究竟是自己做还是找专业机构?

算法备案究竟是自己做还是找专业机构&#xff1f; 在深入了解算法备案申报要求和规则的基础上&#xff0c;企业可以选择自行完成备案。然而&#xff0c;如果缺乏相关知识和经验&#xff0c;申报材料可能会反复出错&#xff0c;导致被驳回&#xff0c;增加试错的时间成本&#x…