1. 增加聚焦值和获取接口。
2. 增加视频编码获取接口。
3. 流媒体通过编码自动切换是否转码。
已修改27个文件
1427 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueTaskExecutor.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/controller/DhSdkController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/enumeration/EM_FOCUS_LIMIT_SELECT_MODE.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/structure/CFG_VIDEO_IN_FOCUS_UNIT.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/ConfigModule.java 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/PtzControlModule.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/RealPlayModule.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/IDhClientService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java 316 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/HikSdkController.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/LoginResultCallBack.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 323 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/templates/test.html 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarm/global/service/impl/QueueTaskExecutor.java
@@ -15,7 +15,7 @@
import com.ruoyi.alarm.tube.service.IArdAlarmTubeService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.device.camera.service.ICameraSdkService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@@ -39,7 +39,7 @@
    @Resource
    IArdAlarmRadarPumpService ardAlarmRadarPumpService;
    @Resource
    IHikClientService hikClientService;
    ICameraSdkService cameraSdkService;
    @Resource
    IArdAlarmTubeService ardAlarmTubeService;
@@ -58,17 +58,17 @@
            cmd.setRecordBucketName("record");
            cmd.setRecordObjectName("alarm_" + guideTask.getAlarmId());
            log.debug("开始引导");
            boolean guideRes = hikClientService.guideTargetPosition(cmd);
            boolean guideRes = cameraSdkService.guideTargetPosition(cmd);
            if (guideRes) {
                log.debug("引导成功");
                hikClientService.controlLock(cmd);//上锁
                hikClientService.recordStart(cmd);//开始录像
                cameraSdkService.controlLock(cmd);//上锁
                cameraSdkService.recordStart(cmd);//开始录像
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    log.info("当前任务ID" + guideTask.getAlarmId() + "线程被终止");
                }
                String url = hikClientService.recordStopToMinio(cmd);//停止录像返回url
                String url = cameraSdkService.recordStopToMinio(cmd);//停止录像返回url
                if (StringUtils.isNotEmpty(url)) {
                    switch (guideTask.getAlarmType()) {
                        case "sys_tube_leak":
ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java
@@ -7,6 +7,8 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.device.camera.service.impl.CameraSdkServiceImpl;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.device.hiksdk.service.impl.HikClientServiceImpl;
@@ -49,6 +51,8 @@
    private IHikClientService hikSdk;
    @Resource
    private IDhClientService dhSdk;
    @Resource
    private ICameraSdkService cameraSdkService;
    @Resource
    private IArdCamerasService ardCamerasService;
    @Resource
@@ -99,17 +103,8 @@
    public AjaxResult add(@RequestBody ArdCameras camera) {
        int i = ardCamerasService.insertArdCameras(camera);
        if (i > 0) {
            if (camera.getFactory().equals("1")) {
                //注销
                hikSdk.logout(camera.getId());
                //异步登录
                hikSdk.asyncLogin(camera);
            }
            else if(camera.getFactory().equals("2"))
            {
                dhSdk.logout(camera.getId());
                dhSdk.login(camera);
            }
            cameraSdkService.logout(camera.getId());
            cameraSdkService.login(camera);
        }
        return toAjax(i);
    }
@@ -124,15 +119,8 @@
    public AjaxResult edit(@RequestBody ArdCameras camera) {
        int i = ardCamerasService.updateArdCameras(camera);
        if (i > 0) {
            camera= ardCamerasService.selectArdCamerasById(camera.getId());
            if(camera.getFactory().equals("1")) {
                hikSdk.logout(camera.getId());
                hikSdk.asyncLogin(camera);
            }
            else if(camera.getFactory().equals("2")) {
                dhSdk.logout(camera.getId());
                dhSdk.login(camera);
            }
            cameraSdkService.logout(camera.getId());
            cameraSdkService.login(camera);
        }
        return toAjax(i);
    }
@@ -146,8 +134,7 @@
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable String[] ids) {
        for (String id : ids) {
            hikSdk.logout(id);
            dhSdk.logout(id);
            cameraSdkService.logout(id);
        }
        return toAjax(ardCamerasService.deleteArdCamerasByIds(ids));
    }
ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
@@ -150,8 +150,8 @@
    public @ResponseBody
    AjaxResult getFocusPos(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        Map<String, Object> Map = cameraSdkService.getFocusPos(cmd);
        return AjaxResult.success("获取聚焦值", Map);
        int focus = cameraSdkService.getFocusPos(cmd);
        return AjaxResult.success("获取聚焦值", focus);
    }
    @ApiOperation("设置聚焦值")
@@ -335,6 +335,17 @@
        return AjaxResult.success(cameraSdkService.getGisInfo(cmd));
    }
    @ApiOperation("录像")
    @PostMapping("/record")
    @Log(title = "手动录像开始", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
    public @ResponseBody
    AjaxResult record(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        String url = cameraSdkService.record(cmd);
        return AjaxResult.success(url);
    }
    @ApiOperation("手动录像开始")
    @PostMapping("/recordStart")
    @Log(title = "手动录像开始", businessType = BusinessType.CONTROL)
@@ -345,6 +356,7 @@
        boolean b = cameraSdkService.recordStart(cmd);
        return toAjax(b);
    }
    @ApiOperation("手动录像停止")
    @PostMapping("/recordStop")
    @Log(title = "手动录像停止", businessType = BusinessType.CONTROL)
ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java
@@ -2,20 +2,15 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.channel.domain.ArdChannel;
import java.util.List;
import java.util.Map;
public interface ICameraSdkService {
    //sdk初始化
    void initSDK();
    //同步登录
    void syncLogin(ArdCameras cameras);
    //异步登录
    void asyncLogin(ArdCameras cameras);
    //登录
    Boolean login(ArdCameras ardCamera);
    //注销
    boolean logout(String cameraId);
@@ -30,7 +25,7 @@
    boolean setFocusPos(CameraCmd cmd);
    //获取聚焦值
    Map<String, Object> getFocusPos(CameraCmd cmd);
    int getFocusPos(CameraCmd cmd);
    //设置预置位
    boolean setPreset(CameraCmd cmd);
@@ -39,12 +34,12 @@
    boolean gotoPreset(CameraCmd cmd);
    //获取码流压缩参数
    Map<String, String> getVideoCompressionCfg(CameraCmd cmd);
    Map<String, Object> getVideoCompressionCfg(CameraCmd cmd);
    //透雾
    boolean controlDefogcfg(CameraCmd cmd);
    //红外?
    //红外
    boolean controlInfrarecfg(CameraCmd cmd);
    //聚焦模式
@@ -56,7 +51,7 @@
    //云台加热
    boolean controlPTHeateRpwron(CameraCmd cmd);
    //镜头除冰
    //镜头加热除冰
    boolean controlCameraDeicing(CameraCmd cmd);
    //配置锁定
@@ -85,9 +80,11 @@
    //设置零方位角
    boolean setZeroPtz(CameraCmd cmd);
    //引导目标位置
    boolean guideTargetPosition(CameraCmd cmd);
    //录像
    String record(CameraCmd cmd);
    //手动开始录像
    boolean recordStart(CameraCmd cmd);
@@ -96,11 +93,8 @@
    String recordStopToMinio(CameraCmd cmd);
    //停止录像-不上传minio
    void recordStopNotToMinio(CameraCmd cmd);
    //获取相机通道信息
    public List<ArdChannel> getCameraChannelList(ArdCameras camera);
    boolean recordStopNotToMinio(CameraCmd cmd);
    //获取GIS信息数据
    public Map<String, Object> getGisInfo(CameraCmd cmd);
    Map<String, Object> getGisInfo(CameraCmd cmd);
}
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -13,6 +13,7 @@
import com.ruoyi.device.channel.domain.ArdChannel;
import com.ruoyi.device.channel.mapper.ArdChannelMapper;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.media.domain.Vtdu;
import com.ruoyi.media.service.IVtduService;
import com.ruoyi.scheduling.domian.SchedulingParam;
import com.ruoyi.utils.gis.GisUtil;
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
@@ -1,11 +1,16 @@
package com.ruoyi.device.camera.service.impl;
import com.ruoyi.common.annotation.SdkOperate;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.device.channel.domain.ArdChannel;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.ruoyi.device.dhsdk.module.RealPlayModule;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.device.hiksdk.service.IHikClientService;
@@ -13,10 +18,13 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.ruoyi.device.dhsdk.lib.ToolKits.getErrorCodePrint;
import static com.ruoyi.device.dhsdk.module.LoginModule.netsdk;
import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.NET_DVR_CHECK_USER_STATUS;
@@ -30,12 +38,14 @@
@Slf4j(topic = "SDK")
public class CameraSdkServiceImpl implements ICameraSdkService {
    @Resource
    private IArdCamerasService ardCamerasService;
    @Resource
    IHikClientService hikClientService;
    @Resource
    IDhClientService dhClientService;
    @Resource
    RedisCache redisCache;
    //初始化SDK
    @Override
    public void initSDK() {
        //初始化加载sdk库文件
@@ -48,20 +58,47 @@
            dhClientService.loginAll();//登录全部大华相机
        }
    }
    //登录
    @Override
    public void syncLogin(ArdCameras cameras) {
    public Boolean login(ArdCameras ardCamera) {
        boolean result = false;
        try {
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    hikClientService.syncLogin(ardCamera);
                    result=true;
                } else if (factory.equals("2")) {
                    result = dhClientService.login(ardCamera);
                }
            }
        } catch (Exception ex) {
            log.error("登录异常:" + ex.getMessage());
            return false;
        }
        return result;
    }
    @Override
    public void asyncLogin(ArdCameras cameras) {
    }
    //注销
    @Override
    public boolean logout(String cameraId) {
        return false;
        boolean result = false;
        try {
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.logout(cameraId);
                } else if (factory.equals("2")) {
                    result = dhClientService.logout(cameraId);
                }
            }
        } catch (Exception ex) {
            log.error("注销异常:" + ex.getMessage());
            return false;
        }
        return result;
    }
    //在线检测
    @Override
    public boolean isOnLine(CameraCmd cmd) {
@@ -84,6 +121,7 @@
        }
    }
    //云台控制
    @SdkOperate
    @Override
    public boolean pTZControl(CameraCmd cmd) {
        try {
@@ -116,7 +154,7 @@
                if (factory.equals("1")) {
                    result = hikClientService.setFocusPos(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.setFocusPos(cmd);
                }
            }
        } catch (Exception ex) {
@@ -127,23 +165,23 @@
    }
    //获取聚焦值
    @Override
    public Map<String, Object> getFocusPos(CameraCmd cmd) {
        Map<String, Object> map = new HashMap<>();
    public int getFocusPos(CameraCmd cmd) {
        int result=0;
        try {
            String cameraId = cmd.getCameraId();
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    map = hikClientService.getFocusPos(cmd);
                    result = hikClientService.getFocusPos(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.getFocusPos(cmd);
                }
            }
        } catch (Exception ex) {
            log.error("获取聚焦值异常:" + ex.getMessage());
        }
        return map;
        return result;
    }
    //设置预置位
    @Override
@@ -187,8 +225,8 @@
    }
    //获取码流压缩参数
    @Override
    public Map<String, String> getVideoCompressionCfg(CameraCmd cmd) {
        Map<String, String> map = new HashMap<>();
    public Map<String, Object> getVideoCompressionCfg(CameraCmd cmd) {
        Map<String, Object> map = new HashMap<>();
        try {
            String cameraId = cmd.getCameraId();
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
@@ -197,7 +235,7 @@
                if (factory.equals("1")) {
                    map = hikClientService.getVideoCompressionCfg(cmd);
                } else if (factory.equals("2")) {
                    map = dhClientService.getVideoCompressionCfg(cmd);
                }
            }
        } catch (Exception ex) {
@@ -217,7 +255,7 @@
                if (factory.equals("1")) {
                    result = hikClientService.controlDefogcfg(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
            }
        } catch (Exception ex) {
@@ -237,7 +275,7 @@
                if (factory.equals("1")) {
                    result = hikClientService.controlInfrarecfg(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.controlInfrarecfg(cmd);
                }
            }
        } catch (Exception ex) {
@@ -297,7 +335,7 @@
                if (factory.equals("1")) {
                    result = hikClientService.controlPTHeateRpwron(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
            }
        } catch (Exception ex) {
@@ -317,7 +355,7 @@
                if (factory.equals("1")) {
                    result = hikClientService.controlCameraDeicing(cmd);
                } else if (factory.equals("2")) {
                    //不支持
                }
            }
        } catch (Exception ex) {
@@ -325,46 +363,7 @@
        }
        return result;
    }
    //操控锁定
    @Override
    public boolean controlLock(CameraCmd cmd) {
        boolean result = false;
        try {
            String cameraId = cmd.getCameraId();
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlLock(cmd);
                } else if (factory.equals("2")) {
                }
            }
        } catch (Exception ex) {
            log.error("操控锁定异常:" + ex.getMessage());
        }
        return result;
    }
    //设置解锁
    @Override
    public boolean controlUnLock(CameraCmd cmd) {
        boolean result = false;
        try {
            String cameraId = cmd.getCameraId();
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.controlUnLock(cmd);
                } else if (factory.equals("2")) {
                }
            }
        } catch (Exception ex) {
            log.error("设置解锁异常:" + ex.getMessage());
        }
        return result;
    }
    //获取云台锁定信息
    @Override
    public int getPTZLockInfo(CameraCmd cmd) {
@@ -391,17 +390,23 @@
        return null;
    }
    //抓图
    @SdkOperate
    @Override
    public String picCutCate(CameraCmd cmd) {
        String url = "";
       String url = "";
        try {
            //获取摄像头ID
            String cameraId = cmd.getCameraId();
            //从redis中获取摄像头信息
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                //获取摄像头工厂
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    //调用hikClientService的picCutCate方法
                    url = hikClientService.picCutCate(cmd);
                } else if (factory.equals("2")) {
                    //调用dhClientService的picCutCate方法
                    url = dhClientService.picCutCate(cmd);
                }
            }
