liusuyi
2023-10-23 bd8cdb3244d058ad062610c8dc914374b52dd1e6
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -5,14 +5,16 @@
import com.ruoyi.common.annotation.SdkOperate;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.channel.domain.ArdChannel;
import com.ruoyi.device.channel.service.IArdChannelService;
import com.ruoyi.device.dhsdk.lib.LibraryLoad;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.hiksdk.sdk.ExceptionCallBack;
import com.ruoyi.media.domain.Vtdu;
import com.ruoyi.media.service.IVtduService;
import com.ruoyi.utils.gis.GisUtil;
@@ -26,7 +28,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.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.Base64;
@@ -38,6 +40,7 @@
import java.util.*;
import java.util.concurrent.PriorityBlockingQueue;
import static com.ruoyi.device.hiksdk.common.GlobalVariable.loginCameraMap;
import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.*;
/**
@@ -58,50 +61,10 @@
    @Resource
    private IVtduService vtduService;
    private static HCNetSDK hCNetSDK;
    public static HCNetSDK hCNetSDK = HCNetSDK.hCNetSDK;
    private static FExceptionCallBack fExceptionCallBack;//异常回调
    @Override
    public void loadHCNetSDKLib() {
        try {
            log.debug("开始加载sdk库文件路径");
            if (Platform.isWindows()) {
                String WIN_PATH = System.getProperty("user.dir") + File.separator + "lib\\hikDll\\HCNetSDK.dll";
                log.debug("当前Windows平台的sdk库路径:" + WIN_PATH);
                hCNetSDK = (HCNetSDK) Native.loadLibrary(WIN_PATH, HCNetSDK.class);
            } else {
                log.debug("Linux平台");
                String LINUX_PATH = System.getProperty("user.dir") + File.separator + "hiklib" + File.separator + "libhcnetsdk.so";
                log.debug("当前Linux平台的sdk库路径:" + LINUX_PATH);
                hCNetSDK = (HCNetSDK) Native.loadLibrary(LINUX_PATH, HCNetSDK.class);
                //设置HCNetSDKCom组件库所在路径
                //libhcnetsdk.so
                String strPathCom = "/home/hiklib";
                NET_DVR_LOCAL_SDK_PATH struComPath = new NET_DVR_LOCAL_SDK_PATH();
                System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
                struComPath.write();
                hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
                //设置libcrypto.so所在路径
                BYTE_ARRAY ptrByteArrayCrypto = new BYTE_ARRAY(256);
                String strPathCrypto = "/home/hiklib/libcrypto.so.1.1";
                System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());
                ptrByteArrayCrypto.write();
                hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());
                //设置libssl.so所在路径
                BYTE_ARRAY ptrByteArraySsl = new BYTE_ARRAY(256);
                String strPathSsl = "/home/hiklib/libssl.so.1.1";
                System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());
                ptrByteArraySsl.write();
                hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());
            }
        } catch (Exception ex) {
            log.error("加载库文件异常:" + ex.getMessage());
        }
    }
    @Override
    /**
     * @描述 注册登录 只支持同步登陆,且官方不建议直接在此接口下写耗时操作
     * @参数 [dvrLogin]
@@ -110,103 +73,118 @@
     * @创建时间 2023/1/17 16:12
     * @修改人和其它信息
     */
    public void syncLogin(ArdCameras camera) {
        // 初始化
        if (!hCNetSDK.NET_DVR_Init()) {
            log.error("SDK初始化失败");
        }
        //打印海康sdk日志
        if (Platform.isWindows()) {
            String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator;
            hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true);
        } else {
            hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true);
        }
        String m_sDeviceIP = camera.getIp();
        String m_sUsername = camera.getUsername();
        String m_sPassword = camera.getPassword();
        short m_sPort = camera.getPort().shortValue();
        //设置连接时间与重连时间
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        hCNetSDK.NET_DVR_SetReconnect(100000, true);
        //设备信息, 输出参数
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
        // 注册设备-登录参数,包括设备地址、登录用户、密码等
        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
        m_strLoginInfo.wPort = m_sPort;
        m_strLoginInfo.byVerifyMode = 0;
        m_strLoginInfo.byLoginMode = 0;
        //是否异步登录:0- 否,1- 是  windowsSDK里是true和false
        m_strLoginInfo.bUseAsynLogin = false;
        m_strLoginInfo.write();
        //同步登录
        int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (lUserID < 0) {
            int errorCode = hCNetSDK.NET_DVR_GetLastError();
            log.error("登录异常:" + errorCode);
            log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败");
            camera.setChanNum(0);
            camera.setLoginId(-1);
            camera.setState("0");
        } else {
            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
                GlobalVariable.loginMap.remove(camera.getId());
    @Override
    public void login(ArdCameras camera) {
        try {
            // 初始化
            if (!hCNetSDK.NET_DVR_Init()) {
                log.error("SDK初始化失败");
            }
            //删除管理通道
            ardChannelService.deleteArdChannelByDeviceId(camera.getId());
            GlobalVariable.loginMap.put(camera.getId(), lUserID);
            log.debug(camera.getIp() + ":" + camera.getPort() + "登录成功");
            //打印海康sdk日志
            if (Platform.isWindows()) {
                String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator;
                hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true);
            } else {
                hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true);
            }
            String m_sDeviceIP = camera.getIp();
            String m_sUsername = camera.getUsername();
            String m_sPassword = camera.getPassword();
            short m_sPort = camera.getPort().shortValue();
            //设置连接时间与重连时间
            hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
            hCNetSDK.NET_DVR_SetReconnect(5000, true);
            //设备信息, 输出参数
            HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
            HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
            camera.setLoginId(lUserID);
            camera.setState("1");
            camera.setChanNum((int) m_strDeviceInfo.struDeviceV30.byChanNum);
            camera.setStartDChan((int) m_strDeviceInfo.struDeviceV30.byStartDChan);
            //获取最新通道
            List<ArdChannel> cameraChannelList = getCameraChannelList(camera);
            if (cameraChannelList.size() > 0) {
                for (ArdChannel channel : cameraChannelList) {
                    channel.setId(IdUtils.simpleUUID());
                    ardChannelService.insertArdChannel(channel);
            // 注册设备-登录参数,包括设备地址、登录用户、密码等
            m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
            System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
            m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
            System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
            m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
            System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
            m_strLoginInfo.wPort = m_sPort;
            m_strLoginInfo.byVerifyMode = 0;
            m_strLoginInfo.byLoginMode = 0;
            //是否异步登录:0- 否,1- 是  windowsSDK里是true和false
            m_strLoginInfo.bUseAsynLogin = false;
            m_strLoginInfo.write();
            //同步登录
            int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
            if (lUserID < 0) {
                int errorCode = hCNetSDK.NET_DVR_GetLastError();
                log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败,错误码:" + errorCode);
                camera.setChanNum(0);
                camera.setLoginId(-1);
                camera.setState("0");
            } else {
                if (fExceptionCallBack == null) {
                    fExceptionCallBack = new ExceptionCallBack();//异常回调
                    //设置异常回调函数(可在回调函数中获取设备上下线状态等)
                    if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, null)) {
                        log.info("Set fExceptionCallBack function fail");
                        return;
                    } else {
                        log.info("Set fExceptionCallBack function successfully!");
                    }
                }
                //添加到流媒体
                for (ArdChannel channel : cameraChannelList) {
                    String name = camera.getId() + "_" + channel.getChanNo();
                    String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream";
                    Vtdu vtdu = vtduService.selectVtduByName(name);
                    if (vtdu == null) {
                if (GlobalVariable.loginMap.containsKey(camera.getId())) {
                    GlobalVariable.loginMap.remove(camera.getId());
                }
                //删除管理通道
                ardChannelService.deleteArdChannelByDeviceId(camera.getId());
                GlobalVariable.loginMap.put(camera.getId(), lUserID);
                GlobalVariable.loginCameraMap.put(lUserID, camera);
                log.debug("Login Success [ " + camera.getIp() + ":" + camera.getPort() + " ]");
                camera.setLoginId(lUserID);
                camera.setState("1");
                camera.setChanNum((int) m_strDeviceInfo.struDeviceV30.byChanNum);
                camera.setStartDChan((int) m_strDeviceInfo.struDeviceV30.byStartDChan);
                //获取最新通道
                List<ArdChannel> cameraChannelList = getCameraChannelList(camera);
                if (cameraChannelList.size() > 0) {
                    for (ArdChannel channel : cameraChannelList) {
                        channel.setId(IdUtils.simpleUUID());
                        ardChannelService.insertArdChannel(channel);
                    }
                    //添加到流媒体
                    for (ArdChannel channel : cameraChannelList) {
                        String name = camera.getId() + "_" + channel.getChanNo();
                        String rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream";
                        Vtdu vtdu = vtduService.selectVtduByName(name);
                        if (vtdu != null) {
                            vtduService.deleteVtduByName(name);
                        }
                        //添加到流媒体
                        vtdu = new Vtdu();
                        vtdu.setRtspSource(rtspSource);
                        vtdu.setName(camera.getId() + "_" + channel.getChanNo());
                        vtdu.setIsCode("0");//默认不转码
                        CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo());
                        Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd);
                        if (videoCompressionCfg.get("videoEncType").equals("标准h264")) {
                            vtdu.setIsCode("0");//默认不转码
                        } else {
                            vtdu.setIsCode("1");//默认转码
                        }
                        vtdu.setMode("1");//默认CPU软解码
                        vtdu.setCameraId(camera.getId());
                        vtduService.insertVtdu(vtdu);
                    } else {
                        if (!rtspSource.equals(vtdu.getRtspSource())) {
                            //更新rtsp地址
                            vtdu.setRtspSource(rtspSource);
                            vtduService.updateVtdu(vtdu);
                        }
                    }
                }
                //创建引导队列
                if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                    Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
                    PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
                    GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
                }
                ardCamerasService.updateArdCameras(camera);
            }
            //创建引导队列
            if (!GuidePriorityQueue.cameraQueueMap.containsKey(camera.getId())) {
                Comparator<GuideTask> comparator = GuidePriorityQueue.getComparator();
                PriorityBlockingQueue<GuideTask> priorityQueue = new PriorityBlockingQueue<>(1000, comparator);
                GuidePriorityQueue.cameraQueueMap.put(camera.getId(), priorityQueue);
            }
            ardCamerasService.updateArdCameras(camera);
        } catch (Exception ex) {
            log.error("注册设备异常", ex);
        }
    }
