‘liusuyi’
2023-05-31 6a582d3819e27e9b0866489196046499c8a51ea8
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -135,8 +135,7 @@
            hCNetSDK.NET_DVR_Cleanup();
            camera.setLoginId(-1);
        }
        if(globalVariable.loginMap.containsKey(camera.getId()))
        {
        if (globalVariable.loginMap.containsKey(camera.getId())) {
            globalVariable.loginMap.remove(camera.getId());
        }
        globalVariable.loginMap.put(camera.getId(), lUserID);
@@ -223,6 +222,7 @@
        boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(userId, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0);
        return isOnLine;
    }
    /**
     * @描述 带速度的云台控制操作
     * Code:1-左上 2-上 3-右上 4-左 5-巡航 6-右 7-左下 8-下 9-右下 10-焦距变大 11-焦距变小
@@ -252,29 +252,60 @@
            dwStop = 1;//关闭
        }
        Integer dwPTZCommand=-1;
        switch (code)
        {
        switch (code) {
            /*方向*/
            case 1:dwPTZCommand=HCNetSDK.UP_LEFT;break;
            case 2:dwPTZCommand=HCNetSDK.TILT_UP;break;
            case 3:dwPTZCommand=HCNetSDK.UP_RIGHT;break;
            case 4:dwPTZCommand=HCNetSDK.PAN_LEFT;break;
            case 5:dwPTZCommand=HCNetSDK.RUN_SEQ;break;
            case 6:dwPTZCommand=HCNetSDK.PAN_RIGHT;break;
            case 7:dwPTZCommand=HCNetSDK.DOWN_LEFT;break;
            case 8:dwPTZCommand=HCNetSDK.TILT_DOWN;break;
            case 9:dwPTZCommand=HCNetSDK.DOWN_RIGHT;break;
            case 1:
                dwPTZCommand = HCNetSDK.UP_LEFT;
                break;
            case 2:
                dwPTZCommand = HCNetSDK.TILT_UP;
                break;
            case 3:
                dwPTZCommand = HCNetSDK.UP_RIGHT;
                break;
            case 4:
                dwPTZCommand = HCNetSDK.PAN_LEFT;
                break;
            case 5:
                dwPTZCommand = HCNetSDK.RUN_SEQ;
                break;
            case 6:
                dwPTZCommand = HCNetSDK.PAN_RIGHT;
                break;
            case 7:
                dwPTZCommand = HCNetSDK.DOWN_LEFT;
                break;
            case 8:
                dwPTZCommand = HCNetSDK.TILT_DOWN;
                break;
            case 9:
                dwPTZCommand = HCNetSDK.DOWN_RIGHT;
                break;
            /*焦距*/
            case 10:dwPTZCommand=HCNetSDK.ZOOM_IN;break;
            case 11:dwPTZCommand=HCNetSDK.ZOOM_OUT;break;
            case 10:
                dwPTZCommand = HCNetSDK.ZOOM_IN;
                break;
            case 11:
                dwPTZCommand = HCNetSDK.ZOOM_OUT;
                break;
            /*焦点*/
            case 12:dwPTZCommand=HCNetSDK.FOCUS_NEAR;break;
            case 13:dwPTZCommand=HCNetSDK.FOCUS_FAR;break;
            case 12:
                dwPTZCommand = HCNetSDK.FOCUS_NEAR;
                break;
            case 13:
                dwPTZCommand = HCNetSDK.FOCUS_FAR;
                break;
            /*光圈*/
            case 14:dwPTZCommand=HCNetSDK.IRIS_OPEN;break;
            case 15:dwPTZCommand=HCNetSDK.IRIS_CLOSE;break;
            case 14:
                dwPTZCommand = HCNetSDK.IRIS_OPEN;
                break;
            case 15:
                dwPTZCommand = HCNetSDK.IRIS_CLOSE;
                break;
            /*雨刷*/
            case 16:dwPTZCommand=HCNetSDK.WIPER_PWRON;break;
            case 16:
                dwPTZCommand = HCNetSDK.WIPER_PWRON;
                break;
        }
        boolean bool = hCNetSDK.NET_DVR_PTZControlWithSpeed_Other(userId, channelNum, dwPTZCommand, dwStop, speed);
        if (!bool) {
@@ -622,6 +653,7 @@
            return false;
        }
    }
    /**
     * @描述 操控锁定
     * @参数 [userId, channelNum]
@@ -641,8 +673,7 @@
        String operator=cmd.getOperator();//申请者
        String currentOperator = ardCameras.getOperatorId();//相机当前控制者
        Date currentExpired = ardCameras.getOperatorExpired();//相机当前过期时间
        if(currentExpired==null)
        {
        if (currentExpired == null) {
            //设置当前操作用户ID
            ardCameras.setOperatorId(operator);
            //设置当前过期时间
@@ -650,19 +681,16 @@
            now.setTime(now.getTime() + expired * 1000*60);
            ardCameras.setOperatorExpired(now);
            ardCamerasMapper.updateArdCameras(ardCameras);
        }
         else {
        } else {
            //如果过期时间有值
            //如果是本人直接修改
            if(currentOperator.equals(operator))
            {
            if (currentOperator.equals(operator)) {
                //设置当前过期时间
                Date now = new Date();
                now.setTime(now.getTime() + expired * 1000*60);
                ardCameras.setOperatorExpired(now);
                ardCamerasMapper.updateArdCameras(ardCameras);
            }
            else {
            } else {
                //如果非本人比较优先级
                Integer currentLevel = 0;//当前操作者的优先级
                if (sdkPriority.priorityMap.containsKey(currentOperator)) {
@@ -1235,8 +1263,7 @@
            return "";
        } else {
            recordInfo info = user_real_Map.get(userId);
            if(StringUtils.isNull(info))
            {
            if (StringUtils.isNull(info)) {
                return "";
            }
            hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
@@ -1267,4 +1294,81 @@
            return url;
        }
    }
    @Override
    @SdkOperate
    public void recordToMinio(CameraCmd cmd) throws IOException {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChannelNum();
        boolean enable = cmd.isEnable();
        if (!globalVariable.loginMap.containsKey(cameraId)) {
            return;
        }
        Integer userId = globalVariable.loginMap.get(cameraId);
        String path = "";
        //预览参数
        NET_DVR_PREVIEWINFO previewinfo = new NET_DVR_PREVIEWINFO();
        previewinfo.read();
        previewinfo.lChannel = channelNum;
        previewinfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
        previewinfo.dwLinkMode = 0;//连接方式:0-TCP方式,1-UDP方式,2-多播方式,3-RTP方式,4-RTP/RTSP,5-RTP/HTTP,6-HRUDP(可靠传输),7-RTSP/HTTPS,8-NPQ
        previewinfo.hPlayWnd = null;//播放窗口的句柄,为NULL表示不解码显示。
        previewinfo.bBlocked = 0;//0- 非阻塞取流,1-阻塞取流
        previewinfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
        previewinfo.write();
        int lRealHandle;
        if (enable) {
            if (!user_real_Map.containsKey(userId)) {
                lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
                if (lRealHandle == -1) {
                    int iErr = hCNetSDK.NET_DVR_GetLastError();
                    log.error("取流失败" + iErr);
                    return;
                }
                log.info("取流成功");
                File file = new File("D:/recordTemp/" + cameraId + ".mp4");
                if (!file.exists()) {
                    File fileParent = file.getParentFile();
                    if (!fileParent.exists()) {
                        fileParent.mkdirs();
                    }
                    file.createNewFile();
                }
                path = file.getCanonicalPath();
                recordInfo info = new recordInfo();
                info.setLRealHandle(lRealHandle);
                info.setRecordPath(path);
                user_real_Map.put(userId, info);
            }
            recordInfo info = user_real_Map.get(userId);
            if (!hCNetSDK.NET_DVR_SaveRealData_V30(info.getLRealHandle(), 1, info.getRecordPath())) {
                log.error("保存视频文件到临时文件夹失败 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
                return;
            }
            log.info("录像开始");
        } else {
            recordInfo info = user_real_Map.get(userId);
            if (StringUtils.isNull(info)) {
                return;
            }
            hCNetSDK.NET_DVR_StopRealPlay(info.getLRealHandle());
            log.info("录像停止");
            //存入minio
            String BucketName = cmd.getRecordBucketName();
            String ObjectName = cmd.getRecordObjectName();
            String ContentType = "video/MP4";
            FileInputStream stream = new FileInputStream(info.getRecordPath());
            String url = "";
            try {
                boolean b = MinioUtils.uploadObject(BucketName, ObjectName, stream, stream.available(), ContentType);
                if (b) {
                    url = BucketName + ObjectName;
                    log.info("上传文件成功!" + url);
                }
            } catch (IOException ex) {
                log.error("上传文件异常:" + ex.getMessage());
            }
            user_real_Map.remove(userId);
        }
    }
}