@@ -451,6 +456,7 @@
        return map;
    }
    //设置ptz
    @SdkOperate
    @Override
    public boolean setPtz(CameraCmd cmd) {
        boolean result = false;
@@ -471,6 +477,7 @@
        return result;
    }
    //设置零方位角
    @SdkOperate
    @Override
    public boolean setZeroPtz(CameraCmd cmd) {
        boolean result = false;
@@ -491,6 +498,7 @@
        return result;
    }
    //引导指向目标
    @SdkOperate
    @Override
    public boolean guideTargetPosition(CameraCmd cmd) {
        boolean result = false;
@@ -510,6 +518,74 @@
        }
        return result;
    }
    /**
     * @描述 操控锁定
     * @参数 [userId, channelNum]
     * @返回值 boolean
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息 0-解锁 1-锁定
     */
    @Override
    @SdkOperate
    public boolean controlLock(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();//申请锁的相机
        ArdCameras ardCameras = ardCamerasService.selectArdCamerasById(cameraId);
        Date now = new Date();
        now.setTime(now.getTime() + cmd.getExpired() * 1000);
        ardCameras.setOperatorExpired(now);//设置当前过期时间
        ardCamerasService.updateArdCameras(ardCameras);
        return true;
    }
    /**
     * @描述 操控解锁
     * @参数 [userId, channelNum]
     * @返回值 boolean
     * @创建人 刘苏义
     * @创建时间 2023/6/30 15:36
     * @修改人和其它信息
     */
    @Override
    public boolean controlUnLock(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();//申请解锁的相机
        String operator = cmd.getOperator();//申请者
        ArdCameras ardCameras = ardCamerasService.selectArdCamerasById(cameraId);
        if (ardCameras.getOperatorId().equals(operator)) {
            //如果解锁相机的当前用户是申请者,则清空该相机的过期时间
            ardCameras.setOperatorExpired(null);
            int i = ardCamerasService.updateArdCameras(ardCameras);
            if (i > 0) {
                log.debug(cameraId + "--解锁成功");
            }
        }
        return true;
    }
    //录像
    @SdkOperate
    @Override
    public String record(CameraCmd cmd) {
        String url = "";
        try {
            String cameraId = cmd.getCameraId();
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    url = hikClientService.record(cmd);
                } else if (factory.equals("2")) {
                    url = dhClientService.record(cmd);
                }
            }
        } catch (Exception ex) {
            log.error("录像异常:" + ex.getMessage());
        }
        return url;
    }
    //开始录像
    @Override
    public boolean recordStart(CameraCmd cmd) {
@@ -552,13 +628,23 @@
    }
    //停止录像并不存入minio
    @Override
    public void recordStopNotToMinio(CameraCmd cmd) {
    }
    @Override
    public List<ArdChannel> getCameraChannelList(ArdCameras camera) {
        return null;
    public boolean recordStopNotToMinio(CameraCmd cmd) {
        boolean result = false;
        try {
            String cameraId = cmd.getCameraId();
            ArdCameras ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + cameraId);
            if (ardCamera != null) {
                String factory = ardCamera.getFactory();
                if (factory.equals("1")) {
                    result = hikClientService.recordStopNotToMinio(cmd);
                } else if (factory.equals("2")) {
                    result = dhClientService.recordStopNotToMinio(cmd);
                }
            }
        } catch (Exception ex) {
            log.error("停止录像异常:" + ex.getMessage());
        }
        return result;
    }
    //获取相机架设参数
ard-work/src/main/java/com/ruoyi/device/dhsdk/controller/DhSdkController.java
@@ -9,7 +9,6 @@
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
@@ -17,8 +16,6 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Map;
@@ -28,7 +25,7 @@
 * @Author: 刘苏义
 * @Date: 2023年10月14日10:34:58
 **/
@Api(tags = "大华SDK接口")
@Controller
@RequestMapping("/dh")
@Anonymous
ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/enumeration/EM_FOCUS_LIMIT_SELECT_MODE.java
@@ -10,7 +10,7 @@
/**
 Manual  自动
*/
EM_FOCUS_LIMIT_MODE_MANUAL(0," Manual  自动"),
EM_FOCUS_LIMIT_MODE_MANUAL(0," Manual 自动"),
/**
 Auto 手动
*/
ard-work/src/main/java/com/ruoyi/device/dhsdk/lib/structure/CFG_VIDEO_IN_FOCUS_UNIT.java
@@ -2,33 +2,33 @@
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
/**
* @author 291189
* @description  聚焦设置基本信息单元
* @date 2022/11/01 11:16:54
*/
/**
 * @author 291189
 * @description 聚焦设置基本信息单元
 * @date 2022/11/01 11:16:54
 */
