ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -49,6 +49,10 @@ @PostConstruct public void loadCameras() { //清空相机缓存 Collection<String> cacheKeys = redisCache.keys(getCacheKey("*")); redisCache.deleteObject(cacheKeys); //重新加载相机到缓存 List<ArdCameras> ardCameras = selectArdCamerasListNoDataScope(new ArdCameras()); for (ArdCameras ardCamera : ardCameras) { redisCache.setCacheObject(getCacheKey(ardCamera.getId()), ardCamera); ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
@@ -74,14 +74,13 @@ return AjaxResult.success("相机列表:", list); } @ApiOperation("视频分辨率") @PostMapping("/videoResolution") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum"}) @Log(title = "视频分辨率", businessType = BusinessType.CONTROL) @ApiOperation("获取码流压缩参数") @PostMapping("/getVideoCompressionCfg") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"}) @Log(title = "获取码流压缩参数", businessType = BusinessType.CONTROL) public @ResponseBody AjaxResult getVideoResolution(@RequestBody CameraCmd cmd) { String videoResolution = sdk.getVideoResolution(cmd); return toAjaxString(videoResolution, "视频分辨率:"); AjaxResult getVideoCompressionCfg(@RequestBody CameraCmd cmd) { return AjaxResult.success(sdk.getVideoCompressionCfg(cmd)); } @ApiOperation("在线状态") @@ -91,13 +90,14 @@ public @ResponseBody AjaxResult getOnlineState(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); return toAjax(sdk.isOnLine(cmd)); boolean onLine = sdk.isOnLine(cmd); return AjaxResult.success(onLine); } @ApiOperation(value = "云台控制", notes = "Code:1-左上 2-上 3-右上 4-左 5-巡航 6-右 7-左下 8-下 9-右下 10-焦距变大 11-焦距变小\n" + "12-焦点前调 13-焦点后调 14-光圈扩大 15-光圈缩小 16-雨刷开启") @PostMapping("/PTZControlWithSpeed") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.speed", "cmd.enable", "cmd.code"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.speed", "cmd.enable", "cmd.code"}) @Log(title = "云台控制", businessType = BusinessType.CONTROL) public @ResponseBody AjaxResult PTZControlWithSpeed(@RequestBody CameraCmd cmd) { @@ -108,7 +108,7 @@ @ApiOperation("调用预置点") @PostMapping("/gotoPreset") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.presetIndex"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.presetIndex"}) @Log(title = "调用预置点", businessType = BusinessType.CONTROL) public @ResponseBody AjaxResult gotoPreset(@RequestBody CameraCmd cmd) { @@ -118,7 +118,7 @@ @ApiOperation("设置预置点") @PostMapping("/setPreset") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.presetIndex"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.presetIndex"}) @Log(title = "设置预置点", businessType = BusinessType.CONTROL) public @ResponseBody AjaxResult setPreset(@RequestBody CameraCmd cmd) { @@ -128,7 +128,7 @@ @ApiOperation("获取聚焦值") @PostMapping("/getFocusPos") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"}) @Log(title = "获取聚焦值", businessType = BusinessType.CONTROL) public @ResponseBody AjaxResult getFocusPos(@RequestBody CameraCmd cmd) { @@ -139,7 +139,7 @@ @ApiOperation("设置聚焦值") @PostMapping("/setFocusPos") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.dwFocusPos"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.dwFocusPos"}) @Log(title = "设置聚焦值", businessType = BusinessType.CONTROL) public @ResponseBody AjaxResult setFocusPos(@RequestBody CameraCmd cmd) { @@ -149,7 +149,7 @@ @ApiOperation("获取PTZ") @PostMapping("/getPTZ") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"}) @Log(title = "获取PTZ", businessType = BusinessType.CONTROL) public @ResponseBody AjaxResult GetPTZ(@RequestBody CameraCmd cmd) { @@ -161,7 +161,7 @@ @ApiOperation("获取PTZ范围") @PostMapping("/getPTZScope") @Log(title = "获取PTZ范围", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"}) public @ResponseBody AjaxResult GetPTZScope(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -172,7 +172,7 @@ @ApiOperation("设置PTZ") @PostMapping("/setPTZ") @Log(title = "设置PTZ", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.ptzMap"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.ptzMap"}) public @ResponseBody AjaxResult SetPTZ(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -182,7 +182,7 @@ @ApiOperation("指向目标") @PostMapping("/setTargetPosition") @Log(title = "指向目标", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.targetPosition"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.targetPosition"}) public @ResponseBody AjaxResult setTargetPosition(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -193,7 +193,7 @@ @ApiOperation("设置零方位角") @PostMapping("/setZeroPTZ") @Log(title = "设置零方位角", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.cmd.chanNo"}) public @ResponseBody AjaxResult SetZeroPTZ(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -222,7 +222,7 @@ @ApiOperation("获取云台锁定信息") @PostMapping("/getPTZLockInfo") @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"}) @Log(title = "获取云台锁定信息", businessType = BusinessType.CONTROL) public @ResponseBody AjaxResult getPTZLockInfo(@RequestBody CameraCmd cmd) { @@ -240,7 +240,7 @@ @ApiOperation("透雾开关") @PostMapping("/defogcfg") @Log(title = "透雾开关", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"}) public @ResponseBody AjaxResult defogcfg(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -250,7 +250,7 @@ @ApiOperation("红外开关") @PostMapping("/infrarecfg") @Log(title = "红外开关", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"}) public @ResponseBody AjaxResult infrarecfg(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -260,7 +260,7 @@ @ApiOperation(value = "手动/自动聚焦", notes = "true手动flase自动") @PostMapping("/focusMode") @Log(title = "手动/自动聚焦", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"}) public @ResponseBody AjaxResult enableFocusMode(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -279,7 +279,7 @@ @ApiOperation("云台加热") @PostMapping("/heateRpwron") @Log(title = "云台加热", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"}) public @ResponseBody AjaxResult HeateRpwron(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -290,7 +290,7 @@ @ApiOperation("镜头加热") @PostMapping("/cameraDeicing") @Log(title = "镜头加热", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"}) public @ResponseBody AjaxResult CameraDeicing(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -308,7 +308,7 @@ @ApiOperation("相机抓图") @PostMapping("/picCutCate") @Log(title = "相机抓图", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"}) public @ResponseBody AjaxResult picCutCate(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -319,7 +319,7 @@ @ApiOperation("手动录像") @PostMapping("/record") @Log(title = "手动录像", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"}) public @ResponseBody AjaxResult record(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); @@ -329,7 +329,7 @@ @ApiOperation("获取相机架设参数") @PostMapping("/getCameraSetupCFG") @Log(title = "获取相机架设参数", businessType = BusinessType.CONTROL) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"}) @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"}) public @ResponseBody AjaxResult getCameraSetupCFG(@RequestBody CameraCmd cmd) { cmd.setOperator(SecurityUtils.getUserId()); ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/LoginResultCallBack.java
@@ -41,26 +41,24 @@ if (GlobalVariable.loginMap.containsKey(camera.getId())) { GlobalVariable.loginMap.remove(camera.getId()); } //删除管理通道 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); if (dwResult == 1) { GlobalVariable.loginMap.put(camera.getId(), lUserID); log.debug(camera.getIp() + ":" + camera.getPort() + "登录成功"); camera.setLoginId(lUserID); camera.setChanNum((int) lpDeviceinfo.byChanNum); camera.setStartDChan((int)lpDeviceinfo.byStartDChan); camera.setStartDChan((int) lpDeviceinfo.byStartDChan); //获取最新通道 List<ArdChannel> cameraChannelList = hikClientService.getCameraChannelList(camera); if(cameraChannelList.size()>0) { //删除管理通道 ardChannelService.deleteArdChannelByDeviceId(camera.getId()); if (cameraChannelList.size() > 0) { for (ArdChannel channel : cameraChannelList) { channel.setId(IdUtils.simpleUUID()); ardChannelService.insertArdChannel(channel); } } //创建引导队列 if(!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) { if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) { Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator(); PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator); GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue); ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
@@ -44,8 +44,8 @@ //调用预置位 boolean gotoPreset(CameraCmd cmd); //分辨率获取 String getVideoResolution(CameraCmd cmd); //获取码流压缩参数 Map<String,String> getVideoCompressionCfg(CameraCmd cmd); //透雾 boolean controlDefogcfg(CameraCmd cmd); ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -357,10 +357,10 @@ Integer userId = GlobalVariable.loginMap.get(cameraId); HCNetSDK.NET_DVR_STD_CONFIG struStdCfg = new HCNetSDK.NET_DVR_STD_CONFIG(); HCNetSDK.NET_DVR_GIS_INFO struGisInfo = new HCNetSDK.NET_DVR_GIS_INFO(); struGisInfo.struPtzPosEx.dwFocus=dwFocusPos; struGisInfo.struPtzPosEx.dwFocus = dwFocusPos; struStdCfg.read(); IntByReference lchannel = new IntByReference(channelNum); struStdCfg.lpInBuffer= struGisInfo.getPointer(); struStdCfg.lpInBuffer = struGisInfo.getPointer(); struStdCfg.lpCondBuffer = lchannel.getPointer(); struStdCfg.dwCondSize = 4; struStdCfg.dwInSize = struGisInfo.size(); @@ -406,7 +406,7 @@ } else { struGisInfo.read(); Map<String, Object> map = new HashMap<>(); map.put("dwFocus",struGisInfo.struPtzPosEx.dwFocus); map.put("dwFocus", struGisInfo.struPtzPosEx.dwFocus); return map; } } @@ -458,7 +458,7 @@ } /** * @描述 获取分辨率 * @描述 获取通道压缩参数 * @参数 [cameraId, channelNum] * @返回值 java.lang.String * @创建人 刘苏义 @@ -466,92 +466,150 @@ * @修改人和其它信息 */ @Override public String getVideoResolution(CameraCmd cmd) { public Map<String,String> getVideoCompressionCfg(CameraCmd cmd) { String cameraId = cmd.getCameraId(); Integer channelNum = cmd.getChanNo(); Integer chanNo = cmd.getChanNo(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return " "; return null; } Integer userId = GlobalVariable.loginMap.get(cameraId); String ResResolution = ""; NET_DVR_COMPRESSIONCFG_V30 resolution = new NET_DVR_COMPRESSIONCFG_V30(); resolution.write(); Pointer pioint = resolution.getPointer(); Map<String,String> map=new HashMap<>(); NET_DVR_COMPRESSIONCFG_V30 compressioncfg = new NET_DVR_COMPRESSIONCFG_V30(); compressioncfg.write(); Pointer pioint = compressioncfg.getPointer(); IntByReference ibrBytesReturned = new IntByReference(0); try { boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_COMPRESSCFG_V30, channelNum, pioint, resolution.size(), ibrBytesReturned); boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, HCNetSDK.NET_DVR_GET_COMPRESSCFG_V30, chanNo, pioint, compressioncfg.size(), ibrBytesReturned); if (bool) { resolution.read(); compressioncfg.read(); //码流类型:0-视频流,1-复合流,0xfe- 自动(和源一致) 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 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; } //视频输出口分辨率:0- 1024x768,1- 1280x720,2-1280x1024,3- 1680x1050,4- 1920x1080,5- 3840*2160 // byte byStreamType = resolution.struNormHighRecordPara.byStreamType; // int dwVideoBitrate = resolution.struNormHighRecordPara.dwVideoBitrate; int byResolution = resolution.struNormHighRecordPara.byResolution; switch (byResolution) { String resolution=""; switch (compressioncfg.struNormHighRecordPara.byResolution) { case 0: ResResolution = "DCIF(528*384/528*320)"; resolution = "DCIF(528*384/528*320)"; break; case 1: ResResolution = "CIF(352*288/352*240)"; resolution = "CIF(352*288/352*240)"; break; case 2: ResResolution = "QCIF(176*144/176*120)"; resolution = "QCIF(176*144/176*120)"; break; case 3: ResResolution = "4CIF(704*576/704*480)"; resolution = "4CIF(704*576/704*480)"; break; case 4: ResResolution = "2CIF(704*288/704*240)"; resolution = "2CIF(704*288/704*240)"; break; case 6: ResResolution = "QVGA(320*240)"; resolution = "QVGA(320*240)"; break; case 7: ResResolution = "QQVGA(160*120)"; resolution = "QQVGA(160*120)"; break; case 16: ResResolution = "VGA(640*480)"; resolution = "VGA(640*480)"; break; case 17: ResResolution = "UXGA(1600*1200)"; resolution = "UXGA(1600*1200)"; break; case 18: ResResolution = "SVGA(800*600)"; resolution = "SVGA(800*600)"; break; case 19: ResResolution = "HD720P(1280*720)"; resolution = "HD720P(1280*720)"; break; case 20: ResResolution = "XVGA(1280*960)"; resolution = "XVGA(1280*960)"; break; case 21: ResResolution = "HD900P(1600*900)"; resolution = "HD900P(1600*900)"; break; case 22: ResResolution = "1360*1024"; resolution = "1360*1024"; break; case 23: ResResolution = "1536*1536"; resolution = "1536*1536"; break; case 24: ResResolution = "1920*1920"; resolution = "1920*1920"; break; case 27: ResResolution = "1920*1080p"; resolution = "1920*1080p"; break; case 28: ResResolution = "2560*1920"; resolution = "2560*1920"; break; case 29: ResResolution = "1600*304"; resolution = "1600*304"; break; case 30: ResResolution = "2048*1536"; resolution = "2048*1536"; break; default: ResResolution = "不在当前分辨率索引,请联系管理员添加"; resolution = "不在当前分辨率索引,请联系管理员添加"; break; } map.put("resolution",resolution); map.put("videoBitrate",videoBitrate); map.put("videoEncType",videoEncType); map.put("streamType",streamType); } else { int code = hCNetSDK.NET_DVR_GetLastError(); log.error("控制失败,请稍后重试" + code); @@ -559,7 +617,7 @@ } catch (Exception ex) { log.error(ex.getMessage()); } return ResResolution; return map; } /** @@ -1478,7 +1536,7 @@ struGisInfo.read(); Map<String, Object> map = new HashMap<>(); map.put("p", struGisInfo.struPtzPos.fPanPos); map.put("t", struGisInfo.struPtzPos.fTiltPos<0?struGisInfo.struPtzPos.fTiltPos+360:struGisInfo.struPtzPos.fTiltPos); map.put("t", struGisInfo.struPtzPos.fTiltPos < 0 ? struGisInfo.struPtzPos.fTiltPos + 360 : struGisInfo.struPtzPos.fTiltPos); map.put("z", struGisInfo.struPtzPos.fZoomPos); map.put("fHorFieldAngle", struGisInfo.fHorizontalValue);// 水平视场角 map.put("fVerFieldAngle", struGisInfo.fVerticalValue);// 垂直视场角 ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java
@@ -53,7 +53,7 @@ String processName = "mediamtx.exe"; @Override public void run(ApplicationArguments args){ public void run(ApplicationArguments args) { try { log.info("开始加载流媒体列表"); List<StreamInfo> paths = paths(); @@ -64,12 +64,11 @@ for (Vtdu v : vtduList) { addPath(v.getName(), v.getRtspUrl(), v.getCodeType(), v.getIsCode()); } } catch (Exception ex) { log.error("加载流媒体列表异常:"+ex.getMessage()); } catch (Exception ex) { log.error("加载流媒体列表异常:" + ex.getMessage()); } } @PostConstruct public void initMediaMtx() { if (mediamtxEnabled) { @@ -109,11 +108,12 @@ public String addPath(String name, String rtspPath, String mode, String isCode) { String rtspUrl = "rtsp://" + mediamtxHost + ":7554/" + name; Conf mediaInfo = new Conf(); String rootPath = System.getProperty("user.dir").replaceAll("\\\\", "/")+ "/lib/mediamtx/"; String rootPath = System.getProperty("user.dir").replaceAll("\\\\", "/") + "/lib/mediamtx/"; //-vcodec libx264 //指定视频编码器为 libx264,使用 H.264 编码格式进行视频压缩 //-preset ultrafast //--preset的参数主要调节编码速度和质量的平衡,有ultrafast(转码速度最快,视频往往也最模糊)、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢 //-r 25 //设置输出视频的帧率为 25 帧/秒 //-g 20 //关键帧间隔20 //-sc_threshold 0 //将其设置为0(-sc_threshold 0)禁用场景变化检测 //-rtsp_transport tcp //这个选项告诉 FFmpeg 使用 TCP 作为 RTSP 的传输协议 //-threads 4: 指定要使用的线程数为 4。//这允许 FFmpeg 在多核处理器上使用多个线程来进行视频编码,以加快速度。 // -i //用于指定输入媒体文件或输入流的地址 @@ -124,11 +124,11 @@ //GPU硬解码编码 -hwaccel cuvid -c:v h264_cuvid 使用cuda解码 -c:v h264_nvenc 使用cuda编码 //String cmd = rootPath + "/lib/mediamtx/" + "ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport udp -i " + rtspPath + " -c:v h264_nvenc -r 25 -threads 4 -b:v 2048k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; if (isCode.equals("1")) { String cmd = "ffmpeg -rtsp_transport tcp -i " + rtspPath + " -vcodec libx264 -preset:v ultrafast -r 25 -g 20 -threads 6 -b:v 2048k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; String cmd = rootPath + "ffmpeg -rtsp_transport tcp -i " + rtspPath + " -vcodec libx264 -preset:v ultrafast -r 25 -keyint_min 20 -g 20 -sc_threshold 0 -threads 6 -b:v 2048k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; if (!softwareDecoding) { cmd = "ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport tcp -i " + rtspPath + " -c:v h264_nvenc -r 25 -threads 6 -b:v 2048k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; cmd = rootPath + "ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport tcp -i " + rtspPath + " -c:v h264_nvenc -r 25 -g 60 -threads 6 -b:v 2048k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; } if (mode.equals("1")) { if (mode.equals("0")) { mediaInfo.setRunondemand(cmd); mediaInfo.setRunondemandrestart(true); } else { @@ -153,10 +153,10 @@ String runondemand = item.getConf().getRunondemand(); if (StringUtils.isNotEmpty(runondemand)) { runoninit = item.getConf().getRunondemand(); info.setMode("1"); info.setMode("0"); } else { runoninit = item.getConf().getRunoninit(); info.setMode("0"); info.setMode("1"); } //RTSP源地址 String regex = "rtsp://[^\\s\"]+"; @@ -194,10 +194,10 @@ String runondemand = item.getConf().getRunondemand(); if (StringUtils.isNotEmpty(runondemand)) { runoninit = item.getConf().getRunondemand(); info.setMode("1"); info.setMode("0"); } else { runoninit = item.getConf().getRunoninit(); info.setMode("0"); info.setMode("1"); } //RTSP源地址 String regex = "rtsp://[^\\s\"]+"; ard-work/src/main/resources/templates/preview.html
@@ -21,7 +21,7 @@ .container { background-color: #151414; /* 将网格项目的颜色设置为红色背景 */ flex: 9; border: 1px solid #ccc; border: 10px solid; box-sizing: border-box; display: grid; grid-template-columns: repeat(2, 1fr); /* 默认 2x2 网格 */ @@ -35,7 +35,7 @@ display: flex; justify-content: center; align-items: center; border: 1px solid #ccc; border: 2px solid #384551; box-sizing: border-box; padding: 10px; /* 内边距为 10px */ position: relative; /* 添加相对定位 */ ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
@@ -11,11 +11,10 @@ import com.ruoyi.common.utils.uuid.IdUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.SecurityUtils; #if($table.sub) import java.util.ArrayList; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.SecurityUtils; import org.springframework.transaction.annotation.Transactional; import ${packageName}.domain.${subClassName}; #end ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java
@@ -45,6 +45,11 @@ if (Objects.size() > 0) { for (Object obj : Objects) { ArdCameras camera = (ArdCameras) obj; if (!GlobalVariable.loginMap.containsKey(camera.getId()))//只推送首次登录成功的相机 { continue; } //推送大光电 if(!"1".equals(camera.getGdtype())) { continue; @@ -53,7 +58,9 @@ cmd.setCameraId(camera.getId()); cmd.setChanNo(1); cmd.setOperator(camera.getOperatorId()); if (!GlobalVariable.loginMap.containsKey(camera.getId()))//只推送登录成功的相机 //推送在线的相机 boolean onLine = hikClientService.isOnLine(cmd); if(!onLine) { continue; }