@@ -276,14 +254,12 @@
    @Override
    public void loginAll() {
        try {
            log.debug("加载lib完成!");
            ArdCameras ardCamera = new ArdCameras();
            ardCamera.setFactory("1");
            List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(ardCamera);
            for (ArdCameras camera : ardCameras) {
                Thread.sleep(500);
                //异步登录
                asyncLogin(camera);
                //登录
                login(camera);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
@@ -303,7 +279,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);
@@ -323,7 +299,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());
@@ -342,7 +318,6 @@
     * @修改人和其它信息
     */
    @Override
    @SdkOperate
    public boolean pTZControlWithSpeed(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        boolean enable = cmd.isEnable();
@@ -352,7 +327,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;//开启
@@ -429,7 +404,6 @@
     * @param cmd 相机命令
     */
    @Override
    @SdkOperate
    public boolean setFocusPos(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -438,7 +412,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;
@@ -465,14 +439,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();
@@ -486,13 +461,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;
    }
    /**
@@ -501,7 +475,6 @@
     * @param cmd 相机命令
     */
    @Override
    @SdkOperate
    public boolean setPreset(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -509,7 +482,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();
@@ -524,7 +497,6 @@
     * @param cmd 相机命令
     */
    @Override
    @SdkOperate
    public boolean gotoPreset(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -532,7 +504,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();
@@ -550,15 +522,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();
@@ -615,85 +587,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 = "其他";
@@ -703,43 +675,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";
@@ -751,7 +723,7 @@
                        resolution = "1920*1920";
                        break;
                    case 27:
                        resolution = "1920*1080p";
                        resolution = "1920*1080";
                        break;
                    case 28:
                        resolution = "2560*1920";
@@ -766,10 +738,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();
@@ -794,9 +836,9 @@
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
            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();
@@ -828,7 +870,6 @@
            log.error("控制失败,请稍后重试" + code);
            return new HashMap<>();
        }
    }
    /**
@@ -840,7 +881,6 @@
     * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
     */
    @Override
    @SdkOperate
    public boolean setPtz(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        Integer channelNum = cmd.getChanNo();
@@ -848,13 +888,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(ptz.get("p") * 10);
            String t = String.valueOf(ptz.get("t") * 10);
            String z = String.valueOf(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));
@@ -873,14 +913,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 {
@@ -908,49 +947,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锁定信息
@@ -967,7 +963,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);
@@ -999,7 +995,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();
@@ -1031,7 +1027,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);
@@ -1080,7 +1076,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);
@@ -1126,7 +1122,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);
@@ -1174,7 +1170,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);
@@ -1217,7 +1213,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);
@@ -1247,7 +1243,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;//开启
@@ -1280,7 +1276,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);
@@ -1317,7 +1313,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值,判断是否获取设备能力
@@ -1360,7 +1356,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();
        //设置图片分辨率
