From 8456b0bbb9d1536ebb0b2dc476be736bdd5fb82c Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期五, 13 十月 2023 15:58:20 +0800 Subject: [PATCH] 1. 流媒体增加通过接口配置软硬件解码 2. 流媒体自动同步相机设备。 --- ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java | 309 +++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 234 insertions(+), 75 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java index 3485345..e803ca0 100644 --- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java @@ -1,14 +1,20 @@ package com.ruoyi.device.hiksdk.service.impl; +import com.ruoyi.alarm.global.domain.GuidePriorityQueue; +import com.ruoyi.alarm.global.domain.GuideTask; import com.ruoyi.common.annotation.SdkOperate; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.file.MimeTypeUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.service.IArdCamerasService; import com.ruoyi.device.channel.domain.ArdChannel; +import com.ruoyi.device.channel.service.IArdChannelService; import com.ruoyi.device.hiksdk.common.GlobalVariable; import com.ruoyi.device.camera.domain.ArdCameras; +import com.ruoyi.media.domain.Vtdu; +import com.ruoyi.media.service.IVtduService; import com.ruoyi.utils.gis.GisUtil; import com.ruoyi.device.hiksdk.sdk.HCNetSDK; import com.ruoyi.device.hiksdk.service.IHikClientService; @@ -30,6 +36,7 @@ import java.nio.ByteBuffer; import java.text.DecimalFormat; import java.util.*; +import java.util.concurrent.PriorityBlockingQueue; import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.*; @@ -44,10 +51,12 @@ @Service public class HikClientServiceImpl implements IHikClientService { - @Value("${minio.endpoint}") - private static String endpoint; @Resource private IArdCamerasService ardCamerasService; + @Resource + private IArdChannelService ardChannelService; + @Resource + private IVtduService vtduService; private static HCNetSDK hCNetSDK; @@ -92,6 +101,7 @@ } } + @Override /** * @鎻忚堪 娉ㄥ唽鐧诲綍 鍙敮鎸佸悓姝ョ櫥闄嗭紝涓斿畼鏂逛笉寤鸿鐩存帴鍦ㄦ鎺ュ彛涓嬪啓鑰楁椂鎿嶄綔 * @鍙傛暟 [dvrLogin] @@ -100,14 +110,13 @@ * @鍒涘缓鏃堕棿 2023/1/17 16:12 * @淇敼浜哄拰鍏跺畠淇℃伅 */ - public ArdCameras login1(ArdCameras camera) { + public void syncLogin(ArdCameras camera) { // 鍒濆鍖� if (!hCNetSDK.NET_DVR_Init()) { log.error("SDK鍒濆鍖栧け璐�"); } //鎵撳嵃娴峰悍sdk鏃ュ織 if (Platform.isWindows()) { - String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator; hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true); } else { @@ -121,18 +130,84 @@ hCNetSDK.NET_DVR_SetConnectTime(2000, 1); hCNetSDK.NET_DVR_SetReconnect(100000, true); //璁惧淇℃伅, 杈撳嚭鍙傛暟 - NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new NET_DVR_DEVICEINFO_V30(); - int lUserID = hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP, m_sPort, m_sUsername, m_sPassword, m_strDeviceInfo); + HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40(); + HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO(); + + // 娉ㄥ唽璁惧-鐧诲綍鍙傛暟锛屽寘鎷澶囧湴鍧�銆佺櫥褰曠敤鎴枫�佸瘑鐮佺瓑 + m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; + System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); + m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; + System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); + m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; + System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); + m_strLoginInfo.wPort = m_sPort; + m_strLoginInfo.byVerifyMode = 0; + m_strLoginInfo.byLoginMode = 0; + //鏄惁寮傛鐧诲綍锛�0- 鍚︼紝1- 鏄� windowsSDK閲屾槸true鍜宖alse + m_strLoginInfo.bUseAsynLogin = false; + m_strLoginInfo.write(); + //鍚屾鐧诲綍 + int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); if (lUserID < 0) { - //閲婃斁SDK璧勬簮 - hCNetSDK.NET_DVR_Cleanup(); + int errorCode = hCNetSDK.NET_DVR_GetLastError(); + log.error("鐧诲綍寮傚父锛�" + errorCode); + + log.debug(camera.getIp() + ":" + camera.getPort() + "鐧诲綍澶辫触"); + camera.setChanNum(0); camera.setLoginId(-1); + camera.setState("0"); + } else { + + if (GlobalVariable.loginMap.containsKey(camera.getId())) { + GlobalVariable.loginMap.remove(camera.getId()); + } + //鍒犻櫎绠$悊閫氶亾 + ardChannelService.deleteArdChannelByDeviceId(camera.getId()); + GlobalVariable.loginMap.put(camera.getId(), lUserID); + log.debug(camera.getIp() + ":" + camera.getPort() + "鐧诲綍鎴愬姛"); + + camera.setLoginId(lUserID); + camera.setState("1"); + camera.setChanNum((int) m_strDeviceInfo.struDeviceV30.byChanNum); + camera.setStartDChan((int) m_strDeviceInfo.struDeviceV30.byStartDChan); + //鑾峰彇鏈�鏂伴�氶亾 + List<ArdChannel> cameraChannelList = getCameraChannelList(camera); + if (cameraChannelList.size() > 0) { + for (ArdChannel channel : cameraChannelList) { + channel.setId(IdUtils.simpleUUID()); + ardChannelService.insertArdChannel(channel); + } + //娣诲姞鍒版祦濯掍綋 + for (ArdChannel channel : cameraChannelList) { + String name = camera.getId() + "_" + channel.getChanNo(); + String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream"; + Vtdu vtdu = vtduService.selectVtduByName(name); + if (vtdu == null) { + //娣诲姞鍒版祦濯掍綋 + vtdu = new Vtdu(); + vtdu.setRtspSource(rtspSource); + vtdu.setName(camera.getId() + "_" + channel.getChanNo()); + vtdu.setIsCode("0");//榛樿涓嶈浆鐮� + vtdu.setMode("1");//榛樿CPU杞В鐮� + vtdu.setCameraId(camera.getId()); + vtduService.insertVtdu(vtdu); + } else { + if (!rtspSource.equals(vtdu.getRtspSource())) { + //鏇存柊rtsp鍦板潃 + vtdu.setRtspSource(rtspSource); + vtduService.updateVtdu(vtdu); + } + } + } + } + //鍒涘缓寮曞闃熷垪 + if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) { + Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator(); + PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator); + GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue); + } + ardCamerasService.updateArdCameras(camera); } - GlobalVariable.loginMap.remove(camera.getId()); - GlobalVariable.loginMap.put(camera.getId(), lUserID); - camera.setLoginId(lUserID); - camera.setStartDChan((int) m_strDeviceInfo.byStartChan); - return camera; } /** @@ -144,7 +219,7 @@ * @淇敼浜哄拰鍏跺畠淇℃伅 */ @Override - public void login(ArdCameras camera) { + public void asyncLogin(ArdCameras camera) { // 鍒濆鍖� if (!hCNetSDK.NET_DVR_Init()) { log.error("SDK鍒濆鍖栧け璐�"); @@ -187,6 +262,7 @@ int errorCode = hCNetSDK.NET_DVR_GetLastError(); log.error("鐧诲綍寮傚父锛�" + errorCode); } + } /** @@ -204,7 +280,8 @@ List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(new ArdCameras()); for (ArdCameras camera : ardCameras) { Thread.sleep(500); - login(camera); + //寮傛鐧诲綍 + asyncLogin(camera); } } catch (Exception ex) { log.error("鍒濆鍖栫櫥褰曠浉鏈哄紓甯革細" + ex.getMessage()); @@ -239,12 +316,17 @@ */ @Override public boolean isOnLine(CameraCmd cmd) { - String cameraId = cmd.getCameraId(); - if (!GlobalVariable.loginMap.containsKey(cameraId)) { + try { + String cameraId = cmd.getCameraId(); + if (!GlobalVariable.loginMap.containsKey(cameraId)) { + return false; + } + Integer userId = GlobalVariable.loginMap.get(cameraId); + return hCNetSDK.NET_DVR_RemoteControl(userId, NET_DVR_CHECK_USER_STATUS, null, 0); + } catch (Exception ex) { + log.error("妫�娴嬪湪绾垮紓甯革細" + ex.getMessage()); return false; } - Integer userId = GlobalVariable.loginMap.get(cameraId); - return hCNetSDK.NET_DVR_RemoteControl(userId, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0); } /** @@ -466,7 +548,7 @@ * @淇敼浜哄拰鍏跺畠淇℃伅 */ @Override - public Map<String,String> getVideoCompressionCfg(CameraCmd cmd) { + public Map<String, String> getVideoCompressionCfg(CameraCmd cmd) { String cameraId = cmd.getCameraId(); Integer chanNo = cmd.getChanNo(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { @@ -474,7 +556,7 @@ } Integer userId = GlobalVariable.loginMap.get(cameraId); - Map<String,String> map=new HashMap<>(); + Map<String, String> map = new HashMap<>(); NET_DVR_COMPRESSIONCFG_V30 compressioncfg = new NET_DVR_COMPRESSIONCFG_V30(); compressioncfg.write(); Pointer pioint = compressioncfg.getPointer(); @@ -484,62 +566,139 @@ if (bool) { compressioncfg.read(); //鐮佹祦绫诲瀷锛�0-瑙嗛娴侊紝1-澶嶅悎娴侊紝0xfe- 鑷姩锛堝拰婧愪竴鑷达級 - String streamType=""; - switch(compressioncfg.struNormHighRecordPara.byStreamType) - { - case 0: streamType="瑙嗛娴�";break; - case 1: streamType="澶嶅悎娴�";break; - default:streamType="鏈煡";break; + String streamType = ""; + switch (compressioncfg.struNormHighRecordPara.byStreamType) { + case 0: + streamType = "瑙嗛娴�"; + break; + case 1: + streamType = "澶嶅悎娴�"; + break; + default: + streamType = "鏈煡"; + break; } //瑙嗛缂栫爜绫诲瀷锛�0-绉佹湁264锛�1-鏍囧噯h264锛�2-鏍囧噯mpeg4锛�7-M-JPEG锛�8-MPEG2锛�9-SVAC锛�10-鏍囧噯h265锛�0xfe- 鑷姩锛堝拰婧愪竴鑷达級锛�0xff-鏃犳晥 - String videoEncType=""; - switch (compressioncfg.struNormHighRecordPara.byVideoEncType) - { - case 0:videoEncType="绉佹湁264";break; - case 1:videoEncType="鏍囧噯h264";break; - case 2:videoEncType="鏍囧噯mpeg4";break; - case 7:videoEncType="M-JPEG";break; - case 8:videoEncType="MPEG2";break; - case 9:videoEncType="SVAC";break; - case 10:videoEncType="鏍囧噯h265";break; - default: videoEncType="鏈煡";break; + String videoEncType = ""; + switch (compressioncfg.struNormHighRecordPara.byVideoEncType) { + case 0: + videoEncType = "绉佹湁264"; + break; + case 1: + videoEncType = "鏍囧噯h264"; + break; + case 2: + videoEncType = "鏍囧噯mpeg4"; + break; + case 7: + videoEncType = "M-JPEG"; + break; + case 8: + videoEncType = "MPEG2"; + break; + case 9: + videoEncType = "SVAC"; + break; + case 10: + videoEncType = "鏍囧噯h265"; + break; + default: + videoEncType = "鏈煡"; + break; } //瑙嗛鐮佺巼 - String videoBitrate=""; - switch (compressioncfg.struNormHighRecordPara.dwVideoBitrate) - { - case 0:videoBitrate="淇濈暀";break; - case 1:videoBitrate="16K(淇濈暀)";break; - case 2:videoBitrate="32K";break; - case 3:videoBitrate="48k";break; - case 4:videoBitrate="64k";break; - case 5:videoBitrate="80k";break; - case 6:videoBitrate="96k";break; - case 7:videoBitrate="128k";break; - case 8:videoBitrate="160k";break; - case 9:videoBitrate="192k";break; - case 10:videoBitrate="224k";break; - case 11:videoBitrate="256K";break; - case 12:videoBitrate="320K";break; - case 13:videoBitrate="384K";break; - case 14:videoBitrate="448K";break; - case 15:videoBitrate="512K";break; - case 16:videoBitrate="640K";break; - case 17:videoBitrate="768K";break; - case 18:videoBitrate="896K";break; - case 19:videoBitrate="1024K";break; - case 20:videoBitrate="1280K";break; - case 21:videoBitrate="1536K";break; - case 22:videoBitrate="1792K";break; - case 23:videoBitrate="2048K";break; - case 24:videoBitrate="3072K";break; - case 25:videoBitrate="4096K";break; - case 26:videoBitrate="8192K";break; - case 27:videoBitrate="16384K";break; - default:videoBitrate="鍏朵粬";break; + String videoBitrate = ""; + switch (compressioncfg.struNormHighRecordPara.dwVideoBitrate) { + case 0: + videoBitrate = "淇濈暀"; + break; + case 1: + videoBitrate = "16K(淇濈暀)"; + break; + case 2: + videoBitrate = "32K"; + break; + case 3: + videoBitrate = "48k"; + break; + case 4: + videoBitrate = "64k"; + break; + case 5: + videoBitrate = "80k"; + break; + case 6: + videoBitrate = "96k"; + break; + case 7: + videoBitrate = "128k"; + break; + case 8: + videoBitrate = "160k"; + break; + case 9: + videoBitrate = "192k"; + break; + case 10: + videoBitrate = "224k"; + break; + case 11: + videoBitrate = "256K"; + break; + case 12: + videoBitrate = "320K"; + break; + case 13: + videoBitrate = "384K"; + break; + case 14: + videoBitrate = "448K"; + break; + case 15: + videoBitrate = "512K"; + break; + case 16: + videoBitrate = "640K"; + break; + case 17: + videoBitrate = "768K"; + break; + case 18: + videoBitrate = "896K"; + break; + case 19: + videoBitrate = "1024K"; + break; + case 20: + videoBitrate = "1280K"; + break; + case 21: + videoBitrate = "1536K"; + break; + case 22: + videoBitrate = "1792K"; + break; + case 23: + videoBitrate = "2048K"; + break; + case 24: + videoBitrate = "3072K"; + break; + case 25: + videoBitrate = "4096K"; + break; + case 26: + videoBitrate = "8192K"; + break; + case 27: + videoBitrate = "16384K"; + break; + default: + videoBitrate = "鍏朵粬"; + break; } //瑙嗛杈撳嚭鍙e垎杈ㄧ巼锛�0- 1024x768锛�1- 1280x720锛�2-1280x1024锛�3- 1680x1050锛�4- 1920x1080锛�5- 3840*2160 - String resolution=""; + String resolution = ""; switch (compressioncfg.struNormHighRecordPara.byResolution) { case 0: resolution = "DCIF(528*384/528*320)"; @@ -605,10 +764,10 @@ resolution = "涓嶅湪褰撳墠鍒嗚鲸鐜囩储寮曪紝璇疯仈绯荤鐞嗗憳娣诲姞"; break; } - map.put("resolution",resolution); - map.put("videoBitrate",videoBitrate); - map.put("videoEncType",videoEncType); - map.put("streamType",streamType); + map.put("resolution", resolution); + map.put("videoBitrate", videoBitrate); + map.put("videoEncType", videoEncType); + map.put("streamType", streamType); } else { int code = hCNetSDK.NET_DVR_GetLastError(); -- Gitblit v1.9.3