程序启动清空相机缓存列表重新加载
增加sdk获取相机聚焦值接口
修改相机登录时离线清空通道列表
增加获取码流压缩参数(分辨率/编码格式/码率/流类型)
优化相机在线离线业务方法,修改仅在线设备上传ptz
已修改9个文件
258 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/LoginResultCallBack.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/templates/preview.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
                    }