@@ -1424,7 +1420,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();
@@ -1468,6 +1464,15 @@
                    GlobalVariable.previewMap.remove(cameraId);
                }
                log.debug("录像停止");
                //存入minio
                String BucketName = "record";
                String ObjectName = IdUtils.simpleUUID() + ".mp4";
                FileInputStream stream = new FileInputStream(path);
                boolean b = MinioUtil.uploadObject(BucketName, ObjectName, stream, stream.available(), "video/MP4");
                if (b) {
                    url = MinioUtil.getBucketObjectUrl(BucketName, ObjectName);
                    log.debug("上传文件成功!" + url);
                }
            }
            return url;
        } catch (Exception ex) {
@@ -1477,15 +1482,15 @@
    }
    @Override
    public void recordStart(CameraCmd cmd) {
    public boolean recordStart(CameraCmd cmd) {
        try {
            String cameraId = cmd.getCameraId();
            Integer channelNum = cmd.getChanNo();
            String path = FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
            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();
@@ -1515,18 +1520,20 @@
            int lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
            if (lRealHandle == -1) {
                log.error("取流失败" + hCNetSDK.NET_DVR_GetLastError());
                return;
                return false;
            }
            log.debug("取流成功");
            GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName());
            GlobalVariable.previewMap.put(cameraId, lRealHandle);
            if (!hCNetSDK.NET_DVR_SaveRealData_V30(GlobalVariable.previewMap.get(cameraId), 2, path)) {
                log.error("保存视频文件到临时文件夹失败 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
                return;
                return false;
            }
            log.debug("录像开始");
            return true;
        } catch (Exception ex) {
            log.error("开始录像异常" + ex.getMessage());
            return false;
        }
    }
@@ -1540,7 +1547,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();
@@ -1586,14 +1593,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();
@@ -1620,9 +1628,12 @@
                GlobalVariable.previewMap.remove(cameraId);
            }
            log.debug("录像停止");
            result = true;
        } catch (Exception ex) {
            log.error("录像停止异常" + ex.getMessage());
            result = false;
        }
        return result;
    }
    //获取IP通道
@@ -1678,7 +1689,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();