public class CFG_VIDEO_IN_FOCUS_UNIT extends NetSDKLib.SdkStructure {
/**
聚焦模式, 0-关闭, 1-辅助聚焦, 2-自动聚焦, 3-半自动聚焦, 4-手动聚焦
*/
public            int                    nMode;
/**
聚焦灵敏度, 0-高, 1-默认, 2-低
*/
public            int                    nSensitivity;
/**
红外光聚焦修正, 0-不修正, 1-修正, 2-自动修正
*/
public            int                    nIRCorrection;
/**
聚焦极限 {@link com.ruoyi.device.dhsdk.lib.enumeration.EM_FOCUS_LIMIT_SELECT_MODE}
*/
public            int                    emFocusMode;
/**
聚焦极限值, 单位毫米
*/
public            int                    nFocusLimit;
    /**
     * 聚焦模式, 0-关闭, 1-辅助聚焦, 2-自动聚焦, 3-半自动聚焦, 4-手动聚焦
     */
    public int nMode;
    /**
     * 聚焦灵敏度, 0-高, 1-默认, 2-低
     */
    public int nSensitivity;
    /**
     * 红外光聚焦修正, 0-不修正, 1-修正, 2-自动修正
     */
    public int nIRCorrection;
    /**
     * 聚焦极限 {@link com.ruoyi.device.dhsdk.lib.enumeration.EM_FOCUS_LIMIT_SELECT_MODE}
     */
    public int emFocusMode;
    /**
     * 聚焦极限值, 单位毫米
     */
    public int nFocusLimit;
public            CFG_VIDEO_IN_FOCUS_UNIT(){
}
    public CFG_VIDEO_IN_FOCUS_UNIT() {
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/ConfigModule.java
@@ -1,8 +1,10 @@
package com.ruoyi.device.dhsdk.module;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.ruoyi.device.dhsdk.lib.ToolKits;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
import static com.ruoyi.device.dhsdk.lib.ToolKits.getErrorCodePrint;
/**
@@ -14,6 +16,7 @@
public class ConfigModule {
    public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
    public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
    /**
     * 查询设备状态
     */
@@ -27,28 +30,78 @@
        stuInfo.read();
        return true;
    }
    /**
     * 获取单个配置
     *
     * @param hLoginHandle 登陆句柄
     * @param nChn         通道号,-1 表示全通道
     * @param strCmd       配置名称
     * @param cmdObject    配置对应的结构体对象
     * @return 成功返回 true
     */
    public static boolean GetNewDevConfig(NetSDKLib.LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) {
        boolean result = false;
        IntByReference error = new IntByReference(0);
        int nBufferLen = 2 * 1024 * 1024;
        byte[] strBuffer = new byte[nBufferLen];
        if (netsdk.CLIENT_GetNewDevConfig(hLoginHandle, strCmd, nChn, strBuffer, nBufferLen, error, 3000)) {
            cmdObject.write();
            if (configsdk.CLIENT_ParseData(strCmd, strBuffer, cmdObject.getPointer(), cmdObject.size(), null)) {
                cmdObject.read();
                result = true;
            } else {
                System.err.println("Parse " + strCmd + " Config Failed!" + ToolKits.getErrorCodePrint());
                result = false;
            }
        } else {
            System.err.printf("Get %s Config Failed!Last Error = %s\n", strCmd, getErrorCodePrint());
            result = false;
        }
        return result;
    }
    public static boolean GetDevConfig(NetSDKLib.LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) {
        boolean result = true;
        IntByReference error = new IntByReference(0);
        int nBufferLen = 2 * 1024 * 1024;
        byte[] strBuffer = new byte[nBufferLen];
        cmdObject.write();
        boolean bRet = netsdk.CLIENT_QueryNewSystemInfo(hLoginHandle, strCmd, nChn, strBuffer, cmdObject.size(), error,3000);
        if (bRet) {
            cmdObject.read();
        } else {
            System.err.printf("Get %s Config Failed!Last Error = %s\n", strCmd, getErrorCodePrint());
            result = false;
        }
        return result;
    }
    /**
     * 设置单个配置
     *
     * @param hLoginHandle 登陆句柄
     * @param nChn 通道号,-1 表示全通道
     * @param strCmd 配置名称
     * @param cmdObject 配置对应的结构体对象
     * @param nChn         通道号,-1 表示全通道
     * @param strCmd       配置名称
     * @param cmdObject    配置对应的结构体对象
     * @return 成功返回 true
     */
    public static boolean SetDevConfig(NetSDKLib.LLong hLoginHandle, int nChn, String strCmd, Structure cmdObject) {
        boolean result = false;
        int nBufferLen = 2*1024*1024;
        int nBufferLen = 2 * 1024 * 1024;
        byte szBuffer[] = new byte[nBufferLen];
        for(int i=0; i<nBufferLen; i++)szBuffer[i]=0;
        for (int i = 0; i < nBufferLen; i++) szBuffer[i] = 0;
        IntByReference error = new IntByReference(0);
        IntByReference restart = new IntByReference(0);
        cmdObject.write();
        if (configsdk.CLIENT_PacketData(strCmd, cmdObject.getPointer(), cmdObject.size(), szBuffer, nBufferLen)) {
            cmdObject.read();
            if( configsdk.CLIENT_SetNewDevConfig(hLoginHandle, strCmd , nChn , szBuffer, nBufferLen, error, restart, 3000)) {
            if (netsdk.CLIENT_SetNewDevConfig(hLoginHandle, strCmd, nChn, szBuffer, nBufferLen, error, restart, 3000)) {
                result = true;
            } else {
                System.err.printf("Set %s Config Failed! Last Error = %s\n" , strCmd , getErrorCodePrint());
                System.err.printf("Set %s Config Failed! Last Error = %s\n", strCmd, getErrorCodePrint());
                result = false;
            }
        } else {
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/PtzControlModule.java
@@ -2,18 +2,27 @@
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import static com.ruoyi.device.dhsdk.module.LoginModule.netsdk;
/**
 * 云台控制接口实现
 * 主要有 :八个方向控制、变倍、变焦、光圈功能
 */
public class PtzControlModule {
    public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
    /**
     * 按dwPTZCommand类型控制
     */
    public static boolean ptzControl(NetSDKLib.LLong m_hLoginHandle,int nChannelID, int dwPTZCommand,int lParam1, int lParam2,int lParam3, int dwStop) {
        return  netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, nChannelID, dwPTZCommand, lParam1, lParam2, lParam3, dwStop);
    }
    /**
     * 向上
     */
    public static boolean ptzControlUpStart(NetSDKLib.LLong lLoginID, int nChannelID, int lParam1, int lParam2) {
        return netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
    public static boolean ptzControlUpStart(NetSDKLib.LLong m_hLoginHandle, int nChannelID, int lParam1, int lParam2) {
        return netsdk.CLIENT_DHPTZControlEx(m_hLoginHandle, nChannelID,
                NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL,
                lParam1, lParam2, 0, 0);
    }
@@ -72,6 +81,7 @@
    /**
     * 向左上
     */
    public static boolean ptzControlLeftUpStart(int nChannelID, int lParam1, int lParam2) {
        return netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP,
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/RealPlayModule.java
@@ -18,25 +18,14 @@
     * 开始预览
     * \endif
     */
    public static NetSDKLib.LLong startRealPlay(NetSDKLib.LLong m_hLoginHandle, int channel, int stream) {
        NetSDKLib.LLong m_hPlayHandle = netsdk.CLIENT_RealPlayEx(m_hLoginHandle, channel, null, stream);
        if (m_hPlayHandle.longValue() == 0) {
            System.err.println("开始实时预览失败,错误码" + ToolKits.getErrorCodePrint());
        } else {
            System.out.println("Success to start realplay");
            //  netsdk.CLIENT_SetRealDataCallBackEx(m_hPlayHandle, CbfRealDataCallBackEx.getInstance(),null, 0x0000001f);
        }
        return m_hPlayHandle;
    }
    public static NetSDKLib.LLong startRealPlay1(NetSDKLib.LLong m_hLoginHandle, int channel, String path) {
    public static NetSDKLib.LLong startRealPlay(NetSDKLib.LLong m_hLoginHandle, int channel, String path) {
        NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE net_in_realplay_by_data_type = new NetSDKLib.NET_IN_REALPLAY_BY_DATA_TYPE();
        net_in_realplay_by_data_type.nChannelID = channel;
        net_in_realplay_by_data_type.hWnd = null;
        net_in_realplay_by_data_type.rType = 0;
        net_in_realplay_by_data_type.emDataType = NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_MP4;
        net_in_realplay_by_data_type.szSaveFileName = path;
        //net_in_realplay_by_data_type.cbRealData = CbfRealDataCallBackEx.getInstance();
        NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE net_out_realplay_by_data_type = new NetSDKLib.NET_OUT_REALPLAY_BY_DATA_TYPE();
        NetSDKLib.LLong m_hPlayHandle = netsdk.CLIENT_RealPlayByDataType(m_hLoginHandle, net_in_realplay_by_data_type, net_out_realplay_by_data_type, 5000);
        if (m_hPlayHandle.longValue() == 0) {
@@ -49,7 +38,7 @@
    /**
     * \if ENGLISH_LANG
     * Start RealPlay
     * Stop RealPlay
     * \else
     * 停止预览
     * \endif
@@ -110,4 +99,4 @@
            }
        }
    }
}
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/IDhClientService.java
@@ -1,11 +1,7 @@
package com.ruoyi.device.dhsdk.service;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.channel.domain.ArdChannel;
import java.util.List;
import java.util.Map;
/**
@@ -51,7 +47,7 @@
    String record(CameraCmd cmd);
    boolean recordStart(CameraCmd cmd);
    String recordStopToMinio(CameraCmd cmd);
    boolean recordStopNotToMinio(CameraCmd cmd);
    //引导目标位置
    boolean guideTargetPosition(CameraCmd cmd);
@@ -61,4 +57,14 @@
    boolean setPreset(CameraCmd cmd);
    //聚焦模式
    boolean controlFocusMode(CameraCmd cmd);
    //透雾
    boolean controlDefogcfg(CameraCmd cmd);
    //红外
    boolean controlInfrarecfg(CameraCmd cmd);
    //获取聚焦值
    int getFocusPos(CameraCmd cmd);
    //设置聚焦值
    boolean setFocusPos(CameraCmd cmd);
    //获取码流压缩参数
    Map<String, Object> getVideoCompressionCfg(CameraCmd cmd);
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java
@@ -13,17 +13,21 @@
import com.ruoyi.device.dhsdk.common.Res;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.ruoyi.device.dhsdk.lib.NetSDKLib.LLong;
import com.ruoyi.device.dhsdk.lib.enumeration.EM_FOCUS_LIMIT_SELECT_MODE;
import com.ruoyi.device.dhsdk.lib.enumeration.EM_NEW_CONFIG;
import com.ruoyi.device.dhsdk.lib.structure.CFG_VIDEO_IN_FOCUS;
import com.ruoyi.device.dhsdk.lib.structure.CFG_VIDEO_IN_FOCUS_UNIT;
import com.ruoyi.device.dhsdk.module.CapturePictureModule;
import com.ruoyi.device.dhsdk.module.ConfigModule;
import com.ruoyi.device.dhsdk.module.LoginModule;
import com.ruoyi.device.dhsdk.module.RealPlayModule;
import com.ruoyi.device.dhsdk.lib.structure.NET_ENCODE_VIDEO_INFO;
import com.ruoyi.device.dhsdk.module.*;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.device.hiksdk.sdk.HCNetSDK;
import com.ruoyi.media.domain.Vtdu;
import com.ruoyi.media.service.IVtduService;
import com.ruoyi.media.service.impl.VtduServiceImpl;
import com.ruoyi.utils.gis.GisUtil;
import com.ruoyi.utils.minio.MinioUtil;
import com.ruoyi.utils.tools.ArdTool;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -31,20 +35,15 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.*;
import java.text.DecimalFormat;
import java.util.*;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_DEVSTATE_ONLINE;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_DEVSTATE_PTZ_LOCATION;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.*;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL;
import static com.ruoyi.device.dhsdk.lib.ToolKits.getErrorCodePrint;
import static com.ruoyi.device.dhsdk.module.LoginModule.netsdk;
import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.NET_DVR_SET_PTZPOS;
/**
@@ -61,10 +60,11 @@
    private IArdCamerasService ardCamerasService;
    @Resource
    private IArdChannelService ardChannelService;
    @Resource
    private IVtduService vtduService;
    @Value("${minio.endpoint}")
    private String minioEndPoint;
    private Vector<String> chnlist = new Vector<String>();
    // 设备断线通知回调
    private static DisConnect disConnect = new DisConnect();
    // 网络连接恢复
@@ -125,13 +125,39 @@
            GlobalVariable.loginMap.put(camera.getId(), loginId);
            //获取最新通道
            for (int i = 1; i < LoginModule.m_stDeviceInfo.byChanNum + 1; i++) {
                chnlist.add(Res.string().getChannel() + " " + String.valueOf(i));
                ArdChannel channel = new ArdChannel();
                AV_CFG_ChannelName av_cfg_channelName = new AV_CFG_ChannelName();
                boolean b = ConfigModule.GetNewDevConfig(loginId, i - 1, CFG_CMD_CHANNELTITLE, av_cfg_channelName);
                if (b) {
                    String chanName = null;
                    try {
                        chanName = new String(av_cfg_channelName.szName, "GBK").trim();
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    channel.setName(chanName);
                } else {
                    channel.setName("通道" + i);
                }
                channel.setDeviceId(camera.getId());
                channel.setName("通道" + i);
                channel.setId(IdUtils.simpleUUID());
                channel.setChanNo(i);
                ardChannelService.insertArdChannel(channel);
                //配置到流媒体
                String name = camera.getId() + "_" + channel.getChanNo();
                String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + channel.getChanNo() + "&subtype=0";
                Vtdu vtdu = vtduService.selectVtduByName(name);
                if (vtdu != null) {
                    vtduService.deleteVtduByName(name);
                }
                //添加到流媒体
                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 {
            //log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败");
@@ -210,58 +236,58 @@
        switch (code) {
            /*方向*/
            case 1:
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP;
                dwPTZCommand = NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP;
                break;
            case 2:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_UP_CONTROL;
                break;
            case 3:
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP;
                dwPTZCommand = NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP;
                break;
            case 4:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL;
                break;
            case 5:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_LOOP_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_POINT_LOOP_CONTROL;
                break;
            case 6:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL;
                break;
            case 7:
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN;
                dwPTZCommand = NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN;
                break;
            case 8:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL;
                break;
            case 9:
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN;
                dwPTZCommand = NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN;
                break;
            /*焦距*/
            case 10:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL;
                break;
            case 11:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL;
                break;
            /*焦点*/
            case 12:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL;
                break;
            case 13:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL;
                break;
            /*光圈*/
            case 14:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL;
                break;
            case 15:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL;
                break;
            case 16:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LAMP_CONTROL;
                dwPTZCommand = NET_PTZ_ControlType.NET_PTZ_LAMP_CONTROL;
                break;
        }
        boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
        boolean bool = PtzControlModule.ptzControl(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
        if (!bool) {
            log.error("控制失败,请稍后重试" + getErrorCodePrint());
        }
@@ -409,7 +435,7 @@
            if (enable) {
                LLong lRealHandle = new LLong(0);
                if (!GlobalVariable.previewMap.containsKey(cameraId)) {
                    lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo, 0);
                    lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo - 1, path);
                    if (lRealHandle.longValue() <= 0) {
                        log.error("取流失败" + getErrorCodePrint());
                        return "";
@@ -417,15 +443,11 @@
                    log.debug("取流成功");
                    GlobalVariable.previewMap.put(cameraId, lRealHandle.intValue());
                }
                if (!netsdk.CLIENT_SaveRealData(lRealHandle, path)) {
                    log.error("保存视频文件到临时文件夹失败 错误码为:  " + getErrorCodePrint());
                    return "";
                }
                log.debug("录像开始");
            } else {
                if (GlobalVariable.previewMap.containsKey(cameraId)) {
                    LLong lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
                    boolean b = netsdk.CLIENT_StopSaveRealData(lRealHandle);
                    RealPlayModule.stopRealPlay(lRealHandle);
                    GlobalVariable.previewMap.remove(cameraId);
                }
                log.debug("录像停止");
@@ -450,11 +472,11 @@
            LLong lRealHandle;
            if (GlobalVariable.previewMap.containsKey(cameraId)) {
                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
                netsdk.CLIENT_StopRealPlayEx(lRealHandle);
                RealPlayModule.stopRealPlay(lRealHandle);
                GlobalVariable.previewMap.remove(cameraId);
                log.debug("停止当前录像");
            }
            lRealHandle = RealPlayModule.startRealPlay1(loginId, chanNo - 1, path);
            lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo - 1, path);
            if (lRealHandle.longValue() <= 0) {
                log.error("取流失败" + getErrorCodePrint());
            }
@@ -485,7 +507,7 @@
            LLong lRealHandle;
            if (GlobalVariable.previewMap.containsKey(cameraId)) {
                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
                netsdk.CLIENT_StopRealPlayEx(lRealHandle);
                RealPlayModule.stopRealPlay(lRealHandle);
                GlobalVariable.previewMap.remove(cameraId);
                log.debug("停止当前录像");
            }
@@ -503,6 +525,29 @@
            log.error("录像异常" + ex.getMessage());
            return "";
        }
    }
    @Override
    public boolean recordStopNotToMinio(CameraCmd cmd) {
        boolean result = false;
        try {
            String cameraId = cmd.getCameraId();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            LLong lRealHandle;
            if (GlobalVariable.previewMap.containsKey(cameraId)) {
                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
                RealPlayModule.stopRealPlay(lRealHandle);
                GlobalVariable.previewMap.remove(cameraId);
                log.debug("停止当前录像");
            }
            result = true;
        } catch (Exception ex) {
            log.error("录像异常" + ex.getMessage());
        }
        return result;
    }
    /**
@@ -595,14 +640,21 @@
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            CFG_VIDEO_IN_FOCUS cfg_video_in_focus = new CFG_VIDEO_IN_FOCUS();
            CFG_VIDEO_IN_FOCUS_UNIT[] stVideoInFocusUnit = new CFG_VIDEO_IN_FOCUS_UNIT[32];
            if (enable) {
                stVideoInFocusUnit[0].nMode = 4;//手动聚焦
            } else {
                stVideoInFocusUnit[0].nMode = 2;//手动聚焦
            cfg_video_in_focus.nVideoInFocusRealNum = 3;//配置使用个数
            for (int i = 0; i < 3; i++) {
                cfg_video_in_focus.stVideoInFocusUnit[i].nSensitivity = 1;//聚焦灵敏度, 0-高, 1-默认, 2-低
                cfg_video_in_focus.stVideoInFocusUnit[i].nIRCorrection = 2;//红外光聚焦修正, 0-不修正, 1-修正, 2-自动修正
                cfg_video_in_focus.stVideoInFocusUnit[i].nFocusLimit = 10000;//聚焦极限值, 单位毫米
                if (enable) {//聚焦模式, 0-关闭, 1-辅助聚焦, 2-自动聚焦, 3-半自动聚焦, 4-手动聚焦
                    cfg_video_in_focus.stVideoInFocusUnit[i].nMode = 4;//手动聚焦
                    cfg_video_in_focus.stVideoInFocusUnit[i].emFocusMode = 1;//聚焦极限Manual
                } else {
                    cfg_video_in_focus.stVideoInFocusUnit[i].nMode = 2;//自动聚焦
                    cfg_video_in_focus.stVideoInFocusUnit[i].emFocusMode = 0;//聚焦极限Auto
                }
            }
            cfg_video_in_focus.nChannelIndex = chanNo - 1;
            cfg_video_in_focus.stVideoInFocusUnit = stVideoInFocusUnit;
            boolean bool = ConfigModule.SetDevConfig(loginId, chanNo - 1, NetSDKLib.CFG_CMD_VIDEOIN_FOCUS, cfg_video_in_focus);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
@@ -614,6 +666,176 @@
        }
    }
    //透雾
    @Override
    public boolean controlDefogcfg(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        boolean enable = cmd.isEnable();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            EM_NEW_CONFIG config = EM_NEW_CONFIG.CFG_CMD_VIDEOINDEFOG;
            //CFG_VIDEOINDEFOG_LIST cfg_videoindefog_list=new CFG_VIDEOINDEFOG_LIST();
            boolean bool = ConfigModule.SetDevConfig(loginId, chanNo - 1, config.getValue(), null);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
            }
            return bool;
        } catch (Exception ex) {
            log.error("切换透雾异常:" + ex.getMessage());
            return false;
        }
    }
    //红外
    @Override
    public boolean controlInfrarecfg(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        boolean enable = cmd.isEnable();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            CFG_LIGHTING_INFO cfg_lighting_info = new CFG_LIGHTING_INFO();
            cfg_lighting_info.nLightingDetailNum = 1;
            if (enable) {
                cfg_lighting_info.stuLightingDetail[0].emMode = EM_CFG_LIGHTING_MODE.EM_CFG_LIGHTING_MODE_MANUAL;
            } else {
                cfg_lighting_info.stuLightingDetail[0].emMode = EM_CFG_LIGHTING_MODE.EM_CFG_LIGHTING_MODE_OFF;
            }
            boolean bool = ConfigModule.SetDevConfig(loginId, chanNo - 1, CFG_CMD_LIGHTING, cfg_lighting_info);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
            }
            return bool;
        } catch (Exception ex) {
            log.error("切换红外异常:" + ex.getMessage());
            return false;
        }
    }
    //获取聚焦值
    @Override
    public int getFocusPos(CameraCmd cmd) {
        int result = 0;
        try {
            String cameraId = cmd.getCameraId();
            Integer chanNo = cmd.getChanNo();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return result;
            }
            LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
            NET_PTZ_LOCATION_INFO net_ptz_location_info = new NET_PTZ_LOCATION_INFO();
            net_ptz_location_info.nChannelID = chanNo - 1;
            boolean bool = ConfigModule.queryDevState(loginId, NET_DEVSTATE_PTZ_LOCATION, net_ptz_location_info);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
            }
            result = net_ptz_location_info.nFocusMapValue;
        } catch (Exception ex) {
            log.error("获取聚焦值异常:" + ex.getMessage());
        }
        return result;
    }
    //设置聚焦值
    @Override
    public boolean setFocusPos(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        boolean enable = cmd.isEnable();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        try {
            CFG_LIGHTING_INFO cfg_lighting_info = new CFG_LIGHTING_INFO();
            cfg_lighting_info.nLightingDetailNum = 1;
            if (enable) {
                cfg_lighting_info.stuLightingDetail[0].emMode = EM_CFG_LIGHTING_MODE.EM_CFG_LIGHTING_MODE_MANUAL;
            } else {
                cfg_lighting_info.stuLightingDetail[0].emMode = EM_CFG_LIGHTING_MODE.EM_CFG_LIGHTING_MODE_OFF;
            }
            boolean bool = ConfigModule.SetDevConfig(loginId, chanNo - 1, CFG_CMD_LIGHTING, cfg_lighting_info);
            if (!bool) {
                log.error("控制失败,请稍后重试" + getErrorCodePrint());
            }
            return bool;
        } catch (Exception ex) {
            log.error("设置聚焦值异常:" + ex.getMessage());
            return false;
        }
    }
    //获取码流压缩参数
    @Override
    public Map<String, Object> getVideoCompressionCfg(CameraCmd cmd) {
        Map<String, Object> map = new HashMap<>();
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        CFG_ENCODE_INFO cfg_encode_info = new CFG_ENCODE_INFO();
        cfg_encode_info.nChannelID = chanNo - 1;
        boolean b = ConfigModule.GetNewDevConfig(loginId, chanNo - 1, CFG_CMD_ENCODE, cfg_encode_info);
        if (b) {
            int emCompression = cfg_encode_info.stuMainStream[0].stuVideoFormat.emCompression;//视频格式
            String videoEncType = "";
            switch (emCompression) {
                case 0:
                    videoEncType = "MPEG4";
                    break;
                case 1:
                    videoEncType = "MS-MPEG4";
                    break;
                case 2:
                    videoEncType = "MPEG2";
                    break;
                case 3:
                    videoEncType = "MPEG1";
                    break;
                case 4:
                    videoEncType = "H.263";
                    break;
                case 5:
                    videoEncType = "MJPG";
                    break;
                case 6:
                    videoEncType = "FCC-MPEG4";
                    break;
                case 7:
                    videoEncType = "标准h264";
                    break;
                case 8:
                    videoEncType = "标准h265";
                    break;
                case 9:
                    videoEncType = "SVAC";
                    break;
                default:
                    videoEncType = "未知";
                    break;
            }
            int nBitRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nBitRate;
            int nWidth = cfg_encode_info.stuMainStream[0].stuVideoFormat.nWidth;
            int nHeight = cfg_encode_info.stuMainStream[0].stuVideoFormat.nHeight;
            String resolution = nWidth + "*" + nHeight;
            float nFrameRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nFrameRate;
            map.put("resolution", resolution);//分辨率
            map.put("videoBitrate", String.valueOf(nBitRate));//比特率
            map.put("videoEncType", videoEncType);//编码
            map.put("nFrameRate", String.valueOf(nFrameRate));//帧率
        }
        return map;
    }
    // 设备断线回调: 当设备出现断线时,SDK会调用该函数
    private static class DisConnect implements NetSDKLib.fDisConnect {
        public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/HikSdkController.java
@@ -29,7 +29,6 @@
 * @Date: 2023年01月17日 12:04
 * @Version: 1.0
 **/
@Api(tags = "海康SDK接口")
@Controller
@RequestMapping("/hik")
@Anonymous
@@ -45,6 +44,7 @@
    private String preview() {
        return "preview";
    }
    @RequestMapping("/index")
    private String index() {
        return "test";
@@ -115,8 +115,8 @@
    public @ResponseBody
    AjaxResult getFocusPos(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        Map<String, Object> Map = sdk.getFocusPos(cmd);
        return AjaxResult.success("获取聚焦值", Map);
        int focus = sdk.getFocusPos(cmd);
        return AjaxResult.success("获取聚焦值", focus);
    }
    @ApiOperation("设置聚焦值")
@@ -182,25 +182,6 @@
        return toAjax(sdk.setZeroPtz(cmd));
    }
    @ApiOperation("设置锁定")
    @PostMapping("/setPTZLock")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.expired"})
    @Log(title = "设置锁定", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult setPTZLock(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return AjaxResult.success(sdk.controlLock(cmd));
    }
    @ApiOperation("设置解锁")
    @PostMapping("/setPTZUnLock")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId"})
    @Log(title = "设置解锁", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult setPTZUnLock(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return AjaxResult.success(sdk.controlUnLock(cmd));
    }
    @ApiOperation("获取云台锁定信息")
    @PostMapping("/getPTZLockInfo")
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java
@@ -1802,7 +1802,7 @@
    public static class NET_DVR_COMPRESSIONCFG_V30 extends HIKSDKStructure {
        public int dwSize;
        public NET_DVR_COMPRESSION_INFO_V30 struNormHighRecordPara;    //录像 对应8000的普通
        public NET_DVR_COMPRESSION_INFO_V30 struRes;   //保留 String[28];
        public NET_DVR_COMPRESSION_INFO_V30 struRes;                   //保留 String[28];
        public NET_DVR_COMPRESSION_INFO_V30 struEventRecordPara;       //事件触发压缩参数
        public NET_DVR_COMPRESSION_INFO_V30 struNetPara;               //网传(子码流)
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/LoginResultCallBack.java
@@ -68,22 +68,17 @@
                    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 (vtdu != null) {
                        vtduService.deleteVtduByName(name);
                    }
                    //添加到流媒体
                    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);
                }
            }
            //创建引导队列
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
@@ -40,7 +40,7 @@
    boolean setFocusPos(CameraCmd cmd);
    //获取聚焦值
    Map<String, Object> getFocusPos(CameraCmd cmd);
    int getFocusPos(CameraCmd cmd);
    //设置预置位
    boolean setPreset(CameraCmd cmd);
@@ -49,12 +49,12 @@
    boolean gotoPreset(CameraCmd cmd);
    //获取码流压缩参数
    Map<String, String> getVideoCompressionCfg(CameraCmd cmd);
    Map<String, Object> getVideoCompressionCfg(CameraCmd cmd);
    //透雾
    boolean controlDefogcfg(CameraCmd cmd);
    //红外?
    //红外
    boolean controlInfrarecfg(CameraCmd cmd);
    //聚焦模式
@@ -68,12 +68,6 @@
    //镜头除冰
    boolean controlCameraDeicing(CameraCmd cmd);
    //配置锁定
    boolean controlLock(CameraCmd cmd);
    //配置解锁
    boolean controlUnLock(CameraCmd cmd);
    //获取云台锁定信息
    int getPTZLockInfo(CameraCmd cmd);
@@ -109,7 +103,7 @@
    String recordStopToMinio(CameraCmd cmd);
    //停止录像-不上传minio
    void recordStopNotToMinio(CameraCmd cmd);
    boolean recordStopNotToMinio(CameraCmd cmd);
    //获取相机通道信息
    public List<ArdChannel> getCameraChannelList(ArdCameras camera);
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -5,7 +5,6 @@
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;
@@ -26,9 +25,7 @@
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Base64;
import javax.annotation.Resource;
import java.io.*;
@@ -184,22 +181,17 @@
                    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 (vtdu != null) {
                        vtduService.deleteVtduByName(name);
                    }
                    //添加到流媒体
                    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);
                }
            }
            //创建引导队列
@@ -285,7 +277,7 @@
            for (ArdCameras camera : ardCameras) {
                Thread.sleep(500);
                //异步登录
                asyncLogin(camera);
                syncLogin(camera);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
@@ -305,7 +297,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        boolean b = hCNetSDK.NET_DVR_Logout(userId);
        if (b) {
            GlobalVariable.loginMap.remove(cameraId);
@@ -325,7 +317,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
            return hCNetSDK.NET_DVR_RemoteControl(userId, NET_DVR_CHECK_USER_STATUS, null, 0);
        } catch (Exception ex) {
            log.error("检测在线异常:" + ex.getMessage());
@@ -344,7 +336,6 @@
     * @修改人和其它信息
     */
    @Override
    @SdkOperate
    public boolean pTZControlWithSpeed(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        boolean enable = cmd.isEnable();
@@ -354,7 +345,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        int dwStop;
        if (enable) {
            dwStop = 0;//开启
@@ -431,7 +422,6 @@
     * @param cmd 相机命令
     */
    @Override
    @SdkOperate
    public boolean setFocusPos(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -440,7 +430,7 @@
            return false;
        }
        // 获取参数
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) 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;
@@ -467,14 +457,15 @@
     * @param cmd 相机命令
     */
    @Override
    public Map<String, Object> getFocusPos(CameraCmd cmd) {
    public int getFocusPos(CameraCmd cmd) {
        int result = 0;
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return new HashMap<>();
            return result;
        }
        // 获取参数
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) 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();
        struStdCfg.read();
@@ -488,13 +479,12 @@
        if (!bool) {
            int code = hCNetSDK.NET_DVR_GetLastError();
            log.error("获取GIS信息数据失败,请稍后重试" + code);
            return new HashMap<>();
            return result;
        } else {
            struGisInfo.read();
            Map<String, Object> map = new HashMap<>();
            map.put("dwFocus", struGisInfo.struPtzPosEx.dwFocus);
            return map;
            result = struGisInfo.struPtzPosEx.dwFocus;
        }
        return result;
    }
    /**
@@ -503,7 +493,6 @@
     * @param cmd 相机命令
     */
    @Override
    @SdkOperate
    public boolean setPreset(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -511,7 +500,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        boolean bool = hCNetSDK.NET_DVR_PTZPreset_Other(userId, channelNum, SET_PRESET, PresetIndex);
        if (!bool) {
            int code = hCNetSDK.NET_DVR_GetLastError();
@@ -526,7 +515,6 @@
     * @param cmd 相机命令
     */
    @Override
    @SdkOperate
    public boolean gotoPreset(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -534,7 +522,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        boolean bool = hCNetSDK.NET_DVR_PTZPreset_Other(userId, channelNum, GOTO_PRESET, PresetIndex);
        if (!bool) {
            int code = hCNetSDK.NET_DVR_GetLastError();
@@ -552,15 +540,15 @@
     * @修改人和其它信息
     */
    @Override
    public Map<String, String> getVideoCompressionCfg(CameraCmd cmd) {
    public Map<String, Object> getVideoCompressionCfg(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer chanNo = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        Map<String, String> map = new HashMap<>();
        Map<String, Object> map = new HashMap<>();
        NET_DVR_COMPRESSIONCFG_V30 compressioncfg = new NET_DVR_COMPRESSIONCFG_V30();
        compressioncfg.write();
        Pointer pioint = compressioncfg.getPointer();
@@ -617,85 +605,85 @@
                        videoBitrate = "保留";
                        break;
                    case 1:
                        videoBitrate = "16K(保留)";
                        videoBitrate = "16(保留)";
                        break;
                    case 2:
                        videoBitrate = "32K";
                        videoBitrate = "32";
                        break;
                    case 3:
                        videoBitrate = "48k";
                        videoBitrate = "48";
                        break;
                    case 4:
                        videoBitrate = "64k";
                        videoBitrate = "64";
                        break;
                    case 5:
                        videoBitrate = "80k";
                        videoBitrate = "80";
                        break;
                    case 6:
                        videoBitrate = "96k";
                        videoBitrate = "96";
                        break;
                    case 7:
                        videoBitrate = "128k";
                        videoBitrate = "128";
                        break;
                    case 8:
                        videoBitrate = "160k";
                        videoBitrate = "160";
                        break;
                    case 9:
                        videoBitrate = "192k";
                        videoBitrate = "192";
                        break;
                    case 10:
                        videoBitrate = "224k";
                        videoBitrate = "224";
                        break;
                    case 11:
                        videoBitrate = "256K";
                        videoBitrate = "256";
                        break;
                    case 12:
                        videoBitrate = "320K";
                        videoBitrate = "320";
                        break;
                    case 13:
                        videoBitrate = "384K";
                        videoBitrate = "384";
                        break;
                    case 14:
                        videoBitrate = "448K";
                        videoBitrate = "448";
                        break;
                    case 15:
                        videoBitrate = "512K";
                        videoBitrate = "512";
                        break;
                    case 16:
                        videoBitrate = "640K";
                        videoBitrate = "640";
                        break;
                    case 17:
                        videoBitrate = "768K";
                        videoBitrate = "768";
                        break;
                    case 18:
                        videoBitrate = "896K";
                        videoBitrate = "896";
                        break;
                    case 19:
                        videoBitrate = "1024K";
                        videoBitrate = "1024";
                        break;
                    case 20:
                        videoBitrate = "1280K";
                        videoBitrate = "1280";
                        break;
                    case 21:
                        videoBitrate = "1536K";
                        videoBitrate = "1536";
                        break;
                    case 22:
                        videoBitrate = "1792K";
                        videoBitrate = "1792";
                        break;
                    case 23:
                        videoBitrate = "2048K";
                        break;
                    case 24:
                        videoBitrate = "3072K";
                        videoBitrate = "3072";
                        break;
                    case 25:
                        videoBitrate = "4096K";
                        videoBitrate = "4096";
                        break;
                    case 26:
                        videoBitrate = "8192K";
                        videoBitrate = "8192";
                        break;
                    case 27:
                        videoBitrate = "16384K";
                        videoBitrate = "16384";
                        break;
                    default:
                        videoBitrate = "其他";
@@ -705,43 +693,43 @@
                String resolution = "";
                switch (compressioncfg.struNormHighRecordPara.byResolution) {
                    case 0:
                        resolution = "DCIF(528*384/528*320)";
                        resolution = "528*384/528*320";
                        break;
                    case 1:
                        resolution = "CIF(352*288/352*240)";
                        resolution = "352*288/352*240";
                        break;
                    case 2:
                        resolution = "QCIF(176*144/176*120)";
                        resolution = "176*144/176*120";
                        break;
                    case 3:
                        resolution = "4CIF(704*576/704*480)";
                        resolution = "704*576/704*480";
                        break;
                    case 4:
                        resolution = "2CIF(704*288/704*240)";
                        resolution = "704*288/704*240";
                        break;
                    case 6:
                        resolution = "QVGA(320*240)";
                        resolution = "320*240";
                        break;
                    case 7:
                        resolution = "QQVGA(160*120)";
                        resolution = "160*120";
                        break;
                    case 16:
                        resolution = "VGA(640*480)";
                        resolution = "640*480";
                        break;
                    case 17:
                        resolution = "UXGA(1600*1200)";
                        resolution = "1600*1200";
                        break;
                    case 18:
                        resolution = "SVGA(800*600)";
                        resolution = "800*600";
                        break;
                    case 19:
                        resolution = "HD720P(1280*720)";
                        resolution = "1280*720";
                        break;
                    case 20:
                        resolution = "XVGA(1280*960)";
                        resolution = "1280*960";
                        break;
                    case 21:
                        resolution = "HD900P(1600*900)";
                        resolution = "1600*900";
                        break;
                    case 22:
                        resolution = "1360*1024";
@@ -753,7 +741,7 @@
                        resolution = "1920*1920";
                        break;
                    case 27:
                        resolution = "1920*1080p";
                        resolution = "1920*1080";
                        break;
                    case 28:
                        resolution = "2560*1920";
@@ -768,10 +756,80 @@
                        resolution = "不在当前分辨率索引,请联系管理员添加";
                        break;
                }
                map.put("resolution", resolution);
                map.put("videoBitrate", videoBitrate);
                map.put("videoEncType", videoEncType);
                map.put("streamType", streamType);
                //帧率
                String nFrameRate = "";
                switch (compressioncfg.struNormHighRecordPara.dwVideoFrameRate) {
                    case 0:
                        nFrameRate = "0";
                        break;
                    case 1:
                        nFrameRate = "1/16";
                        break;
                    case 2:
                        nFrameRate = "1/8";
                        break;
                    case 3:
                        nFrameRate = "1/4";
                        break;
                    case 4:
                        nFrameRate = "1/2";
                        break;
                    case 5:
                        nFrameRate = "1";
                        break;
                    case 6:
                        nFrameRate = "2";
                        break;
                    case 7:
                        nFrameRate = "4";
                        break;
                    case 8:
                        nFrameRate = "6";
                        break;
                    case 9:
                        nFrameRate = "8";
                        break;
                    case 10:
                        nFrameRate = "10";
                        break;
                    case 11:
                        nFrameRate = "12";
                        break;
                    case 12:
                        nFrameRate = "16";
                        break;
                    case 13:
                        nFrameRate = "20";
                        break;
                    case 14:
                        nFrameRate = "15";
                        break;
                    case 15:
                        nFrameRate = "18";
                        break;
                    case 16:
                        nFrameRate = "22";
                        break;
                    case 17:
                        nFrameRate = "25";
                        break;
                    case 18:
                        nFrameRate = "30";
                        break;
                    case 19:
                        nFrameRate = "35";
                        break;
                    case 20:
                        nFrameRate = "40";
                        break;
                    default:
                        nFrameRate = "未知";
                        break;
                }
                map.put("resolution", resolution);//分辨率
                map.put("videoBitrate", videoBitrate);//比特率
                map.put("videoEncType", videoEncType);//编码
                map.put("nFrameRate", nFrameRate);//帧率
            } else {
                int code = hCNetSDK.NET_DVR_GetLastError();
@@ -798,7 +856,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return new HashMap<>();
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
        Pointer pioint = m_ptzPosCurrent.getPointer();
@@ -842,7 +900,6 @@
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    @Override
    @SdkOperate
    public boolean setPtz(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -850,13 +907,13 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
        m_ptzPosCurrent.wAction = 1;
        try {
            String p = String.valueOf((int)(ptz.get("p") * 10));
            String t = String.valueOf((int)(ptz.get("t") * 10));
            String z = String.valueOf((int)(ptz.get("z") * 10));
            String p = String.valueOf((int) (ptz.get("p") * 10));
            String t = String.valueOf((int) (ptz.get("t") * 10));
            String z = String.valueOf((int) (ptz.get("z") * 10));
            m_ptzPosCurrent.wPanPos = (short) (Integer.parseInt(p, 16));
            m_ptzPosCurrent.wTiltPos = (short) (Integer.parseInt(t, 16));
            m_ptzPosCurrent.wZoomPos = (short) (Integer.parseInt(z, 16));
@@ -875,14 +932,13 @@
    }
    @Override
    @SdkOperate
    public boolean guideTargetPosition(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
        m_ptzPosCurrent.wAction = 1;
        try {
@@ -910,49 +966,6 @@
        }
    }
    /**
     * @描述 操控锁定
     * @参数 [userId, channelNum]
     * @返回值 boolean
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:36
     * @修改人和其它信息 0-解锁 1-锁定
     */
    @Override
    @SdkOperate
    public boolean controlLock(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();//申请锁的相机
        ArdCameras ardCameras = ardCamerasService.selectArdCamerasById(cameraId);
        Date now = new Date();
        now.setTime(now.getTime() + cmd.getExpired() * 1000);
        ardCameras.setOperatorExpired(now);//设置当前过期时间
        ardCamerasService.updateArdCameras(ardCameras);
        return true;
    }
    /**
     * @描述 操控解锁
     * @参数 [userId, channelNum]
     * @返回值 boolean
     * @创建人 刘苏义
     * @创建时间 2023/6/30 15:36
     * @修改人和其它信息
     */
    @Override
    public boolean controlUnLock(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();//申请解锁的相机
        String operator = cmd.getOperator();//申请者
        ArdCameras ardCameras = ardCamerasService.selectArdCamerasById(cameraId);
        if (ardCameras.getOperatorId().equals(operator)) {
            //如果解锁相机的当前用户是申请者,则清空该相机的过期时间
            ardCameras.setOperatorExpired(null);
            int i = ardCamerasService.updateArdCameras(ardCameras);
            if (i > 0) {
                log.debug(cameraId + "--解锁成功");
            }
        }
        return true;
    }
    /**
     * @描述 获取ptz锁定信息
@@ -969,7 +982,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return -1;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZ_LOCKCFG netDvrPtzLockcfg = new NET_DVR_PTZ_LOCKCFG();
        Pointer point = netDvrPtzLockcfg.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1001,7 +1014,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_INITIALPOSITIONCTRL initialpositionctrl = new NET_DVR_INITIALPOSITIONCTRL();
        initialpositionctrl.dwSize = initialpositionctrl.size();
@@ -1033,7 +1046,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return new HashMap<>();
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZSCOPE m_ptzPosCurrent = new NET_DVR_PTZSCOPE();
        Pointer point = m_ptzPosCurrent.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1082,7 +1095,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_CAMERAPARAMCFG_EX struCameraParam = new NET_DVR_CAMERAPARAMCFG_EX();
        Pointer point = struCameraParam.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1128,7 +1141,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_CAMERAPARAMCFG_EX struDayNigh = new NET_DVR_CAMERAPARAMCFG_EX();
        Pointer point = struDayNigh.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1176,7 +1189,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_FOCUSMODE_CFG struFocusMode = new NET_DVR_FOCUSMODE_CFG();
        Pointer point = struFocusMode.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1219,7 +1232,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return "";
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_FOCUSMODE_CFG struFocusMode = new NET_DVR_FOCUSMODE_CFG();
        Pointer point = struFocusMode.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1249,7 +1262,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        int dwStop;
        if (enable) {
            dwStop = 0;//开启
@@ -1282,7 +1295,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_DEVSERVER_CFG struDeicing = new NET_DVR_DEVSERVER_CFG();
        Pointer point = struDeicing.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1319,7 +1332,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return "";
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        NET_DVR_WORKSTATE_V30 devwork = new NET_DVR_WORKSTATE_V30();
        if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(userId, devwork)) {
            // 返回Boolean值,判断是否获取设备能力
@@ -1362,7 +1375,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return "";
        }
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
        //图片信息
        NET_DVR_JPEGPARA jpeg = new NET_DVR_JPEGPARA();
        //设置图片分辨率
@@ -1426,7 +1439,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return "";
            }
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
            //强制I帧结构体对象
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
@@ -1472,7 +1485,7 @@
                log.debug("录像停止");
                //存入minio
                String BucketName = "record";
                String ObjectName =IdUtils.simpleUUID() + ".mp4";
                String ObjectName = IdUtils.simpleUUID() + ".mp4";
                FileInputStream stream = new FileInputStream(path);
                boolean b = MinioUtil.uploadObject(BucketName, ObjectName, stream, stream.available(), "video/MP4");
                if (b) {
@@ -1496,7 +1509,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
            //强制I帧结构体对象
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
@@ -1553,7 +1566,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return "";
            }
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
            //region 强制I帧
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
@@ -1599,14 +1612,15 @@
    }
    @Override
    public void recordStopNotToMinio(CameraCmd cmd) {
    public boolean recordStopNotToMinio(CameraCmd cmd) {
        boolean result = false;
        try {
            String cameraId = cmd.getCameraId();
            Integer channelNum = cmd.getChanNo();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return;
                return false;
            }
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer) GlobalVariable.loginMap.get(cameraId);
            //强制I帧结构体对象
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
@@ -1633,9 +1647,12 @@
                GlobalVariable.previewMap.remove(cameraId);
            }
            log.debug("录像停止");
            result = true;
        } catch (Exception ex) {
            log.error("录像停止异常" + ex.getMessage());
            result = false;
        }
        return result;
    }
    //获取IP通道
@@ -1691,7 +1708,7 @@
            return new HashMap<>();
        }
        // 获取参数
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer) 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();
        struStdCfg.read();
ard-work/src/main/java/com/ruoyi/media/controller/MediaController.java
@@ -85,7 +85,9 @@
        vtdu.setRtspUrl(map.get("rtspUrl"));
        vtdu.setRtmpUrl(map.get("rtmpUrl"));
        vtdu.setWebrtcUrl(map.get("webrtcUrl"));
        vtduService.updateVtdu(vtdu);
        //vtduService.updateVtdu(vtdu);
        vtduService.deleteVtduByName(vtdu.getName());
        vtduService.insertVtdu(vtdu);
        return AjaxResult.success(map);
    }
ard-work/src/main/java/com/ruoyi/media/controller/VtduController.java
@@ -6,6 +6,8 @@
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.media.service.IMediaService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
@@ -38,7 +40,8 @@
{
    @Autowired
    private IVtduService vtduService;
    @Resource
    private ICameraSdkService cameraSdkService;
    /**
     * 查询流媒体管理列表
     */
@@ -71,6 +74,27 @@
    @GetMapping(value = "/{name}")
    public AjaxResult getInfo(@PathVariable("name") String name)
    {
        //region 自动转码
        String[] nameArray = name.split("_");
        String cameraId=nameArray[0];
        Integer chanNo=Integer.valueOf(nameArray[1]);
        CameraCmd cmd=new CameraCmd();
        cmd.setCameraId(cameraId);
        cmd.setChanNo(chanNo);
        Map<String, Object> videoCompressionCfg = cameraSdkService.getVideoCompressionCfg(cmd);
        String videoEncType = (String)videoCompressionCfg.get("videoEncType");
        Vtdu vtdu = vtduService.selectVtduByName(name);
        if(!videoEncType.equals("标准h264"))
        {
             vtdu.setIsCode("1");
        }
        else
        {
            vtdu.setIsCode("0");
        }
        vtduService.deleteVtduByName(name);
        vtduService.insertVtdu(vtdu);
        //endregion
        return success(vtduService.selectVtduByName(name));
    }
ard-work/src/main/java/com/ruoyi/media/service/IMediaService.java
@@ -40,6 +40,8 @@
    List<String> getNameList();
    boolean checkNameExist(String name);
    RtspSession getRtspSessionById(String sessionId);
    WebrtcSession getWebrtcSessionById(String sessionId);
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaServiceImpl.java
@@ -84,14 +84,14 @@
        mediaInfo.setMaxReaders(100);
        mediaInfo.setSourceprotocol("tcp");
        List<String> nameList=new ArrayList<>();
        List<String> nameList = new ArrayList<>();
        String paths = mediaClient.paths();
        JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class);
        List<Items> items = jsonsRoot.getItems();
        for (Items item : items) {
            nameList.add(item.getName());
        }
        if(!nameList.contains(name)) {
        if (!nameList.contains(name)) {
            mediaClient.addPath(name, mediaInfo);
        }
        Map<String, String> map = new HashMap<>();
@@ -127,9 +127,10 @@
            mediaInfo.setMaxReaders(100);
            mediaInfo.setSourceprotocol("tcp");
            mediaClient.editPath(name, mediaInfo);
            if (checkNameExist(name)) {
                mediaClient.editPath(name, mediaInfo);
            }
            // Map<String,String> map=new HashMap<>();
            map.put("rtspUrl", rtspUrl);
            map.put("rtmpUrl", rtmpUrl);
            map.put("webrtcUrl", webrtcUrl);
@@ -169,13 +170,16 @@
    @Override
    public void removePath(String[] names) {
        for (String name : names) {
            mediaClient.removePath(name);
            if(checkNameExist(name)) {
            mediaClient.removePath(name);}
        }
    }
    @Override
    public void removePath(String name) {
        mediaClient.removePath(name);
        if(checkNameExist(name)) {
            mediaClient.removePath(name);
        }
    }
    @Override
@@ -448,22 +452,45 @@
            return false;
        }
    }
    /**
     *  获取流媒体name列表
     * 获取流媒体name列表
     * 刘苏义
     * 2023/10/13 14:19:07
     */
    @Override
    public List<String> getNameList() {
        List<String> nameList=new ArrayList<>();
        String paths = mediaClient.paths();
        JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class);
        List<Items> items = jsonsRoot.getItems();
        for (Items item : items) {
            nameList.add(item.getName());
        List<String> nameList = new ArrayList<>();
        try {
            String paths = mediaClient.paths();
            JsonsRoot jsonsRoot = JSONObject.parseObject(paths, JsonsRoot.class);
            List<Items> items = jsonsRoot.getItems();
            for (Items item : items) {
                nameList.add(item.getName());
            }
        }
        catch (Exception ex)
        {
            log.error(ex.getMessage());
        }
        return nameList;
    }
    /**
     * 检查名称是否存在
     * 刘苏义
     * 2023/10/19 15:18:45
     */
    @Override
    public boolean checkNameExist(String name) {
        boolean result = false;
        List<String> nameList = getNameList();
        if (nameList.contains(name)) {
            result = true;
        }
        return result;
    }
    /**
     * 配置流媒体参数
     */
ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java
@@ -9,6 +9,8 @@
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.ICameraSdkService;
import com.ruoyi.media.service.IMediaService;
import com.ruoyi.utils.forest.MediaClient;
import lombok.extern.slf4j.Slf4j;
@@ -43,6 +45,7 @@
     */
    @Override
    public Vtdu selectVtduByName(String name) {
        return vtduMapper.selectVtduByName(name);
    }
@@ -121,6 +124,7 @@
     */
    @Override
    public int deleteVtduByName(String name) {
        mediaService.removePath(name);
        return vtduMapper.deleteVtduByName(name);
    }
ard-work/src/main/java/com/ruoyi/utils/tools/ArdTool.java
@@ -1,9 +1,7 @@
package com.ruoyi.utils.tools;
import com.ruoyi.common.core.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.text.DecimalFormat;
import java.time.LocalTime;
@@ -121,4 +119,18 @@
        int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
        return new DecimalFormat("#,###.##").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
    }
    /**
     * byte数组转字符串
     * 刘苏义
     * 2023/10/18 8:42:59
     * @param byteArray
     */
    public static String byteArrayToString(byte[] byteArray) {
        StringBuilder stringBuilder = new StringBuilder();
        for (byte b : byteArray) {
            stringBuilder.append(String.valueOf(b));
        }
        return stringBuilder.toString();
    }
}
ard-work/src/main/resources/templates/test.html
@@ -136,7 +136,7 @@
    window.onload = function () {
        console.log(RTCRtpReceiver.getCapabilities('video').codecs)
        $.ajax({
            url: "../hik/list",
            url: "../cameraSdk/list",
            type: "get",
            success: function (data) {
                console.log(data);
@@ -144,7 +144,8 @@
                for (var i = 0; i < arr.length; i++) {
                    console.log(arr[i].id);
                    var camera = {
                        type: arr[i].gdtype,
                        name: arr[i].name,
                        factory: arr[i].factory,
                        ipaddr: arr[i].ip,
                        username: arr[i].username,
                        password: arr[i].password,
@@ -183,125 +184,125 @@
    }
    //云台上下左右
    $("#up").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 2;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#up").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 2;
        var enable = false;
        commondMethod(url, code, enable);
    })
    $("#down").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 8;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#down").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 8;
        var enable = false;
        commondMethod(url, code, enable);
    })
    $("#left").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 4;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#left").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 4;
        var enable = false;
        commondMethod(url, code, enable);
    })
    $("#right").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 6;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#right").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 6;
        var enable = false;
        commondMethod(url, code, enable);
    })
    //变倍
    $("#controlZoomIn").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 10;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#controlZoomIn").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 10;
        var enable = false;
        commondMethod(url, code, enable);
    })
    $("#controlZoomOut").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 11;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#controlZoomOut").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 11;
        var enable = false;
        commondMethod(url, code, enable);
    })
    //变焦
    $("#controlFocusNear").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 12;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#controlFocusNear").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 12;
        var enable = false;
        commondMethod(url, code, enable);
    })
    $("#controlFocusFar").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 13;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#controlFocusFar").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 13;
        var enable = false;
        commondMethod(url, code, enable);
    })
    //光圈
    $("#controlIrisOpen").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 14;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#controlIrisOpen").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 14;
        var enable = false;
        commondMethod(url, code, enable);
    })
    $("#controlIrisClose").mousedown(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 15;
        var enable = true;
        commondMethod(url, code, enable);
    })
    $("#controlIrisClose").mouseup(function () {
        var url = "../hik/PTZControlWithSpeed";
        var url = "../cameraSdk/PTZControlWithSpeed";
        var code = 15;
        var enable = false;
        commondMethod(url, code, enable);
@@ -316,7 +317,7 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/setPreset",
            url: "../cameraSdk/setPreset",
            type: "post",
            dataType: "json",
            data: JSON.stringify(opt),
@@ -334,7 +335,7 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/gotoPreset",
            url: "../cameraSdk/gotoPreset",
            type: "post",
            dataType: "json",
            data: JSON.stringify(opt),
@@ -352,7 +353,7 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/getPTZ",
            url: "../cameraSdk/getPTZ",
            type: "post",
            dataType: "json",
            data: JSON.stringify(opt),
@@ -386,7 +387,7 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/setPTZ",
            url: "../cameraSdk/setPTZ",
            type: "post",
            dataType: "json",
            data: JSON.stringify(myEntity),
@@ -414,7 +415,7 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/setTargetPosition",
            url: "../cameraSdk/setTargetPosition",
            type: "post",
            dataType: "json",
            data: JSON.stringify(myEntity),
@@ -432,7 +433,7 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/setZeroPTZ",
            url: "../cameraSdk/setZeroPTZ",
            type: "post",
            dataType: "json",
            data: JSON.stringify(opt),
@@ -450,7 +451,7 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/PTZControlWithSpeed",
            url: "../cameraSdk/PTZControlWithSpeed",
            type: "post",
            dataType: "json",
            data: JSON.stringify(opt),
@@ -473,7 +474,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/defogcfg",
                url: "../cameraSdk/defogcfg",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optOpen),
@@ -490,7 +491,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/defogcfg",
                url: "../cameraSdk/defogcfg",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optClose),
@@ -515,7 +516,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/infrarecfg",
                url: "../cameraSdk/infrarecfg",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optOpen),
@@ -533,7 +534,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/infrarecfg",
                url: "../cameraSdk/infrarecfg",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optClose),
@@ -557,7 +558,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/focusMode",
                url: "../cameraSdk/focusMode",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optOpen),
@@ -574,7 +575,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/focusMode",
                url: "../cameraSdk/focusMode",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optClose),
@@ -593,13 +594,13 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/getFocusPos",
                url: "../cameraSdk/getFocusPos",
                type: "post",
                dataType: "json",
                data: JSON.stringify(opt),
                success: function (datas) {
                    console.log(datas);
                    $("#focus").val(datas.data.dwFocus);
                    $("#focus").val(datas.data);
                }
            })
    })
@@ -617,7 +618,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/heateRpwron",
                url: "../cameraSdk/heateRpwron",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optOpen),
@@ -634,7 +635,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/heateRpwron",
                url: "../cameraSdk/heateRpwron",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optClose),
@@ -657,7 +658,7 @@
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                },
                url: "../hik/cameraDeicing",
                url: "../cameraSdk/cameraDeicing",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optOpen),
@@ -674,7 +675,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/cameraDeicing",
                url: "../cameraSdk/cameraDeicing",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optClose),
@@ -693,7 +694,7 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/captureJPEGPicture",
            url: "../cameraSdk/captureJPEGPicture",
            type: "post",
            dataType: "json",
            data: JSON.stringify(opt),
@@ -712,13 +713,16 @@
                'Content-Type': 'application/json',
                'Authorization': token
            },
            url: "../hik/picCutCate",
            url: "../cameraSdk/picCutCate",
            type: "post",
            dataType: "json",
            data: JSON.stringify(opt),
            success: function (data) {
                console.log(data.data);
                $('#imgContainer').attr('src', data.data);
                setTimeout(() => {
                    $('#imgContainer').attr('src', data.data);
                }, 1000 )
            }
        })
    })
@@ -736,7 +740,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/record",
                url: "../cameraSdk/record",
                type: "post",
                dataType: "json",
                data: JSON.stringify(optOpen),
@@ -753,7 +757,7 @@
                    'Content-Type': 'application/json',
                    'Authorization': token
                },
                url: "../hik/record",
                url: "../cameraSdk/record",
                dataType: "json",
                data: JSON.stringify(optClose),
                type: "post",
@@ -769,7 +773,7 @@
    /*云台公共方法*/
    function commondMethod(url, code, enable) {
        cameraId = $('#select option:selected').val();
        opt = {"cameraId": cameraId, "chanNo": 1, "speed": 8, "enable": enable, "code": code};
        opt = {"cameraId": cameraId, "chanNo": 1, "speed": 4, "enable": enable, "code": code};
        $.ajax({
            headers: {
                'Accept': 'application/json',
@@ -797,9 +801,9 @@
            var cameraId = $('#select option:selected').val();
            let camera = cameraMap.get(cameraId);
            console.log(camera);
            if (camera.type == "ys") {
            if (camera.factory == "3") {
                realViewYs("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port);
            } else if (camera.type == "dh") {
            } else if (camera.factory == "2") {
                realViewDh("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port);
            } else {
                realViewHik("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port);
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java
@@ -6,6 +6,7 @@
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.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.media.domain.Items;
import com.ruoyi.media.domain.JsonsRoot;
@@ -37,7 +38,9 @@
    @Resource
    IArdCamerasService iArdCamerasService;
    @Resource
    IHikClientService iHikClientService;
    IHikClientService hikClientService;
    @Resource
    IDhClientService dhClientService;
    @Resource
    IVtduService vtduService;
    @Resource
@@ -50,15 +53,20 @@
     */
    public void cameraState() {
        try {
            ArdCameras ardCamera = new ArdCameras();
            ardCamera.setFactory("1");
           ArdCameras ardCamera = new ArdCameras();
            //调用查询方法
            List<ArdCameras> ardCameras = iArdCamerasService.selectArdCamerasListNoDataScope(ardCamera);
            for (ArdCameras camera : ardCameras) {
                CameraCmd cmd = new CameraCmd();
                cmd.setCameraId(camera.getId());
                boolean onLineNew = iHikClientService.isOnLine(cmd);//相机实时状态
                boolean onLineOld = "1".equals(camera.getState());//相机历史状态
                //当状态发生变化时,更新实时状态
                boolean onLineNew = false;
                // 判断是1还是2
                if (camera.getFactory().equals("1")) {
                    onLineNew = hikClientService.isOnLine(cmd);
                } else if (camera.getFactory().equals("2")) {
                    onLineNew = dhClientService.isOnLine(cmd);
                }
                boolean onLineOld = "1".equals(camera.getState());
                if (onLineNew != onLineOld) {
                    if (onLineNew) {
                        camera.setState("1");
@@ -67,7 +75,6 @@
                    }
                    iArdCamerasService.updateArdCameras(camera);
                }
            }
        } catch (Exception ex) {
            log.error("同步相机在线状态异常:" + ex.getMessage());
@@ -107,10 +114,11 @@
     * 2023/10/13 14:13:53
     */
    public void vtdu() {
        List<String> nameList = mediaService.getNameList();
        List<Vtdu> vtdus = vtduService.selectVtduList(new Vtdu());
        for (Vtdu vtdu : vtdus) {
            if (!nameList.contains(vtdu.getName())) {
            boolean nameExist = mediaService.checkNameExist(vtdu.getName());
            if (!nameExist) {
                mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
            }
        }