Merge remote-tracking branch 'origin/master'
| | |
| | | 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; |
| | | |
| | |
| | | @Resource |
| | | IArdAlarmRadarPumpService ardAlarmRadarPumpService; |
| | | @Resource |
| | | IHikClientService hikClientService; |
| | | ICameraSdkService cameraSdkService; |
| | | @Resource |
| | | IArdAlarmTubeService ardAlarmTubeService; |
| | | |
| | |
| | | IArdAlarmExternalService ardAlarmExternalService; |
| | | @Resource |
| | | IArdAlarmAccessService ardAlarmAccessService; |
| | | |
| | | public void processTask(GuideTask guideTask) { |
| | | try { |
| | | CameraCmd cmd = new CameraCmd(); |
| | |
| | | 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": |
| | |
| | | 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; |
| | |
| | | private IHikClientService hikSdk; |
| | | @Resource |
| | | private IDhClientService dhSdk; |
| | | @Resource |
| | | private ICameraSdkService cameraSdkService; |
| | | @Resource |
| | | private IArdCamerasService ardCamerasService; |
| | | @Resource |
| | |
| | | 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); |
| | | } |
| | |
| | | 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); |
| | | } |
| | |
| | | @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)); |
| | | } |
| | |
| | | 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("设置聚焦值") |
| | |
| | | |
| | | @ApiOperation(value = "获取聚焦模式", notes = "1手动2自动") |
| | | @PostMapping("/getFocusMode") |
| | | @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"}) |
| | | public @ResponseBody |
| | | AjaxResult getFocusMode(@RequestBody CameraCmd cmd) { |
| | | cmd.setOperator(SecurityUtils.getUserId()); |
| | |
| | | @ApiOperation("获取相机架设参数") |
| | | @PostMapping("/getGisInfo") |
| | | @Log(title = "获取相机架设参数", businessType = BusinessType.CONTROL) |
| | | @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"}) |
| | | @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"}) |
| | | public @ResponseBody |
| | | AjaxResult getGisInfo(@RequestBody CameraCmd cmd) { |
| | | cmd.setOperator(SecurityUtils.getUserId()); |
| | | 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("手动录像开始") |
| | |
| | | boolean b = cameraSdkService.recordStart(cmd); |
| | | return toAjax(b); |
| | | } |
| | | |
| | | @ApiOperation("手动录像停止") |
| | | @PostMapping("/recordStop") |
| | | @Log(title = "手动录像停止", businessType = BusinessType.CONTROL) |
| | |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | import org.springframework.boot.context.properties.bind.DefaultValue; |
| | | |
| | | import java.util.Map; |
| | | |
| | | @Data |
| | | @NoArgsConstructor |
| | | @ApiModel(description = "sdk命令实体类") |
| | | public class CameraCmd { |
| | | |
| | | public CameraCmd(String cameraId, Integer chanNo) { |
| | | this.cameraId = cameraId; |
| | | this.chanNo = chanNo; |
| | | } |
| | | |
| | | /*命令标识*/ |
| | | String cmdType; |
| | | /*相机ID*/ |
| | |
| | | /*聚焦值*/ |
| | | Integer dwFocusPos; |
| | | /*PTZ值*/ |
| | | Map<String,Double>ptzMap; |
| | | Map<String, Double> ptzMap; |
| | | |
| | | /*目标经纬度*/ |
| | | double[] targetPosition; |
| | |
| | | |
| | | 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); |
| | |
| | | boolean setFocusPos(CameraCmd cmd); |
| | | |
| | | //获取聚焦值 |
| | | Map<String, Object> getFocusPos(CameraCmd cmd); |
| | | int getFocusPos(CameraCmd cmd); |
| | | |
| | | //设置预置位 |
| | | boolean setPreset(CameraCmd cmd); |
| | |
| | | boolean gotoPreset(CameraCmd cmd); |
| | | |
| | | //获取码流压缩参数 |
| | | Map<String, String> getVideoCompressionCfg(CameraCmd cmd); |
| | | Map<String, Object> getVideoCompressionCfg(CameraCmd cmd); |
| | | |
| | | //透雾 |
| | | boolean controlDefogcfg(CameraCmd cmd); |
| | | |
| | | //红外? |
| | | //红外 |
| | | boolean controlInfrarecfg(CameraCmd cmd); |
| | | |
| | | //聚焦模式 |
| | |
| | | //云台加热 |
| | | boolean controlPTHeateRpwron(CameraCmd cmd); |
| | | |
| | | //镜头除冰 |
| | | //镜头加热除冰 |
| | | boolean controlCameraDeicing(CameraCmd cmd); |
| | | |
| | | //配置锁定 |
| | |
| | | //设置零方位角 |
| | | boolean setZeroPtz(CameraCmd cmd); |
| | | |
| | | |
| | | //引导目标位置 |
| | | boolean guideTargetPosition(CameraCmd cmd); |
| | | |
| | | //录像 |
| | | String record(CameraCmd cmd); |
| | | |
| | | //手动开始录像 |
| | | boolean recordStart(CameraCmd cmd); |
| | |
| | | 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); |
| | | } |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | | |
| | |
| | | @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库文件 |
| | |
| | | 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) { |
| | |
| | | } |
| | | } |
| | | //云台控制 |
| | | @SdkOperate |
| | | @Override |
| | | public boolean pTZControl(CameraCmd cmd) { |
| | | try { |
| | |
| | | if (factory.equals("1")) { |
| | | result = hikClientService.setFocusPos(cmd); |
| | | } else if (factory.equals("2")) { |
| | | |
| | | result = dhClientService.setFocusPos(cmd); |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | |
| | | } |
| | | //获取聚焦值 |
| | | @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 |
| | |
| | | } |
| | | //获取码流压缩参数 |
| | | @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); |
| | |
| | | if (factory.equals("1")) { |
| | | map = hikClientService.getVideoCompressionCfg(cmd); |
| | | } else if (factory.equals("2")) { |
| | | |
| | | map = dhClientService.getVideoCompressionCfg(cmd); |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | |
| | | if (factory.equals("1")) { |
| | | result = hikClientService.controlDefogcfg(cmd); |
| | | } else if (factory.equals("2")) { |
| | | |
| | | //不支持 |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | |
| | | if (factory.equals("1")) { |
| | | result = hikClientService.controlInfrarecfg(cmd); |
| | | } else if (factory.equals("2")) { |
| | | |
| | | result = dhClientService.controlInfrarecfg(cmd); |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | |
| | | if (factory.equals("1")) { |
| | | result = hikClientService.getFocusMode(cmd); |
| | | } else if (factory.equals("2")) { |
| | | |
| | | result = dhClientService.getFocusMode(cmd); |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | |
| | | if (factory.equals("1")) { |
| | | result = hikClientService.controlPTHeateRpwron(cmd); |
| | | } else if (factory.equals("2")) { |
| | | |
| | | //不支持 |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | |
| | | if (factory.equals("1")) { |
| | | result = hikClientService.controlCameraDeicing(cmd); |
| | | } else if (factory.equals("2")) { |
| | | |
| | | //不支持 |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | |
| | | } |
| | | 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) { |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | return map; |
| | | } |
| | | //设置ptz |
| | | @SdkOperate |
| | | @Override |
| | | public boolean setPtz(CameraCmd cmd) { |
| | | boolean result = false; |
| | |
| | | return result; |
| | | } |
| | | //设置零方位角 |
| | | @SdkOperate |
| | | @Override |
| | | public boolean setZeroPtz(CameraCmd cmd) { |
| | | boolean result = false; |
| | |
| | | return result; |
| | | } |
| | | //引导指向目标 |
| | | @SdkOperate |
| | | @Override |
| | | public boolean guideTargetPosition(CameraCmd cmd) { |
| | | boolean result = false; |
| | |
| | | } |
| | | 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) { |
| | |
| | | } |
| | | //停止录像并不存入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; |
| | | } |
| | | |
| | | //获取相机架设参数 |
| | |
| | | if (factory.equals("1")) { |
| | | map = hikClientService.getGisInfo(cmd); |
| | | } else if (factory.equals("2")) { |
| | | |
| | | map = dhClientService.getGisInfo(cmd); |
| | | } |
| | | } |
| | | } catch (Exception ex) { |
| | |
| | | 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;
|
| | |
| | | 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;
|
| | |
|
| | |
| | | * @Author: 刘苏义
|
| | | * @Date: 2023年10月14日10:34:58
|
| | | **/
|
| | | @Api(tags = "大华SDK接口")
|
| | |
|
| | | @Controller
|
| | | @RequestMapping("/dh")
|
| | | @Anonymous
|
| | |
| | | package com.ruoyi.device.dhsdk.lib.enumeration; |
| | | |
| | | |
| | | /** |
| | | * @author 291189 |
| | | * @description 聚焦极限对应枚举 |
| | | * @date 2022/11/01 11:16:54 |
| | | */ |
| | | /** |
| | | * @author 291189 |
| | | * @description 聚焦极限对应枚举 |
| | | * @date 2022/11/01 11:16:54 |
| | | */ |
| | | public enum EM_FOCUS_LIMIT_SELECT_MODE { |
| | | /** |
| | | Manual 自动 |
| | | */ |
| | | EM_FOCUS_LIMIT_MODE_MANUAL(0," Manual 自动"), |
| | | /** |
| | | Auto 手动 |
| | | */ |
| | | EM_FOCUS_LIMIT_MODE_AUTO(1," Auto 手动"), |
| | | /** |
| | | /** |
| | | * Manual 自动 |
| | | */ |
| | | EM_FOCUS_LIMIT_MODE_MANUAL(0, " Manual 自动"), |
| | | /** |
| | | * Auto 手动 |
| | | */ |
| | | EM_FOCUS_LIMIT_MODE_AUTO(1, " Auto 手动"), |
| | | /** |
| | | * |
| | | */ |
| | | EM_FOCUS_LIMIT_MODE_INVALI(2, "无效"); |
| | | |
| | | */ |
| | | EM_FOCUS_LIMIT_MODE_INVALI(2,"无效"); |
| | | private int value; |
| | | |
| | | private int value; |
| | | private String note; |
| | | |
| | | private String note; |
| | | |
| | | public String getNote() { |
| | | public String getNote() { |
| | | return note; |
| | | } |
| | | |
| | | public int getValue() { |
| | | public int getValue() { |
| | | return value; |
| | | } |
| | | |
| | | EM_FOCUS_LIMIT_SELECT_MODE(int givenValue, String note) { |
| | | EM_FOCUS_LIMIT_SELECT_MODE(int givenValue, String note) { |
| | | this.value = givenValue; |
| | | this.note = note; |
| | | } |
| | | |
| | | public static String getNoteByValue(int givenValue) { |
| | | public static String getNoteByValue(int givenValue) { |
| | | for (EM_FOCUS_LIMIT_SELECT_MODE enumType : EM_FOCUS_LIMIT_SELECT_MODE.values()) { |
| | | if (givenValue == enumType.getValue()) { |
| | | return enumType.getNote(); |
| | |
| | | return null; |
| | | } |
| | | |
| | | public static int getValueByNote(String givenNote) { |
| | | public static int getValueByNote(String givenNote) { |
| | | for (EM_FOCUS_LIMIT_SELECT_MODE enumType : EM_FOCUS_LIMIT_SELECT_MODE.values()) { |
| | | if (givenNote.equals(enumType.getNote())) { |
| | | return enumType.getValue(); |
| | |
| | | return -1; |
| | | } |
| | | |
| | | public static EM_FOCUS_LIMIT_SELECT_MODE getEnum(int value) { |
| | | public static EM_FOCUS_LIMIT_SELECT_MODE getEnum(int value) { |
| | | for (EM_FOCUS_LIMIT_SELECT_MODE e : EM_FOCUS_LIMIT_SELECT_MODE.values()) { |
| | | if (e.getValue() == value) |
| | | return e; |
| | |
| | | |
| | | 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 extends NetSDKLib.SdkStructure { |
| | | /** |
| | | 通道号 |
| | | */ |
| | | public int nChannelIndex; |
| | | /** |
| | | 配置使用个数 |
| | | */ |
| | | public int nVideoInFocusRealNum; |
| | | /** |
| | | 通道聚焦配置单元信息 |
| | | */ |
| | | public CFG_VIDEO_IN_FOCUS_UNIT[] stVideoInFocusUnit=new CFG_VIDEO_IN_FOCUS_UNIT[32]; |
| | | /** |
| | | * 通道号 |
| | | */ |
| | | public int nChannelIndex; |
| | | /** |
| | | * 配置使用个数 |
| | | */ |
| | | public int nVideoInFocusRealNum; |
| | | /** |
| | | * 通道聚焦配置单元信息 |
| | | */ |
| | | public CFG_VIDEO_IN_FOCUS_UNIT[] stVideoInFocusUnit = new CFG_VIDEO_IN_FOCUS_UNIT[32]; |
| | | |
| | | public CFG_VIDEO_IN_FOCUS(){ |
| | | for(int i=0;i<stVideoInFocusUnit.length;i++){ |
| | | stVideoInFocusUnit[i]=new CFG_VIDEO_IN_FOCUS_UNIT(); |
| | | } |
| | | } |
| | | public CFG_VIDEO_IN_FOCUS() { |
| | | for (int i = 0; i < stVideoInFocusUnit.length; i++) { |
| | | stVideoInFocusUnit[i] = new CFG_VIDEO_IN_FOCUS_UNIT(); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | 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() { |
| | | } |
| | | } |
| | |
| | | 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;
|
| | |
|
| | | /**
|
| | |
| | | public class ConfigModule {
|
| | | public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
|
| | | public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
|
| | |
|
| | | /**
|
| | | * 查询设备状态
|
| | | */
|
| | |
| | | stuInfo.read();
|
| | | return true;
|
| | | }
|
| | |
|
| | | /**
|
| | | * 查询远程设备状态
|
| | | */
|
| | | public static boolean queryRemotDevState(NetSDKLib.LLong hLoginHandle, int nChn, int nType, NetSDKLib.SdkStructure stuInfo) {
|
| | |
|
| | | IntByReference intRetLen = new IntByReference();
|
| | | stuInfo.write();
|
| | | if (!netsdk.CLIENT_QueryRemotDevState(hLoginHandle, nType, nChn, stuInfo.getPointer(), stuInfo.size(), intRetLen, 3000)) {
|
| | | System.err.println("Config Failed!" + ToolKits.getErrorCodePrint());
|
| | | return false;
|
| | | }
|
| | | 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;
|
| | | }
|
| | | // 获取配置
|
| | | public static boolean GetConfig(NetSDKLib.LLong hLoginHandle, int nChn,int type,Structure cmdObject) {
|
| | | boolean result = false;
|
| | | // 获取
|
| | | cmdObject.write();
|
| | | if (netsdk.CLIENT_GetConfig(hLoginHandle, type, nChn, cmdObject.getPointer(), cmdObject.size(), 4000, null)) {
|
| | | cmdObject.read();
|
| | | result=true;
|
| | | } else {
|
| | | System.err.println("GetConfig Failed!" + 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 {
|
| | |
| | | return result;
|
| | | }
|
| | |
|
| | |
|
| | | }
|
| | |
| | | |
| | | 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); |
| | | } |
| | |
| | | /** |
| | | * 向左上 |
| | | */ |
| | | |
| | | 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, |
| | |
| | | * 开始预览 |
| | | * \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) { |
| | |
| | | |
| | | /** |
| | | * \if ENGLISH_LANG |
| | | * Start RealPlay |
| | | * Stop RealPlay |
| | | * \else |
| | | * 停止预览 |
| | | * \endif |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | 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;
|
| | |
|
| | | /**
|
| | |
| | | String record(CameraCmd cmd);
|
| | | boolean recordStart(CameraCmd cmd);
|
| | | String recordStopToMinio(CameraCmd cmd);
|
| | |
|
| | | boolean recordStopNotToMinio(CameraCmd cmd);
|
| | | //引导目标位置
|
| | | boolean guideTargetPosition(CameraCmd cmd);
|
| | |
|
| | |
| | | boolean gotoPreset(CameraCmd cmd);
|
| | | //设置预置位
|
| | | boolean setPreset(CameraCmd cmd);
|
| | | //聚焦模式
|
| | |
|
| | | //设置聚焦模式
|
| | | boolean controlFocusMode(CameraCmd cmd);
|
| | | //获取聚焦模式
|
| | | String getFocusMode(CameraCmd cmd);
|
| | |
|
| | | //透雾
|
| | | boolean controlDefogcfg(CameraCmd cmd);
|
| | | //红外
|
| | | boolean controlInfrarecfg(CameraCmd cmd);
|
| | | //获取聚焦值
|
| | | int getFocusPos(CameraCmd cmd);
|
| | | //设置聚焦值
|
| | | boolean setFocusPos(CameraCmd cmd);
|
| | | //获取码流压缩参数
|
| | | Map<String, Object> getVideoCompressionCfg(CameraCmd cmd);
|
| | | //获取GIS信息数据
|
| | | Map<String, Object> getGisInfo(CameraCmd cmd);
|
| | | }
|
| | |
| | | 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.ArdCameras;
|
| | | 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.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_NEW_CONFIG;
|
| | | import com.ruoyi.device.dhsdk.lib.enumeration.NET_EM_CFG_OPERATE_TYPE;
|
| | | 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.DH_OUT_PTZ_VIEW_RANGE_STATUS;
|
| | | 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.utils.gis.GisUtil;
|
| | | import com.ruoyi.utils.minio.MinioUtil;
|
| | | import com.sun.jna.Pointer;
|
| | |
| | | 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;
|
| | |
|
| | |
|
| | | /**
|
| | |
| | | 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();
|
| | | // 网络连接恢复
|
| | |
| | | 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);
|
| | | }
|
| | |
|
| | | //添加到流媒体
|
| | | CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo());
|
| | | Map<String, Object> videoCompressionCfg = getVideoCompressionCfg(cmd);
|
| | | vtdu = new Vtdu();
|
| | | if (videoCompressionCfg.get("videoEncType").equals("标准h264")) {
|
| | | vtdu.setIsCode("0");//默认不转码
|
| | | } else {
|
| | | vtdu.setIsCode("1");//默认转码
|
| | | }
|
| | | vtdu.setRtspSource(rtspSource);
|
| | | vtdu.setName(camera.getId() + "_" + channel.getChanNo());
|
| | | vtdu.setMode("1");//默认CPU软解码
|
| | | vtdu.setCameraId(camera.getId());
|
| | | vtduService.insertVtdu(vtdu);
|
| | | }
|
| | | } else {
|
| | | //log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败");
|
| | |
| | | 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());
|
| | | }
|
| | |
| | | if (b) {
|
| | | DecimalFormat df = new DecimalFormat("0.0");//设置保留位数
|
| | | String nPTZPan = df.format((float) dh_ptz_location_info.nPTZPan / 10);
|
| | | String nPTZTilt = df.format((float) dh_ptz_location_info.nPTZTilt / 10);
|
| | | float t = (float) dh_ptz_location_info.nPTZTilt / 10;
|
| | | String nPTZTilt = df.format(t < 0 ? t + 360 : t);
|
| | | String nPTZZoom = df.format((float) dh_ptz_location_info.nPTZZoom);
|
| | | ptzMap.put("p", nPTZPan);
|
| | | ptzMap.put("t", nPTZTilt);
|
| | |
| | | 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 "";
|
| | |
| | | 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("录像停止");
|
| | |
| | | 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());
|
| | | }
|
| | |
| | | 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("停止当前录像");
|
| | | }
|
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | 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 = 0;//聚焦极限Manual
|
| | | log.debug("当前为手动聚焦模式");
|
| | | } else {
|
| | | cfg_video_in_focus.stVideoInFocusUnit[i].nMode = 2;//自动聚焦
|
| | | cfg_video_in_focus.stVideoInFocusUnit[i].emFocusMode = 1;//聚焦极限Auto
|
| | | log.debug("当前为自动聚焦模式");
|
| | | }
|
| | | }
|
| | | 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());
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | @Override
|
| | | public String getFocusMode(CameraCmd cmd) {
|
| | | String mode = "";
|
| | | String cameraId = cmd.getCameraId();
|
| | | Integer chanNo = cmd.getChanNo();
|
| | | if (!GlobalVariable.loginMap.containsKey(cameraId)) {
|
| | | return "";
|
| | | }
|
| | | LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
|
| | | try {
|
| | | NET_VIDEOIN_FOCUSMODE_INFO focusModeInfo = new NET_VIDEOIN_FOCUSMODE_INFO();
|
| | | int emCfgOpType = NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_VIDEOIN_FOCUSMODE;
|
| | | boolean bool = ConfigModule.GetConfig(loginId, chanNo - 1, emCfgOpType, focusModeInfo);
|
| | | if (!bool) {
|
| | | log.error("获取失败,请稍后重试" + getErrorCodePrint());
|
| | | }
|
| | | System.out.println("配置类型:" + focusModeInfo.emCfgType); // 具体信息,参考库里的枚举
|
| | | System.out.println("聚焦模式:" + focusModeInfo.emFocusMode);
|
| | | switch (focusModeInfo.emFocusMode) {
|
| | | case 0:
|
| | | mode = "关闭";
|
| | | break;
|
| | | case 1:
|
| | | mode = "辅助聚焦";
|
| | | break;
|
| | | case 2:
|
| | | mode = "自动聚焦";
|
| | | break;
|
| | | case 3:
|
| | | mode = "半自动聚焦";
|
| | | break;
|
| | | case 4:
|
| | | mode = "手动聚焦";
|
| | | break;
|
| | | }
|
| | |
|
| | | } catch (Exception ex) {
|
| | | log.error("获取聚焦模式异常:" + ex.getMessage());
|
| | |
|
| | | }
|
| | | return mode;
|
| | | }
|
| | |
|
| | | //透雾
|
| | | @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 {
|
| | | String command = EM_NEW_CONFIG.CFG_CMD_VIDEOINDEFOG.getValue();
|
| | | //CFG_VIDEOINDEFOG_LIST cfg_videoindefog_list=new CFG_VIDEOINDEFOG_LIST();
|
| | | boolean bool = ConfigModule.SetDevConfig(loginId, chanNo - 1, command, 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;
|
| | | }
|
| | |
|
| | | //获取GIS信息数据
|
| | | @Override
|
| | | public Map<String, Object> getGisInfo(CameraCmd cmd) {
|
| | | Map<String, Object> map = new HashMap<>();
|
| | | try {
|
| | | String cameraId = cmd.getCameraId();
|
| | | Integer chanNo = cmd.getChanNo();
|
| | | if (!GlobalVariable.loginMap.containsKey(cameraId)) {
|
| | | return null;
|
| | | }
|
| | | LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
|
| | | DH_OUT_PTZ_VIEW_RANGE_STATUS dh_out_ptz_view_range_status = new DH_OUT_PTZ_VIEW_RANGE_STATUS();
|
| | | boolean b = ConfigModule.queryDevState(loginId, NET_DEVSTATE_PTZ_VIEW_RANGE, dh_out_ptz_view_range_status);
|
| | | if (b) {
|
| | | float nAngelH = (float) dh_out_ptz_view_range_status.nAngelH / 10;
|
| | | float nAngelV = (float) dh_out_ptz_view_range_status.nAngelV / 10;
|
| | | map = getPtz(cmd);//获取ptz
|
| | | map.put("fHorFieldAngle", nAngelH);// 水平视场角
|
| | | map.put("fVerFieldAngle", nAngelV);// 垂直视场角
|
| | | }
|
| | | } catch (Exception ex) {
|
| | | log.error("获取云台可视域异常" + ex.getMessage());
|
| | | }
|
| | | return map;
|
| | | }
|
| | |
|
| | | // 设备断线回调: 当设备出现断线时,SDK会调用该函数
|
| | | private static class DisConnect implements NetSDKLib.fDisConnect {
|
| | | public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
| | |
| | | * @Date: 2023年01月17日 12:04 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Api(tags = "海康SDK接口") |
| | | @Controller |
| | | @RequestMapping("/hik") |
| | | @Anonymous |
| | |
| | | private String preview() { |
| | | return "preview"; |
| | | } |
| | | |
| | | @RequestMapping("/index") |
| | | private String index() { |
| | | return "test"; |
| | |
| | | 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("设置聚焦值") |
| | |
| | | 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") |
| | |
| | | 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; //网传(子码流) |
| | | |
| | |
| | | import com.ruoyi.device.hiksdk.service.IHikClientService; |
| | | import com.ruoyi.media.domain.Vtdu; |
| | | import com.ruoyi.media.service.IVtduService; |
| | | import com.ruoyi.utils.forest.MediaClient; |
| | | import com.sun.jna.Pointer; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.Comparator; |
| | | import java.util.List; |
| | | import java.util.concurrent.PriorityBlockingQueue; |
| | |
| | | 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); |
| | | } |
| | | } |
| | | //创建引导队列 |
| | |
| | | boolean setFocusPos(CameraCmd cmd); |
| | | |
| | | //获取聚焦值 |
| | | Map<String, Object> getFocusPos(CameraCmd cmd); |
| | | int getFocusPos(CameraCmd cmd); |
| | | |
| | | //设置预置位 |
| | | boolean setPreset(CameraCmd cmd); |
| | |
| | | boolean gotoPreset(CameraCmd cmd); |
| | | |
| | | //获取码流压缩参数 |
| | | Map<String, String> getVideoCompressionCfg(CameraCmd cmd); |
| | | Map<String, Object> getVideoCompressionCfg(CameraCmd cmd); |
| | | |
| | | //透雾 |
| | | boolean controlDefogcfg(CameraCmd cmd); |
| | | |
| | | //红外? |
| | | //红外 |
| | | boolean controlInfrarecfg(CameraCmd cmd); |
| | | |
| | | //聚焦模式 |
| | |
| | | |
| | | //镜头除冰 |
| | | boolean controlCameraDeicing(CameraCmd cmd); |
| | | |
| | | //配置锁定 |
| | | boolean controlLock(CameraCmd cmd); |
| | | |
| | | //配置解锁 |
| | | boolean controlUnLock(CameraCmd cmd); |
| | | |
| | | //获取云台锁定信息 |
| | | int getPTZLockInfo(CameraCmd cmd); |
| | |
| | | //获取ptz范围 |
| | | Map<String, Object> getPtzScope(CameraCmd cmd); |
| | | |
| | | //设置ptz |
| | | boolean setPtz(CameraCmd cmd); |
| | | |
| | | //设置零方位角 |
| | |
| | | String recordStopToMinio(CameraCmd cmd); |
| | | |
| | | //停止录像-不上传minio |
| | | void recordStopNotToMinio(CameraCmd cmd); |
| | | boolean recordStopNotToMinio(CameraCmd cmd); |
| | | |
| | | //获取相机通道信息 |
| | | public List<ArdChannel> getCameraChannelList(ArdCameras camera); |
| | |
| | | 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.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;
|
| | |
| | | * @创建时间 2023/1/17 16:12
|
| | | * @修改人和其它信息
|
| | | */
|
| | | @Async
|
| | | public void syncLogin(ArdCameras camera) {
|
| | | // 初始化
|
| | | if (!hCNetSDK.NET_DVR_Init()) {
|
| | |
| | | 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());
|
| | | 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);
|
| | | }
|
| | | }
|
| | | //创建引导队列
|
| | |
| | | for (ArdCameras camera : ardCameras) {
|
| | | Thread.sleep(500);
|
| | | //异步登录
|
| | | asyncLogin(camera);
|
| | | syncLogin(camera);
|
| | | }
|
| | | } catch (Exception ex) {
|
| | | log.error("初始化登录相机异常:" + ex.getMessage());
|
| | |
| | | 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);
|
| | |
| | | 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());
|
| | |
| | | * @修改人和其它信息
|
| | | */
|
| | | @Override
|
| | | @SdkOperate
|
| | | public boolean pTZControlWithSpeed(CameraCmd cmd) {
|
| | | String cameraId = cmd.getCameraId();
|
| | | boolean enable = cmd.isEnable();
|
| | |
| | | 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;//开启
|
| | |
| | | * @param cmd 相机命令
|
| | | */
|
| | | @Override
|
| | | @SdkOperate
|
| | | public boolean setFocusPos(CameraCmd cmd) {
|
| | | String cameraId = cmd.getCameraId();
|
| | | Integer channelNum = cmd.getChanNo();
|
| | |
| | | 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;
|
| | |
| | | * @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();
|
| | |
| | | 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;
|
| | | }
|
| | |
|
| | | /**
|
| | |
| | | * @param cmd 相机命令
|
| | | */
|
| | | @Override
|
| | | @SdkOperate
|
| | | public boolean setPreset(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);
|
| | | boolean bool = hCNetSDK.NET_DVR_PTZPreset_Other(userId, channelNum, SET_PRESET, PresetIndex);
|
| | | if (!bool) {
|
| | | int code = hCNetSDK.NET_DVR_GetLastError();
|
| | |
| | | * @param cmd 相机命令
|
| | | */
|
| | | @Override
|
| | | @SdkOperate
|
| | | public boolean gotoPreset(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);
|
| | | boolean bool = hCNetSDK.NET_DVR_PTZPreset_Other(userId, channelNum, GOTO_PRESET, PresetIndex);
|
| | | if (!bool) {
|
| | | int code = hCNetSDK.NET_DVR_GetLastError();
|
| | |
| | | * @修改人和其它信息
|
| | | */
|
| | | @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();
|
| | |
| | | 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 = "其他";
|
| | |
| | | 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";
|
| | |
| | | resolution = "1920*1920";
|
| | | break;
|
| | | case 27:
|
| | | resolution = "1920*1080p";
|
| | | resolution = "1920*1080";
|
| | | break;
|
| | | case 28:
|
| | | resolution = "2560*1920";
|
| | |
| | | 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();
|
| | |
| | | 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();
|
| | |
| | | * @修改人和其它信息 注意俯仰角度负值需要加上360得到的正值进行设置
|
| | | */
|
| | | @Override
|
| | | @SdkOperate
|
| | | public boolean setPtz(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 {
|
| | | 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));
|
| | |
| | | }
|
| | |
|
| | | @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 {
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * @描述 操控锁定
|
| | | * @参数 [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锁定信息
|
| | |
| | | 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);
|
| | |
| | | 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();
|
| | |
| | | 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);
|
| | |
| | | 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);
|
| | |
| | | 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);
|
| | |
| | | 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);
|
| | |
| | | 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);
|
| | |
| | | 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;//开启
|
| | |
| | | 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);
|
| | |
| | | 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值,判断是否获取设备能力
|
| | |
| | | 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();
|
| | | //设置图片分辨率
|
| | |
| | | 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();
|
| | |
| | | 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) {
|
| | |
| | | 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();
|
| | |
| | | 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();
|
| | |
| | | }
|
| | |
|
| | | @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();
|
| | |
| | | GlobalVariable.previewMap.remove(cameraId);
|
| | | }
|
| | | log.debug("录像停止");
|
| | | result = true;
|
| | | } catch (Exception ex) {
|
| | | log.error("录像停止异常" + ex.getMessage());
|
| | | result = false;
|
| | | }
|
| | | return result;
|
| | | }
|
| | |
|
| | | //获取IP通道
|
| | |
| | | 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();
|
| | |
| | | import com.ruoyi.device.camera.domain.ArdCameras; |
| | | import com.ruoyi.device.camera.domain.CameraCmd; |
| | | import com.ruoyi.device.camera.mapper.ArdCamerasMapper; |
| | | import com.ruoyi.device.camera.service.ICameraSdkService; |
| | | import com.ruoyi.device.hiksdk.service.IHikClientService; |
| | | import com.ruoyi.inspect.domain.ArdVideoInspectRecord; |
| | | import com.ruoyi.inspect.mapper.ArdVideoInspectRecordMapper; |
| | |
| | | @Resource |
| | | private ArdCamerasMapper ardCamerasMapper; |
| | | @Resource |
| | | private IHikClientService hikClientService; |
| | | private ICameraSdkService cameraSdkService; |
| | | @Resource |
| | | private ArdCamerasMapper camerasMapper; |
| | | |
| | |
| | | cmd.setTargetPosition(targetPositon); |
| | | cmd.setOperator("sys_patrol_inspect"); |
| | | cmd.setExpired(step.getRecordingTime() * 60); |
| | | boolean setTargetPosition = hikClientService.guideTargetPosition(cmd); |
| | | boolean setTargetPosition = cameraSdkService.guideTargetPosition(cmd); |
| | | if (setTargetPosition) { |
| | | /*控制相机巡检成功,开始录像*/ |
| | | hikClientService.recordStart(cmd); |
| | | cameraSdkService.recordStart(cmd); |
| | | } else { |
| | | /*控制失败,当前步骤启动时间置null*/ |
| | | ardVideoInspectTask.setCurrentStepStartTime(""); |
| | |
| | | cmd.setTargetPosition(targetPositon); |
| | | cmd.setOperator("sys_patrol_inspect"); |
| | | cmd.setExpired(step.getRecordingTime() * 60); |
| | | boolean setTargetPosition = hikClientService.guideTargetPosition(cmd); |
| | | boolean setTargetPosition = cameraSdkService.guideTargetPosition(cmd); |
| | | if (!setTargetPosition) { |
| | | /*控制失败,当前步骤启动时间置null*/ |
| | | ardVideoInspectTask.setCurrentStepStartTime(""); |
| | |
| | | cmd.setOperator("sys_patrol_inspect"); |
| | | cmd.setRecordBucketName("record"); |
| | | cmd.setRecordObjectName("inspect_" + IdUtils.fastSimpleUUID()); |
| | | String url = hikClientService.recordStopToMinio(cmd); |
| | | String url = cameraSdkService.recordStopToMinio(cmd); |
| | | /*插入巡检记录*/ |
| | | ArdVideoInspectRecord ardVideoInspectRecord = new ArdVideoInspectRecord(); |
| | | ardVideoInspectRecord.setStepId(step.getId()); |
| | |
| | | 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); |
| | | } |
| | | |
| | |
| | | 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; |
| | |
| | | { |
| | | @Autowired |
| | | private IVtduService vtduService; |
| | | |
| | | @Resource |
| | | private ICameraSdkService cameraSdkService; |
| | | /** |
| | | * 查询流媒体管理列表 |
| | | */ |
| | |
| | | @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)); |
| | | } |
| | | |
| | |
| | | @Data |
| | | public class Conf { |
| | | private String source; |
| | | @JsonProperty("sourceFingerprint") |
| | | private String sourcefingerprint; |
| | | @JsonProperty("sourceOnDemand") |
| | | private boolean sourceondemand; |
| | | @JsonProperty("sourceOnDemandStartTimeout") |
| | | private String sourceondemandstarttimeout; |
| | | @JsonProperty("sourceOnDemandCloseAfter") |
| | | private String sourceondemandcloseafter; |
| | | @JsonProperty("publishUser") |
| | | private String publishuser; |
| | | @JsonProperty("publishPass") |
| | | private String publishpass; |
| | | @JsonProperty("publishIPs") |
| | | private List<String> publiships; |
| | | @JsonProperty("readUser") |
| | | private String readuser; |
| | | @JsonProperty("readPass") |
| | | private String readpass; |
| | | @JsonProperty("readIPs") |
| | | private List<String> readips; |
| | | @JsonProperty("disablePublisherOverride") |
| | | private boolean disablepublisheroverride; |
| | | private String fallback; |
| | | @JsonProperty("sourceProtocol") |
| | | private String sourceprotocol; |
| | | @JsonProperty("sourceAnyPortEnable") |
| | | private boolean sourceanyportenable; |
| | | @JsonProperty("rtspRangeType") |
| | | private String rtsprangetype; |
| | | @JsonProperty("rtspRangeStart") |
| | | private String rtsprangestart; |
| | | @JsonProperty("sourceRedirect") |
| | | private String sourceredirect; |
| | | @JsonProperty("rpiCameraCamID") |
| | | private int rpicameracamid; |
| | | @JsonProperty("rpiCameraWidth") |
| | | private int rpicamerawidth; |
| | | @JsonProperty("rpiCameraHeight") |
| | | private int rpicameraheight; |
| | | @JsonProperty("rpiCameraHFlip") |
| | | private boolean rpicamerahflip; |
| | | @JsonProperty("rpiCameraVFlip") |
| | | private boolean rpicameravflip; |
| | | @JsonProperty("rpiCameraBrightness") |
| | | private int rpicamerabrightness; |
| | | @JsonProperty("rpiCameraContrast") |
| | | private int rpicameracontrast; |
| | | @JsonProperty("rpiCameraSaturation") |
| | | private int rpicamerasaturation; |
| | | @JsonProperty("rpiCameraSharpness") |
| | | private int rpicamerasharpness; |
| | | @JsonProperty("rpiCameraExposure") |
| | | private String rpicameraexposure; |
| | | @JsonProperty("rpiCameraAWB") |
| | | private String rpicameraawb; |
| | | @JsonProperty("rpiCameraDenoise") |
| | | private String rpicameradenoise; |
| | | @JsonProperty("rpiCameraShutter") |
| | | private int rpicamerashutter; |
| | | @JsonProperty("rpiCameraMetering") |
| | | private String rpicamerametering; |
| | | @JsonProperty("rpiCameraGain") |
| | | private int rpicameragain; |
| | | @JsonProperty("rpiCameraEV") |
| | | private int rpicameraev; |
| | | @JsonProperty("rpiCameraROI") |
| | | private String rpicameraroi; |
| | | @JsonProperty("rpiCameraTuningFile") |
| | | private String rpicameratuningfile; |
| | | @JsonProperty("rpiCameraMode") |
| | | private String rpicameramode; |
| | | @JsonProperty("rpiCameraFPS") |
| | | private int rpicamerafps; |
| | | @JsonProperty("rpiCameraIDRPeriod") |
| | | private int rpicameraidrperiod; |
| | | @JsonProperty("rpiCameraBitrate") |
| | | private int rpicamerabitrate; |
| | | @JsonProperty("rpiCameraProfile") |
| | | private String rpicameraprofile; |
| | | @JsonProperty("rpiCameraLevel") |
| | | private String rpicameralevel; |
| | | @JsonProperty("rpiCameraAfMode") |
| | | private String rpicameraafmode; |
| | | @JsonProperty("rpiCameraAfRange") |
| | | private String rpicameraafrange; |
| | | @JsonProperty("rpiCameraAfSpeed") |
| | | private String rpicameraafspeed; |
| | | @JsonProperty("rpiCameraLensPosition") |
| | | private int rpicameralensposition; |
| | | @JsonProperty("rpiCameraAfWindow") |
| | | private String rpicameraafwindow; |
| | | @JsonProperty("rpiCameraTextOverlayEnable") |
| | | private boolean rpicameratextoverlayenable; |
| | | @JsonProperty("rpiCameraTextOverlay") |
| | | private String rpicameratextoverlay; |
| | | @JsonProperty("runOnInit") |
| | | private String runoninit; |
| | | @JsonProperty("runOnInitRestart") |
| | | private boolean runoninitrestart; |
| | | @JsonProperty("runOnDemand") |
| | | private String runondemand; |
| | | @JsonProperty("runOnDemandRestart") |
| | | private boolean runondemandrestart; |
| | | @JsonProperty("runOnDemandStartTimeout") |
| | | private String runondemandstarttimeout; |
| | | @JsonProperty("runOnDemandCloseAfter") |
| | | private String runondemandcloseafter; |
| | | @JsonProperty("runOnReady") |
| | | private String runonready; |
| | | @JsonProperty("runOnReadyRestart") |
| | | private boolean runonreadyrestart; |
| | | @JsonProperty("runOnRead") |
| | | private String runonread; |
| | | @JsonProperty("runOnReadRestart") |
| | | private boolean runonreadrestart; |
| | | |
| | | @JsonProperty("maxReaders") |
| | | private boolean sourceOnDemand; |
| | | private String sourceProtocol; |
| | | private Integer maxReaders; |
| | | private String runOnDemand; |
| | | private boolean runOnDemandRestart; |
| | | private String runOnDemandStartTimeout; |
| | | private String runOnDemandCloseAfter; |
| | | } |
| | |
| | | public class Items { |
| | | private String name; |
| | | private String confName; |
| | | private Conf conf; |
| | | private Source source; |
| | | private List<Readers> readers; |
| | | private boolean sourceReady; |
| | | private List<String> tracks; |
| | | private String mode; |
| | | |
| | | private String id; |
| | | private Date created; |
| | | private String remoteAddr; |
| | | private String state; |
| | | private long bytesReceived; |
| | | private long bytesSent; |
| | | private Long bytesReceived; |
| | | |
| | | } |
| | |
| | | package com.ruoyi.media.service; |
| | | |
| | | import com.dtflys.forest.annotation.Var; |
| | | import com.ruoyi.media.domain.*; |
| | | |
| | | import java.lang.reflect.MalformedParameterizedTypeException; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | |
| | | |
| | | List<String> getNameList(); |
| | | |
| | | boolean checkNameExist(String name); |
| | | |
| | | RtspSession getRtspSessionById(String sessionId); |
| | | |
| | | WebrtcSession getWebrtcSessionById(String sessionId); |
| 对比新文件 |
| | |
| | | package com.ruoyi.media.service; |
| | | |
| | | import com.ruoyi.media.domain.*; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | public interface IMediaV2Service { |
| | | /** |
| | | * 增加路径 |
| | | * name 名称 |
| | | * rtspPath rtsp地址 |
| | | * mode 模式:gpu硬解码/cpu软解码 |
| | | * isCode 是否转码 |
| | | * 刘苏义 |
| | | * 2023/8/12 13:56:52 |
| | | */ |
| | | Map<String, String> addPath(String name, String sourceUrl, String mode, String isCode); |
| | | |
| | | /** |
| | | * 修改路径 |
| | | * name 名称 |
| | | * rtspPath rtsp地址 |
| | | * mode 模式:实时/按需 |
| | | * isCode 是否转码 |
| | | * 刘苏义 |
| | | * 2023/8/12 13:56:52 |
| | | */ |
| | | Map<String, String> editPath(String name, String sourceUrl, String mode, String isCode); |
| | | |
| | | StreamInfo getPathInfo(String name); |
| | | |
| | | void removePath(String[] names); |
| | | |
| | | void removePath(String name); |
| | | |
| | | List<StreamInfo> paths(); |
| | | |
| | | List<String> getNameList(); |
| | | |
| | | boolean checkNameExist(String name); |
| | | |
| | | RtspSession getRtspSessionById(String sessionId); |
| | | |
| | | WebrtcSession getWebrtcSessionById(String sessionId); |
| | | |
| | | RtmpSession getRtmpSessionById(String sessionId); |
| | | |
| | | List<StreamInfo> getPushStreamList(); |
| | | |
| | | List<StreamInfo> getPullStreamList(); |
| | | |
| | | Boolean kickRtspSession(String sessionId); |
| | | |
| | | Boolean kickRtmpSession(String sessionId); |
| | | |
| | | Boolean kickWebrtcSession(String sessionId); |
| | | |
| | | /** |
| | | * 配置流媒体参数 |
| | | * 刘苏义 |
| | | * 2023/10/13 15:17:57 |
| | | */ |
| | | public String setConfig(Config config); |
| | | } |
| | |
| | | package com.ruoyi.media.service.impl; |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.dtflys.forest.Forest; |
| | | import com.dtflys.forest.exceptions.ForestNetworkException; |
| | | import com.dtflys.forest.exceptions.ForestRuntimeException; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.media.domain.*; |
| | | import com.ruoyi.media.mapper.VtduMapper; |
| | | import com.ruoyi.media.service.IMediaService; |
| | | import com.ruoyi.utils.forest.MediaClient; |
| | | import com.ruoyi.utils.tools.ArdTool; |
| | | import com.ruoyi.utils.process.CmdUtils; |
| | | import com.sun.jna.Platform; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.boot.ApplicationArguments; |
| | | import org.springframework.boot.ApplicationRunner; |
| | | import org.springframework.core.annotation.Order; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.PostConstruct; |
| | | import javax.annotation.PreDestroy; |
| | | import javax.annotation.Resource; |
| | | import java.io.File; |
| | | import java.util.*; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | |
| | | String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name; |
| | | String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name; |
| | | |
| | | Conf mediaInfo = new Conf(); |
| | | Conf conf = new Conf(); |
| | | String rootPath = System.getProperty("user.dir").replaceAll("\\\\", "/") + "/lib/mediamtx/"; |
| | | if (isCode.equals("1")) { |
| | | mediaInfo.setSource("publisher"); |
| | | conf.setSource("publisher"); |
| | | //默认软解码 |
| | | String cmd = "ffmpeg -rtsp_transport tcp -i " + sourceUrl + " -vcodec libx264 -preset:v ultrafast -r 25 -keyint_min 25 -g 60 -sc_threshold 0 -threads 6 -b:v 2048k -acodec opus -strict -2 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; |
| | | if (mode.equals("0")) {//硬解码 |
| | | cmd = "ffmpeg -hwaccel cuvid -c:v hevc_cuvid -rtsp_transport tcp -i " + sourceUrl + " -c:v h264_nvenc -r 25 -g 60 -sc_threshold 0 -threads 6 -b:v 2048k -bf 0 -acodec opus -strict -2 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; |
| | | } |
| | | mediaInfo.setRunondemand(cmd); |
| | | mediaInfo.setRunondemandrestart(true); |
| | | mediaInfo.setRunondemandcloseafter("5s"); |
| | | conf.setRunOnDemand(cmd); |
| | | conf.setRunOnDemandRestart(true); |
| | | conf.setRunOnDemandCloseAfter("5s"); |
| | | } else { |
| | | mediaInfo.setSource(sourceUrl); |
| | | mediaInfo.setSourceondemand(true); |
| | | conf.setSource(sourceUrl); |
| | | conf.setSourceOnDemand(true); |
| | | } |
| | | mediaInfo.setMaxReaders(100); |
| | | mediaInfo.setSourceprotocol("tcp"); |
| | | conf.setMaxReaders(100); |
| | | conf.setSourceProtocol("tcp"); |
| | | |
| | | 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)) { |
| | | mediaClient.addPath(name, mediaInfo); |
| | | if (!checkNameExist(name)) { |
| | | mediaClient.addPath(name, conf); |
| | | } |
| | | Map<String, String> map = new HashMap<>(); |
| | | map.put("rtspUrl", rtspUrl); |
| | |
| | | String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name; |
| | | String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name; |
| | | |
| | | Conf mediaInfo = new Conf(); |
| | | Conf conf = new Conf(); |
| | | String rootPath = System.getProperty("user.dir").replaceAll("\\\\", "/") + "/lib/mediamtx/"; |
| | | if (isCode.equals("1")) { |
| | | mediaInfo.setSource("publisher"); |
| | | conf.setSource("publisher"); |
| | | //默认软解码 |
| | | String cmd = "ffmpeg -rtsp_transport tcp -i " + sourceUrl + " -vcodec libx264 -preset:v ultrafast -r 25 -keyint_min 25 -g 60 -sc_threshold 0 -threads 6 -b:v 2048k -acodec opus -strict -2 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; |
| | | if (mode.equals("0")) {//硬解码 |
| | | cmd = "ffmpeg -hwaccel cuvid -c:v hevc_cuvid -rtsp_transport tcp -i " + sourceUrl + " -c:v h264_nvenc -r 25 -g 60 -sc_threshold 0 -threads 6 -b:v 2048k -bf 0 -acodec opus -strict -2 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; |
| | | } |
| | | mediaInfo.setRunondemand(cmd); |
| | | mediaInfo.setRunondemandrestart(true); |
| | | mediaInfo.setRunondemandcloseafter("5s"); |
| | | conf.setRunOnDemand(cmd); |
| | | conf.setRunOnDemandRestart(true); |
| | | conf.setRunOnDemandCloseAfter("5s"); |
| | | } else { |
| | | mediaInfo.setSource(sourceUrl); |
| | | conf.setSource(sourceUrl); |
| | | conf.setSourceOnDemand(true); |
| | | } |
| | | mediaInfo.setMaxReaders(100); |
| | | mediaInfo.setSourceprotocol("tcp"); |
| | | conf.setMaxReaders(100); |
| | | conf.setSourceProtocol("tcp"); |
| | | |
| | | mediaClient.editPath(name, mediaInfo); |
| | | if (checkNameExist(name)) { |
| | | mediaClient.editPath(name, conf); |
| | | } |
| | | |
| | | // Map<String,String> map=new HashMap<>(); |
| | | map.put("rtspUrl", rtspUrl); |
| | | map.put("rtmpUrl", rtmpUrl); |
| | | map.put("webrtcUrl", webrtcUrl); |
| | |
| | | |
| | | @Override |
| | | public StreamInfo getPathInfo(String name) { |
| | | Items item = mediaClient.getPathInfo(name); |
| | | Conf conf = mediaClient.getPathInfo(name); |
| | | StreamInfo info = new StreamInfo(); |
| | | //ID |
| | | info.setName(name); |
| | | String runOn; |
| | | if (StringUtils.isNotEmpty(item.getConf().getRunondemand())) { |
| | | runOn = item.getConf().getRunondemand(); |
| | | String runOn = ""; |
| | | if (StringUtils.isNotEmpty(conf.getRunOnDemand())) { |
| | | runOn = conf.getRunOnDemand(); |
| | | info.setMode("0"); |
| | | } else { |
| | | //runOn = item.getConf().getRunonready(); |
| | | runOn = item.getConf().getRunoninit(); |
| | | info.setMode("1"); |
| | | } |
| | | //RTSP源地址 |
| | | Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn); |
| | |
| | | info.setRtspSource(matcher.group()); |
| | | info.setIsCode("1"); |
| | | } else { |
| | | info.setRtspSource(item.getConf().getSource()); |
| | | info.setRtspSource(conf.getSource()); |
| | | info.setIsCode("0"); |
| | | } |
| | | return info; |
| | |
| | | @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 |
| | |
| | | //ID |
| | | String name = item.getName(); |
| | | info.setName(name); |
| | | |
| | | Conf conf = mediaClient.getPathInfo(name); |
| | | String runOn = ""; |
| | | if (StringUtils.isNotEmpty(item.getConf().getRunondemand())) { |
| | | runOn = item.getConf().getRunondemand(); |
| | | if (StringUtils.isNotEmpty(conf.getRunOnDemand())) { |
| | | runOn = conf.getRunOnDemand(); |
| | | } |
| | | //RTSP源地址 |
| | | Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn); |
| | |
| | | info.setRtspSource(matcher.group()); |
| | | info.setIsCode("1"); |
| | | } else { |
| | | info.setRtspSource(item.getConf().getSource()); |
| | | info.setRtspSource(conf.getSource()); |
| | | info.setIsCode("0"); |
| | | } |
| | | //传输协议 |
| | |
| | | } |
| | | return pathInfoList; |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public RtspSession getRtspSessionById(String sessionId) { |
| | |
| | | //ID |
| | | String name = item.getName(); |
| | | info.setName(name); |
| | | |
| | | Conf conf = mediaClient.getPathInfo(name); |
| | | |
| | | //RTMP播放地址 |
| | | String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name; |
| | | info.setRtmpUrl(rtmpUrl); |
| | |
| | | } |
| | | //RTSP源地址 |
| | | String runOn = ""; |
| | | if (StringUtils.isNotEmpty(item.getConf().getRunondemand())) { |
| | | runOn = item.getConf().getRunondemand(); |
| | | if (StringUtils.isNotEmpty(conf.getRunOnDemand())) { |
| | | runOn = conf.getRunOnDemand(); |
| | | } |
| | | Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn); |
| | | if (matcher.find()) { |
| | | info.setRtspSource(matcher.group()); |
| | | } else { |
| | | info.setRtspSource(item.getConf().getSource()); |
| | | info.setRtspSource(conf.getSource()); |
| | | } |
| | | //传输协议 |
| | | info.setProtocol(item.getConf().getSourceprotocol()); |
| | | info.setProtocol(conf.getSourceProtocol()); |
| | | //拉流数量 |
| | | List<Readers> readers = item.getReaders(); |
| | | info.setNum(readers.size()); |
| | |
| | | //ID |
| | | String name = item.getName(); |
| | | info.setName(name); |
| | | Conf conf = mediaClient.getPathInfo(name); |
| | | //传输协议 |
| | | info.setProtocol(item.getConf().getSourceprotocol()); |
| | | info.setProtocol(conf.getSourceProtocol()); |
| | | |
| | | String type = reader.getType(); |
| | | switch (type) { |
| | |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取流媒体name列表 |
| | | * 获取流媒体name列表 |
| | | * 刘苏义 |
| | | * 2023/10/13 14:19:07 |
| | | */ |
| | | @Override |
| | | public List<String> getNameList() { |
| | | 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(); |
| | |
| | | } |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | | * 配置流媒体参数 |
| | | */ |
| 对比新文件 |
| | |
| | | package com.ruoyi.media.service.impl; |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.dtflys.forest.exceptions.ForestNetworkException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.media.domain.*; |
| | | import com.ruoyi.media.service.IMediaService; |
| | | import com.ruoyi.media.service.IMediaV2Service; |
| | | import com.ruoyi.utils.forest.MediaClient; |
| | | import com.ruoyi.utils.tools.ArdTool; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.core.annotation.Order; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | /** |
| | | * @Description: 流媒体业务 |
| | | * @ClassName: MediaService |
| | | * @Author: 刘苏义 |
| | | * @Date: 2023年07月13日9:28 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @Service |
| | | @Slf4j(topic = "cmd") |
| | | @Order(2) |
| | | public class MediaV2ServiceImpl implements IMediaV2Service { |
| | | |
| | | @Resource |
| | | MediaClient mediaClient; |
| | | |
| | | @Value("${mediamtx.host}") |
| | | String mediamtxHost; |
| | | |
| | | /** |
| | | * 添加流媒体 |
| | | * name 相机ID |
| | | * sourceUrl rtsp地址 |
| | | * isCode 0-不转码 1-转码 |
| | | * mode 0-gpu硬解码 1-cpu软解码 |
| | | * <p> |
| | | * 刘苏义 |
| | | * 2023/10/12 9:03:41 |
| | | */ |
| | | @Override |
| | | public Map<String, String> addPath(String name, String sourceUrl, String mode, String isCode) { |
| | | |
| | | String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name; |
| | | String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name; |
| | | String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name; |
| | | |
| | | Conf conf = new Conf(); |
| | | String rootPath = System.getProperty("user.dir").replaceAll("\\\\", "/") + "/lib/mediamtx/"; |
| | | if (isCode.equals("1")) { |
| | | conf.setSource("publisher"); |
| | | //默认软解码 |
| | | String cmd = "ffmpeg -rtsp_transport tcp -i " + sourceUrl + " -vcodec libx264 -preset:v ultrafast -r 25 -keyint_min 25 -g 60 -sc_threshold 0 -threads 6 -b:v 2048k -acodec opus -strict -2 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; |
| | | if (mode.equals("0")) {//硬解码 |
| | | cmd = "ffmpeg -hwaccel cuvid -c:v hevc_cuvid -rtsp_transport tcp -i " + sourceUrl + " -c:v h264_nvenc -r 25 -g 60 -sc_threshold 0 -threads 6 -b:v 2048k -bf 0 -acodec opus -strict -2 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; |
| | | } |
| | | conf.setRunOnDemand(cmd); |
| | | conf.setRunOnDemandRestart(true); |
| | | conf.setRunOnDemandCloseAfter("5s"); |
| | | } else { |
| | | conf.setSource(sourceUrl); |
| | | conf.setRunOnDemandRestart(true); |
| | | } |
| | | conf.setMaxReaders(100); |
| | | conf.setSourceProtocol("tcp"); |
| | | |
| | | 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)) { |
| | | mediaClient.addPath(name, conf); |
| | | } |
| | | Map<String, String> map = new HashMap<>(); |
| | | map.put("rtspUrl", rtspUrl); |
| | | map.put("rtmpUrl", rtmpUrl); |
| | | map.put("webrtcUrl", webrtcUrl); |
| | | return map; |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, String> editPath(String name, String sourceUrl, String mode, String isCode) { |
| | | Map<String, String> map = new HashMap<>(); |
| | | try { |
| | | String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name; |
| | | String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name; |
| | | String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name; |
| | | |
| | | Conf mediaInfo = new Conf(); |
| | | String rootPath = System.getProperty("user.dir").replaceAll("\\\\", "/") + "/lib/mediamtx/"; |
| | | if (isCode.equals("1")) { |
| | | mediaInfo.setSource("publisher"); |
| | | //默认软解码 |
| | | String cmd = "ffmpeg -rtsp_transport tcp -i " + sourceUrl + " -vcodec libx264 -preset:v ultrafast -r 25 -keyint_min 25 -g 60 -sc_threshold 0 -threads 6 -b:v 2048k -acodec opus -strict -2 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; |
| | | if (mode.equals("0")) {//硬解码 |
| | | cmd = "ffmpeg -hwaccel cuvid -c:v hevc_cuvid -rtsp_transport tcp -i " + sourceUrl + " -c:v h264_nvenc -r 25 -g 60 -sc_threshold 0 -threads 6 -b:v 2048k -bf 0 -acodec opus -strict -2 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; |
| | | } |
| | | mediaInfo.setRunOnDemand(cmd); |
| | | mediaInfo.setRunOnDemandRestart(true); |
| | | mediaInfo.setRunOnDemandCloseAfter("5s"); |
| | | } else { |
| | | mediaInfo.setSource(sourceUrl); |
| | | } |
| | | mediaInfo.setMaxReaders(100); |
| | | mediaInfo.setSourceProtocol("tcp"); |
| | | |
| | | if (checkNameExist(name)) { |
| | | mediaClient.editPath(name, mediaInfo); |
| | | } |
| | | |
| | | map.put("rtspUrl", rtspUrl); |
| | | map.put("rtmpUrl", rtmpUrl); |
| | | map.put("webrtcUrl", webrtcUrl); |
| | | } catch (ForestNetworkException ex) { |
| | | log.error(ex.getMessage()); |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | @Override |
| | | public StreamInfo getPathInfo(String name) { |
| | | Conf conf = mediaClient.getPathInfo(name); |
| | | StreamInfo info = new StreamInfo(); |
| | | //ID |
| | | info.setName(name); |
| | | String runOn=""; |
| | | if (StringUtils.isNotEmpty(conf.getRunOnDemand())) { |
| | | runOn = conf.getRunOnDemand(); |
| | | } |
| | | //RTSP源地址 |
| | | Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn); |
| | | if (matcher.find()) { |
| | | info.setRtspSource(matcher.group()); |
| | | info.setIsCode("1"); |
| | | } else { |
| | | info.setRtspSource(conf.getSource()); |
| | | info.setIsCode("0"); |
| | | } |
| | | return info; |
| | | } |
| | | |
| | | @Override |
| | | public void removePath(String[] names) { |
| | | for (String name : names) { |
| | | if(checkNameExist(name)) { |
| | | mediaClient.removePath(name);} |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void removePath(String name) { |
| | | if(checkNameExist(name)) { |
| | | mediaClient.removePath(name); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<StreamInfo> paths() { |
| | | String list = mediaClient.paths(); |
| | | JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); |
| | | List<Items> items = jsonsRoot.getItems(); |
| | | List<StreamInfo> pathInfoList = new ArrayList<>(); |
| | | for (Items item : items) { |
| | | StreamInfo info = new StreamInfo(); |
| | | //ID |
| | | String name = item.getName(); |
| | | info.setName(name); |
| | | Conf conf = mediaClient.getPathInfo(name); |
| | | |
| | | String runOn = ""; |
| | | if (StringUtils.isNotEmpty(conf.getRunOnDemand())) { |
| | | runOn = conf.getRunOnDemand(); |
| | | } |
| | | //RTSP源地址 |
| | | Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn); |
| | | if (matcher.find()) { |
| | | info.setRtspSource(matcher.group()); |
| | | info.setIsCode("1"); |
| | | } else { |
| | | info.setRtspSource(conf.getSource()); |
| | | info.setIsCode("0"); |
| | | } |
| | | //传输协议 |
| | | matcher = Pattern.compile("-rtsp_transport\\s+(\\w+)").matcher(runOn); |
| | | if (matcher.find()) { |
| | | info.setProtocol(matcher.group(1)); |
| | | } |
| | | |
| | | pathInfoList.add(info); |
| | | } |
| | | return pathInfoList; |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public RtspSession getRtspSessionById(String sessionId) { |
| | | String list = mediaClient.getRtspsessionById(sessionId); |
| | | RtspSession rtspSession = JSONObject.parseObject(list, RtspSession.class); |
| | | return rtspSession; |
| | | } |
| | | |
| | | @Override |
| | | public WebrtcSession getWebrtcSessionById(String sessionId) { |
| | | String list = mediaClient.getWebrtcsessionById(sessionId); |
| | | WebrtcSession webrtcSession = JSONObject.parseObject(list, WebrtcSession.class); |
| | | return webrtcSession; |
| | | } |
| | | |
| | | @Override |
| | | public RtmpSession getRtmpSessionById(String sessionId) { |
| | | String list = mediaClient.getRtmpsessionById(sessionId); |
| | | RtmpSession rtmpSession = JSONObject.parseObject(list, RtmpSession.class); |
| | | return rtmpSession; |
| | | } |
| | | |
| | | /** |
| | | * 获取推流列表 |
| | | * 刘苏义 |
| | | * 2023/8/29 9:37:05 |
| | | */ |
| | | @Override |
| | | public List<StreamInfo> getPushStreamList() { |
| | | List<StreamInfo> PushStreamInfoList = new ArrayList<>(); |
| | | String list = mediaClient.paths(); |
| | | JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); |
| | | List<Items> items = jsonsRoot.getItems(); |
| | | for (Items item : items) { |
| | | StreamInfo info = new StreamInfo(); |
| | | //ID |
| | | String name = item.getName(); |
| | | info.setName(name); |
| | | |
| | | Conf conf = mediaClient.getPathInfo(name); |
| | | //RTMP播放地址 |
| | | String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name; |
| | | info.setRtmpUrl(rtmpUrl); |
| | | //RTSP播放地址 |
| | | String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name; |
| | | info.setRtspUrl(rtspUrl); |
| | | //WEBRTC播放地址 |
| | | String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name; |
| | | info.setWebrtcUrl(webrtcUrl); |
| | | Source source = item.getSource(); |
| | | if (source == null || source.getId().equals("")) { |
| | | //会话ID |
| | | info.setId("0"); |
| | | //上行流量 |
| | | long bytesReceived = item.getBytesReceived(); |
| | | String formatReceivedSize = ArdTool.formatFileSize(bytesReceived); |
| | | info.setUpTraffic(formatReceivedSize); |
| | | } else { |
| | | RtspSession rtspSession = getRtspSessionById(source.getId()); |
| | | //会话ID |
| | | info.setId(rtspSession.getId()); |
| | | //开始推流时间 |
| | | info.setBeginTime(rtspSession.getCreated()); |
| | | //上行流量 |
| | | long bytesReceived = rtspSession.getBytesReceived(); |
| | | String formatReceivedSize = ArdTool.formatFileSize(bytesReceived); |
| | | info.setUpTraffic(formatReceivedSize); |
| | | //下行流量 |
| | | long bytesSent = rtspSession.getBytesSent(); |
| | | String formatSentSize = ArdTool.formatFileSize(bytesSent); |
| | | info.setDownTraffic(formatSentSize); |
| | | //推流服务器 |
| | | info.setRemoteAddr(rtspSession.getRemoteAddr()); |
| | | } |
| | | //RTSP源地址 |
| | | String runOn = ""; |
| | | if (StringUtils.isNotEmpty(conf.getRunOnDemand())) { |
| | | runOn = conf.getRunOnDemand(); |
| | | } |
| | | Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn); |
| | | if (matcher.find()) { |
| | | info.setRtspSource(matcher.group()); |
| | | } else { |
| | | info.setRtspSource(conf.getSource()); |
| | | } |
| | | //传输协议 |
| | | info.setProtocol(conf.getSourceProtocol()); |
| | | //拉流数量 |
| | | List<Readers> readers = item.getReaders(); |
| | | info.setNum(readers.size()); |
| | | |
| | | PushStreamInfoList.add(info); |
| | | } |
| | | return PushStreamInfoList; |
| | | } |
| | | |
| | | /** |
| | | * 获取拉流列表 |
| | | * 刘苏义 |
| | | * 2023/8/29 9:37:05 |
| | | */ |
| | | @Override |
| | | public List<StreamInfo> getPullStreamList() { |
| | | List<StreamInfo> PullStreamInfoList = new ArrayList<>(); |
| | | String list = mediaClient.paths(); |
| | | JsonsRoot jsonsRoot = JSONObject.parseObject(list, JsonsRoot.class); |
| | | List<Items> items = jsonsRoot.getItems(); |
| | | for (Items item : items) { |
| | | List<Readers> readers = item.getReaders(); |
| | | for (Readers reader : readers) { |
| | | StreamInfo info = new StreamInfo(); |
| | | //ID |
| | | String name = item.getName(); |
| | | info.setName(name); |
| | | |
| | | Conf conf = mediaClient.getPathInfo(name); |
| | | //传输协议 |
| | | info.setProtocol(conf.getSourceProtocol()); |
| | | |
| | | String type = reader.getType(); |
| | | switch (type) { |
| | | case "rtmpConn": |
| | | info.setSessionType("rtmp"); |
| | | //webrtc播放地址 |
| | | String url = "rtmp://" + mediamtxHost + ":1935/" + name; |
| | | info.setRtspUrl(url); |
| | | RtmpSession rtmpSession = getRtmpSessionById(reader.getId()); |
| | | //会话ID |
| | | info.setId(rtmpSession.getId()); |
| | | //开始拉流时间 |
| | | info.setBeginTime(rtmpSession.getCreated()); |
| | | //上行流量 |
| | | long bytesReceived = rtmpSession.getBytesReceived(); |
| | | String formatReceivedSize = ArdTool.formatFileSize(bytesReceived); |
| | | info.setUpTraffic(formatReceivedSize); |
| | | //下行流量 |
| | | long bytesSent = rtmpSession.getBytesSent(); |
| | | String formatSentSize = ArdTool.formatFileSize(bytesSent); |
| | | info.setDownTraffic(formatSentSize); |
| | | //拉流服务器 |
| | | info.setRemoteAddr(rtmpSession.getRemoteAddr()); |
| | | PullStreamInfoList.add(info); |
| | | break; |
| | | case "webRTCSession": |
| | | info.setSessionType("webrtc"); |
| | | //webrtc播放地址 |
| | | url = "http://" + mediamtxHost + ":8889/" + name; |
| | | info.setRtspUrl(url); |
| | | WebrtcSession webrtcSession = getWebrtcSessionById(reader.getId()); |
| | | //会话ID |
| | | info.setId(webrtcSession.getId()); |
| | | //开始拉流时间 |
| | | info.setBeginTime(webrtcSession.getCreated()); |
| | | //上行流量 |
| | | bytesReceived = webrtcSession.getBytesReceived(); |
| | | formatReceivedSize = ArdTool.formatFileSize(bytesReceived); |
| | | info.setUpTraffic(formatReceivedSize); |
| | | //下行流量 |
| | | bytesSent = webrtcSession.getBytesSent(); |
| | | formatSentSize = ArdTool.formatFileSize(bytesSent); |
| | | info.setDownTraffic(formatSentSize); |
| | | //拉流服务器 |
| | | info.setRemoteAddr(webrtcSession.getRemoteAddr()); |
| | | PullStreamInfoList.add(info); |
| | | break; |
| | | case "rtspSession": |
| | | info.setSessionType("rtsp"); |
| | | //RTSP播放地址 |
| | | String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name; |
| | | info.setRtspUrl(rtspUrl); |
| | | RtspSession rtspSession = getRtspSessionById(reader.getId()); |
| | | //会话ID |
| | | info.setId(rtspSession.getId()); |
| | | //开始拉流时间 |
| | | info.setBeginTime(rtspSession.getCreated()); |
| | | //上行流量 |
| | | bytesReceived = rtspSession.getBytesReceived(); |
| | | formatReceivedSize = ArdTool.formatFileSize(bytesReceived); |
| | | info.setUpTraffic(formatReceivedSize); |
| | | //下行流量 |
| | | bytesSent = rtspSession.getBytesSent(); |
| | | formatSentSize = ArdTool.formatFileSize(bytesSent); |
| | | info.setDownTraffic(formatSentSize); |
| | | //拉流服务器 |
| | | info.setRemoteAddr(rtspSession.getRemoteAddr()); |
| | | PullStreamInfoList.add(info); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | Comparator<StreamInfo> comparator = Comparator.comparing(streamInfo -> streamInfo.getBeginTime()); // 使用Collections.sort方法进行排序 Collections.sort(personList, comparator); |
| | | Collections.sort(PullStreamInfoList, comparator.reversed()); |
| | | return PullStreamInfoList; |
| | | } |
| | | |
| | | /** |
| | | * 踢出rtsp会话 |
| | | * 刘苏义 |
| | | * 2023/8/29 9:37:05 |
| | | */ |
| | | @Override |
| | | public Boolean kickRtspSession(String sessionId) { |
| | | try { |
| | | mediaClient.kickRtspSessions(sessionId); |
| | | return true; |
| | | } catch (Exception ex) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 踢出rtmp会话 |
| | | * 刘苏义 |
| | | * 2023/8/29 9:37:05 |
| | | */ |
| | | @Override |
| | | public Boolean kickRtmpSession(String sessionId) { |
| | | try { |
| | | mediaClient.kickRtmpSessions(sessionId); |
| | | return true; |
| | | } catch (Exception ex) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 踢出webrtc会话 |
| | | * 刘苏义 |
| | | * 2023/8/29 9:37:05 |
| | | */ |
| | | @Override |
| | | public Boolean kickWebrtcSession(String sessionId) { |
| | | try { |
| | | mediaClient.kickWebrtcSessions(sessionId); |
| | | return true; |
| | | } catch (Exception ex) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取流媒体name列表 |
| | | * 刘苏义 |
| | | * 2023/10/13 14:19:07 |
| | | */ |
| | | @Override |
| | | public List<String> getNameList() { |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | | * 配置流媒体参数 |
| | | */ |
| | | @Override |
| | | public String setConfig(Config config) { |
| | | return mediaClient.setConfig(config); |
| | | } |
| | | } |
| | |
| | | package com.ruoyi.media.service.impl; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.uuid.IdUtils; |
| | | import com.ruoyi.media.service.IMediaService; |
| | | import com.ruoyi.utils.forest.MediaClient; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.media.mapper.VtduMapper; |
| | | import com.ruoyi.media.domain.Vtdu; |
| | |
| | | * @date 2023-08-29 |
| | | */ |
| | | @Service |
| | | @Slf4j |
| | | @Slf4j(topic = "sdk") |
| | | public class VtduServiceImpl implements IVtduService { |
| | | @Resource |
| | | private VtduMapper vtduMapper; |
| | |
| | | */ |
| | | @Override |
| | | public Vtdu selectVtduByName(String name) { |
| | | |
| | | return vtduMapper.selectVtduByName(name); |
| | | } |
| | | |
| | |
| | | */ |
| | | @Override |
| | | public int insertVtdu(Vtdu vtdu) { |
| | | log.info("流媒体【" + vtdu.getName() + "】通道添加"); |
| | | log.debug("流媒体【" + vtdu.getName() + "】通道添加"); |
| | | Map<String, String> map = mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); |
| | | vtdu.setRtspUrl(map.get("rtspUrl")); |
| | | vtdu.setRtmpUrl(map.get("rtmpUrl")); |
| | |
| | | @Override |
| | | public int updateVtdu(Vtdu vtdu) { |
| | | |
| | | log.info("流媒体【" + vtdu.getName() + "】通道更新"); |
| | | log.debug("流媒体【" + vtdu.getName() + "】通道更新"); |
| | | Map<String, String> map = mediaService.editPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode()); |
| | | vtdu.setName(vtdu.getName()); |
| | | vtdu.setRtspSource(vtdu.getRtspSource()); |
| | |
| | | */ |
| | | @Override |
| | | public int deleteVtduByNames(String[] names) { |
| | | for (String name : names) { |
| | | log.debug("流媒体【" + name + "】通道删除"); |
| | | } |
| | | mediaService.removePath(names); |
| | | return vtduMapper.deleteVtduByNames(names); |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | public int deleteVtduByName(String name) { |
| | | log.debug("流媒体【" + name + "】通道删除"); |
| | | mediaService.removePath(name); |
| | | return vtduMapper.deleteVtduByName(name); |
| | | } |
| | | |
| | |
| | | package com.ruoyi.utils.forest; |
| | | |
| | | import com.dtflys.forest.annotation.*; |
| | | import com.dtflys.forest.callback.OnError; |
| | | import com.ruoyi.media.domain.Conf; |
| | | import com.ruoyi.media.domain.Config; |
| | | import com.ruoyi.media.domain.Items; |
| | |
| | | * @Date: 2023年07月06日9:51 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @BaseRequest(baseURL = "http://#{mediamtx.host}:9997/v2") |
| | | @BaseRequest(baseURL = "http://#{mediamtx.host}:9997/v3") |
| | | public interface MediaClient { |
| | | /** |
| | | * 增加路径 |
| | |
| | | /** |
| | | * 修改路径 |
| | | */ |
| | | @Post(url = "/config/paths/edit/{name}", async = true) |
| | | @Patch(url = "/config/paths/patch/{name}") |
| | | public String editPath(@Var("name") String name, @JSONBody Conf body); |
| | | |
| | | /** |
| | | * 移除路径 |
| | | */ |
| | | @Post("/config/paths/remove/{name}") |
| | | @Delete("/config/paths/delete/{name}") |
| | | public String removePath(@Var("name") String name); |
| | | |
| | | /** |
| | | * 获取路径详情 |
| | | */ |
| | | @Get("/paths/get/{name}") |
| | | public Items getPathInfo(@Var("name") String name); |
| | | @Get("/config/paths/get/{name}") |
| | | public Conf getPathInfo(@Var("name") String name); |
| | | |
| | | /** |
| | | * 查询所有路径 |
| | |
| | | */ |
| | | @Get("/rtspsessions/list") |
| | | public String rtspsessions(); |
| | | |
| | | /** |
| | | * 查询所有rtsp连接 |
| | | */ |
| | | @Get("/rtspconns/list") |
| | | public String rtspconns(); |
| | | |
| | | /** |
| | | * 按sessionId查询rtsp会话 |
| 对比新文件 |
| | |
| | | package com.ruoyi.utils.forest; |
| | | |
| | | import com.dtflys.forest.annotation.*; |
| | | import com.ruoyi.media.domain.Conf; |
| | | import com.ruoyi.media.domain.Config; |
| | | import com.ruoyi.media.domain.Items; |
| | | |
| | | /** |
| | | * @Description: mediamtx流媒体客户端 |
| | | * @ClassName: client |
| | | * @Author: 刘苏义 |
| | | * @Date: 2023年07月06日9:51 |
| | | * @Version: 1.0 |
| | | **/ |
| | | @BaseRequest(baseURL = "http://#{mediamtx.host}:9997/v2") |
| | | public interface MediaClientV2 { |
| | | /** |
| | | * 增加路径 |
| | | */ |
| | | @Post(url = "/config/paths/add/{name}") |
| | | public String addPath(@Var("name") String name, @JSONBody Conf body); |
| | | |
| | | /** |
| | | * 修改路径 |
| | | */ |
| | | @Post(url = "/config/paths/edit/{name}", async = true) |
| | | public String editPath(@Var("name") String name, @JSONBody Conf body); |
| | | |
| | | /** |
| | | * 移除路径 |
| | | */ |
| | | @Post("/config/paths/remove/{name}") |
| | | public String removePath(@Var("name") String name); |
| | | |
| | | /** |
| | | * 获取路径详情 |
| | | */ |
| | | @Get("/paths/get/{name}") |
| | | public Items getPathInfo(@Var("name") String name); |
| | | |
| | | /** |
| | | * 查询所有路径 |
| | | */ |
| | | @Get("/paths/list") |
| | | public String paths(); |
| | | |
| | | /** |
| | | * 查询所有rtsp会话 |
| | | */ |
| | | @Get("/rtspsessions/list") |
| | | public String rtspsessions(); |
| | | |
| | | /** |
| | | * 查询所有rtsp连接 |
| | | */ |
| | | @Get("/rtspconns/list") |
| | | public String rtspconns(); |
| | | |
| | | /** |
| | | * 按sessionId查询rtsp会话 |
| | | */ |
| | | @Get("/rtspsessions/get/{sessionId}") |
| | | public String getRtspsessionById(@Var("sessionId") String sessionId); |
| | | |
| | | /** |
| | | * 按sessionId查询webrtc会话 |
| | | */ |
| | | @Get("/webrtcsessions/get/{sessionId}") |
| | | public String getWebrtcsessionById(@Var("sessionId") String sessionId); |
| | | |
| | | /** |
| | | * 按sessionId查询rtmp会话 |
| | | */ |
| | | @Get("/rtmpconns/get/{sessionId}") |
| | | public String getRtmpsessionById(@Var("sessionId") String sessionId); |
| | | |
| | | /** |
| | | * 按sessionId删除rtsp会话 |
| | | */ |
| | | @Post("/rtspsessions/kick/{sessionId}") |
| | | public String kickRtspSessions(@Var("sessionId") String sessionId); |
| | | |
| | | /** |
| | | * 按sessionId删除rtmp连接 |
| | | */ |
| | | @Post("/rtmpconns/kick/{sessionId}") |
| | | public String kickRtmpSessions(@Var("sessionId") String sessionId); |
| | | |
| | | /** |
| | | * 按sessionId删除webrtc会话 |
| | | */ |
| | | @Post("/webrtcsessions/kick/{sessionId}") |
| | | public String kickWebrtcSessions(@Var("sessionId") String sessionId); |
| | | |
| | | /** |
| | | * 配置流媒体参数 |
| | | */ |
| | | @Post("/config/set") |
| | | public String setConfig(@JSONBody Config config); |
| | | } |
| | |
| | | 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; |
| | |
| | | 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(); |
| | | } |
| | | } |
| | |
| | | <button class="toggle-button" onclick="changeGrid(7, 7)">7x7</button> |
| | | <button class="toggle-button" onclick="changeGrid(8, 8)">8x8</button> |
| | | <button class="toggle-button" onclick="changeGrid(9, 9)">9x9</button> |
| | | <input id="videoUrl" type="text" value="http://192.168.1.227:8889/164/" style="width: 250px"/> |
| | | <input id="videoUrl" type="text" value="" style="width: 250px"/> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | console.log(RTCRtpReceiver.getCapabilities('video').codecs) |
| | | console.log(RTCRtpReceiver.getCapabilities('audio').codecs) |
| | | //whep操作方法 |
| | | const restartPause = 2000; |
| | | const linkToIceServers = (links) => ( |
| | | (links !== null) ? links.split(', ').map((link) => { |
| | | const m = link.match(/^<(.+?)>; rel="ice-server"(; username="(.*?)"; credential="(.*?)"; credential-type="password")?/i); |
| | |
| | | if (res.status !== 201) { |
| | | throw new Error('bad status code'); |
| | | } |
| | | // this.eTag = res.headers.get('ETag'); |
| | | // this.eTag = res.headers.get('ETag'); |
| | | this.eTag = res.headers.get("ETag") || res.headers.get('E-Tag'); |
| | | return res.text(); |
| | | }) |
| | |
| | | 'Content-Type': 'application/trickle-ice-sdpfrag', |
| | | 'If-Match': this.eTag, |
| | | }, |
| | | |
| | | body: generateSdpFragment(this.offerData, candidates), |
| | | }) |
| | | .then((res) => { |
| | |
| | | chanMap.set("video" + i, videoUrl); |
| | | } |
| | | console.log(chanMap); |
| | | changeGrid(2, 2); |
| | | //changeGrid(2, 2); |
| | | } |
| | | //绑定点击事件 |
| | | let playMap = new Map(); |
| | |
| | | window.onload = function () { |
| | | console.log(RTCRtpReceiver.getCapabilities('video').codecs) |
| | | $.ajax({ |
| | | url: "../hik/list", |
| | | url: "../cameraSdk/list", |
| | | type: "get", |
| | | success: function (data) { |
| | | console.log(data); |
| | |
| | | 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, |
| | |
| | | } |
| | | //云台上下左右 |
| | | $("#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); |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/setPreset", |
| | | url: "../cameraSdk/setPreset", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(opt), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/gotoPreset", |
| | | url: "../cameraSdk/gotoPreset", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(opt), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/getPTZ", |
| | | url: "../cameraSdk/getPTZ", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(opt), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/setPTZ", |
| | | url: "../cameraSdk/setPTZ", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(myEntity), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/setTargetPosition", |
| | | url: "../cameraSdk/setTargetPosition", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(myEntity), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/setZeroPTZ", |
| | | url: "../cameraSdk/setZeroPTZ", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(opt), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/PTZControlWithSpeed", |
| | | url: "../cameraSdk/PTZControlWithSpeed", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(opt), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/defogcfg", |
| | | url: "../cameraSdk/defogcfg", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optOpen), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/defogcfg", |
| | | url: "../cameraSdk/defogcfg", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optClose), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/infrarecfg", |
| | | url: "../cameraSdk/infrarecfg", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optOpen), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/infrarecfg", |
| | | url: "../cameraSdk/infrarecfg", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optClose), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/focusMode", |
| | | url: "../cameraSdk/focusMode", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optOpen), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/focusMode", |
| | | url: "../cameraSdk/focusMode", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optClose), |
| | |
| | | '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); |
| | | } |
| | | }) |
| | | }) |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/heateRpwron", |
| | | url: "../cameraSdk/heateRpwron", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optOpen), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/heateRpwron", |
| | | url: "../cameraSdk/heateRpwron", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optClose), |
| | |
| | | 'Accept': 'application/json', |
| | | 'Content-Type': 'application/json' |
| | | }, |
| | | url: "../hik/cameraDeicing", |
| | | url: "../cameraSdk/cameraDeicing", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optOpen), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/cameraDeicing", |
| | | url: "../cameraSdk/cameraDeicing", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optClose), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/captureJPEGPicture", |
| | | url: "../cameraSdk/captureJPEGPicture", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(opt), |
| | |
| | | '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 ) |
| | | |
| | | } |
| | | }) |
| | | }) |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/record", |
| | | url: "../cameraSdk/record", |
| | | type: "post", |
| | | dataType: "json", |
| | | data: JSON.stringify(optOpen), |
| | |
| | | 'Content-Type': 'application/json', |
| | | 'Authorization': token |
| | | }, |
| | | url: "../hik/record", |
| | | url: "../cameraSdk/record", |
| | | dataType: "json", |
| | | data: JSON.stringify(optClose), |
| | | type: "post", |
| | |
| | | /*云台公共方法*/ |
| | | 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', |
| | |
| | | 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); |
| | |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| | | SOFTWARE. |
| | | |
| | | internal/core/hls.min.js is Copyright (c) Dailymotion and is protected by |
| | | its own license (Apache License, Version 2.0) available at |
| | | |
| | | https://github.com/video-dev/hls.js/blob/master/LICENSE |
| | |
| | | ############################################### |
| | | # Global settings |
| | | |
| | | # Settings in this section are applied anywhere. |
| | | |
| | | ############################################### |
| | | # General settings |
| | | # Global settings -> General |
| | | |
| | | # Sets the verbosity of the program; available values are "error", "warn", "info", "debug". |
| | | # Verbosity of the program; available values are "error", "warn", "info", "debug". |
| | | logLevel: info |
| | | # Destinations of log messages; available values are "stdout", "file" and "syslog". |
| | | logDestinations: [stdout] |
| | |
| | | # Enable the HTTP API. |
| | | api: yes |
| | | # Address of the API listener. |
| | | apiAddress: 192.168.1.227:9997 |
| | | apiAddress: 112.98.126.2:9997 |
| | | |
| | | # Enable Prometheus-compatible metrics. |
| | | metrics: no |
| | | # Address of the metrics listener. |
| | | metricsAddress: 127.0.0.1:9998 |
| | | metricsAddress: 112.98.126.2:9998 |
| | | |
| | | # Enable pprof-compatible endpoint to monitor performances. |
| | | pprof: no |
| | | # Address of the pprof listener. |
| | | pprofAddress: 127.0.0.1:9999 |
| | | pprofAddress: 112.98.126.2:9999 |
| | | |
| | | # Command to run when a client connects to the server. |
| | | # Prepend ./ to run an executable in the current folder (example: "./ffmpeg") |
| | | # This is terminated with SIGINT when a client disconnects from the server. |
| | | # The following environment variables are available: |
| | | # * RTSP_PORT: RTSP server port |
| | | # * MTX_CONN_TYPE: connection type |
| | | # * MTX_CONN_ID: connection ID |
| | | runOnConnect: |
| | | # Restart the command if it exits. |
| | | runOnConnectRestart: no |
| | | # Command to run when a client disconnects from the server. |
| | | # Environment variables are the same of runOnConnect. |
| | | runOnDisconnect: |
| | | |
| | | ############################################### |
| | | # RTSP settings |
| | | # Global settings -> RTSP |
| | | |
| | | # Allow publishing and reading streams with the RTSP protocol. |
| | | rtsp: yes |
| | |
| | | # Available values are "no", "strict", "optional". |
| | | encryption: "no" |
| | | # Address of the TCP/RTSP listener. This is needed only when encryption is "no" or "optional". |
| | | rtspAddress: :7554 |
| | | rtspAddress: :8554 |
| | | # Address of the TCP/TLS/RTSPS listener. This is needed only when encryption is "strict" or "optional". |
| | | rtspsAddress: :7322 |
| | | rtspsAddress: :8322 |
| | | # Address of the UDP/RTP listener. This is needed only when "udp" is in protocols. |
| | | rtpAddress: :7000 |
| | | rtpAddress: :8000 |
| | | # Address of the UDP/RTCP listener. This is needed only when "udp" is in protocols. |
| | | rtcpAddress: :7001 |
| | | rtcpAddress: :8001 |
| | | # IP range of all UDP-multicast listeners. This is needed only when "multicast" is in protocols. |
| | | multicastIPRange: 224.1.0.0/16 |
| | | # Port of all UDP-multicast/RTP listeners. This is needed only when "multicast" is in protocols. |
| | | multicastRTPPort: 7002 |
| | | multicastRTPPort: 8002 |
| | | # Port of all UDP-multicast/RTCP listeners. This is needed only when "multicast" is in protocols. |
| | | multicastRTCPPort: 7003 |
| | | multicastRTCPPort: 8003 |
| | | # Path to the server key. This is needed only when encryption is "strict" or "optional". |
| | | # This can be generated with: |
| | | # openssl genrsa -out server.key 2048 |
| | |
| | | authMethods: [basic] |
| | | |
| | | ############################################### |
| | | # RTMP settings |
| | | # Global settings -> RTMP |
| | | |
| | | # Allow publishing and reading streams with the RTMP protocol. |
| | | rtmp: yes |
| | |
| | | rtmpServerCert: server.crt |
| | | |
| | | ############################################### |
| | | # HLS settings |
| | | # Global settings -> HLS |
| | | |
| | | # Allow reading streams with the HLS protocol. |
| | | hls: no |
| | |
| | | hlsDirectory: '' |
| | | |
| | | ############################################### |
| | | # WebRTC settings |
| | | # Global settings -> WebRTC |
| | | |
| | | # Allow publishing and reading streams with the WebRTC protocol. |
| | | webrtc: yes |
| | |
| | | # needed when server and clients are on different LANs. |
| | | # TURN/TURNS servers are needed when a direct connection between server and |
| | | # clients is not possible. All traffic is routed through them. |
| | | - url: stun:stun.l.google.com:19302 |
| | | - url: stun:112.98.126.2:3478 |
| | | # if user is "AUTH_SECRET", then authentication is secret based. |
| | | # the secret must be inserted into the password field. |
| | | username: '' |
| | | password: '' |
| | | username: 'admin' |
| | | password: '123456' |
| | | # List of interfaces that will be used to gather IPs to send |
| | | # to the counterpart to establish a connection. |
| | | webrtcICEInterfaces: [] |
| | | # List of public IP addresses that are to be used as a host. |
| | | # This is used typically for servers that are behind 1:1 D-NAT. |
| | | webrtcICEHostNAT1To1IPs: [192.168.1.227] |
| | | webrtcICEHostNAT1To1IPs: [112.98.126.2] |
| | | # Address of a ICE UDP listener in format host:port. |
| | | # If filled, ICE traffic will pass through a single UDP port, |
| | | # allowing the deployment of the server inside a container or behind a NAT. |
| | | webrtcICEUDPMuxAddress: 192.168.1.227:8189 |
| | | webrtcICEUDPMuxAddress: |
| | | # Address of a ICE TCP listener in format host:port. |
| | | # If filled, ICE traffic will pass through a single TCP port, |
| | | # allowing the deployment of the server inside a container or behind a NAT. |
| | | # Using this setting forces usage of the TCP protocol, which is not |
| | | # optimal for WebRTC. |
| | | webrtcICETCPMuxAddress: 192.168.1.227:8189 |
| | | webrtcICETCPMuxAddress: 112.98.126.2:1234 |
| | | |
| | | ############################################### |
| | | # SRT settings |
| | | # Global settings -> SRT |
| | | |
| | | # Allow publishing and reading streams with the SRT protocol. |
| | | srt: yes |
| | |
| | | srtAddress: :8890 |
| | | |
| | | ############################################### |
| | | # Default path settings |
| | | |
| | | # Settings in "pathDefaults" are applied anywhere, |
| | | # unless they are overridden in "paths". |
| | | pathDefaults: |
| | | |
| | | ############################################### |
| | | # Default path settings -> General |
| | | |
| | | # Source of the stream. This can be: |
| | | # * publisher -> the stream is provided by a RTSP, RTMP, WebRTC or SRT client |
| | | # * rtsp://existing-url -> the stream is pulled from another RTSP server / camera |
| | | # * rtsps://existing-url -> the stream is pulled from another RTSP server / camera with RTSPS |
| | | # * rtmp://existing-url -> the stream is pulled from another RTMP server / camera |
| | | # * rtmps://existing-url -> the stream is pulled from another RTMP server / camera with RTMPS |
| | | # * http://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera |
| | | # * https://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera with HTTPS |
| | | # * udp://ip:port -> the stream is pulled with UDP, by listening on the specified IP and port |
| | | # * srt://existing-url -> the stream is pulled from another SRT server / camera |
| | | # * whep://existing-url -> the stream is pulled from another WebRTC server / camera |
| | | # * wheps://existing-url -> the stream is pulled from another WebRTC server / camera with HTTPS |
| | | # * redirect -> the stream is provided by another path or server |
| | | # * rpiCamera -> the stream is provided by a Raspberry Pi Camera |
| | | source: publisher |
| | | # If the source is a URL, and the source certificate is self-signed |
| | | # or invalid, you can provide the fingerprint of the certificate in order to |
| | | # validate it anyway. It can be obtained by running: |
| | | # openssl s_client -connect source_ip:source_port </dev/null 2>/dev/null | sed -n '/BEGIN/,/END/p' > server.crt |
| | | # openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' |
| | | sourceFingerprint: |
| | | # If the source is a URL, it will be pulled only when at least |
| | | # one reader is connected, saving bandwidth. |
| | | sourceOnDemand: no |
| | | # If sourceOnDemand is "yes", readers will be put on hold until the source is |
| | | # ready or until this amount of time has passed. |
| | | sourceOnDemandStartTimeout: 10s |
| | | # If sourceOnDemand is "yes", the source will be closed when there are no |
| | | # readers connected and this amount of time has passed. |
| | | sourceOnDemandCloseAfter: 10s |
| | | # Maximum number of readers. Zero means no limit. |
| | | maxReaders: 0 |
| | | # SRT encryption passphrase require to read from this path |
| | | srtReadPassphrase: |
| | | |
| | | ############################################### |
| | | # Default path settings -> Recording |
| | | |
| | | # Record streams to disk. |
| | | record: no |
| | | # Path of recording segments. |
| | | # Extension is added automatically. |
| | | # Available variables are %path (path name), %Y %m %d %H %M %S %f (time in strftime format) |
| | | recordPath: ./recordings/%path/%Y-%m-%d_%H-%M-%S-%f |
| | | # Format of recorded segments. |
| | | # Available formats are "fmp4" (fragmented MP4) and "mpegts" (MPEG-TS). |
| | | recordFormat: fmp4 |
| | | # fMP4 segments are concatenation of small MP4 files (parts), each with this duration. |
| | | # MPEG-TS segments are concatenation of 188-bytes packets, flushed to disk with this period. |
| | | # When a system failure occurs, the last part gets lost. |
| | | # Therefore, the part duration is equal to the RPO (recovery point objective). |
| | | recordPartDuration: 100ms |
| | | # Minimum duration of each segment. |
| | | recordSegmentDuration: 1h |
| | | # Delete segments after this timespan. |
| | | # Set to 0s to disable automatic deletion. |
| | | recordDeleteAfter: 24h |
| | | |
| | | ############################################### |
| | | # Default path settings -> Authentication |
| | | |
| | | # Username required to publish. |
| | | # SHA256-hashed values can be inserted with the "sha256:" prefix. |
| | | publishUser: |
| | | # Password required to publish. |
| | | # SHA256-hashed values can be inserted with the "sha256:" prefix. |
| | | publishPass: |
| | | # IPs or networks (x.x.x.x/24) allowed to publish. |
| | | publishIPs: [] |
| | | |
| | | # Username required to read. |
| | | # SHA256-hashed values can be inserted with the "sha256:" prefix. |
| | | readUser: |
| | | # password required to read. |
| | | # SHA256-hashed values can be inserted with the "sha256:" prefix. |
| | | readPass: |
| | | # IPs or networks (x.x.x.x/24) allowed to read. |
| | | readIPs: [] |
| | | |
| | | ############################################### |
| | | # Default path settings -> Publisher source (when source is "publisher") |
| | | |
| | | # allow another client to disconnect the current publisher and publish in its place. |
| | | overridePublisher: yes |
| | | # if no one is publishing, redirect readers to this path. |
| | | # It can be can be a relative path (i.e. /otherstream) or an absolute RTSP URL. |
| | | fallback: |
| | | # SRT encryption passphrase required to publish to this path |
| | | srtPublishPassphrase: |
| | | |
| | | ############################################### |
| | | # Default path settings -> RTSP source (when source is a RTSP or a RTSPS URL) |
| | | |
| | | # protocol used to pull the stream. available values are "automatic", "udp", "multicast", "tcp". |
| | | sourceProtocol: automatic |
| | | # support sources that don't provide server ports or use random server ports. This is a security issue |
| | | # and must be used only when interacting with sources that require it. |
| | | sourceAnyPortEnable: no |
| | | # range header to send to the source, in order to start streaming from the specified offset. |
| | | # available values: |
| | | # * clock: Absolute time |
| | | # * npt: Normal Play Time |
| | | # * smpte: SMPTE timestamps relative to the start of the recording |
| | | rtspRangeType: |
| | | # available values: |
| | | # * clock: UTC ISO 8601 combined date and time string, e.g. 20230812T120000Z |
| | | # * npt: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" |
| | | # * smpte: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" |
| | | rtspRangeStart: |
| | | |
| | | ############################################### |
| | | # Default path settings -> Redirect source (when source is "redirect") |
| | | |
| | | # RTSP URL which clients will be redirected to. |
| | | sourceRedirect: |
| | | |
| | | ############################################### |
| | | # Default path settings -> Raspberry Pi Camera source (when source is "rpiCamera") |
| | | |
| | | # ID of the camera |
| | | rpiCameraCamID: 0 |
| | | # width of frames |
| | | rpiCameraWidth: 1920 |
| | | # height of frames |
| | | rpiCameraHeight: 1080 |
| | | # flip horizontally |
| | | rpiCameraHFlip: false |
| | | # flip vertically |
| | | rpiCameraVFlip: false |
| | | # brightness [-1, 1] |
| | | rpiCameraBrightness: 0 |
| | | # contrast [0, 16] |
| | | rpiCameraContrast: 1 |
| | | # saturation [0, 16] |
| | | rpiCameraSaturation: 1 |
| | | # sharpness [0, 16] |
| | | rpiCameraSharpness: 1 |
| | | # exposure mode. |
| | | # values: normal, short, long, custom |
| | | rpiCameraExposure: normal |
| | | # auto-white-balance mode. |
| | | # values: auto, incandescent, tungsten, fluorescent, indoor, daylight, cloudy, custom |
| | | rpiCameraAWB: auto |
| | | # denoise operating mode. |
| | | # values: off, cdn_off, cdn_fast, cdn_hq |
| | | rpiCameraDenoise: "off" |
| | | # fixed shutter speed, in microseconds. |
| | | rpiCameraShutter: 0 |
| | | # metering mode of the AEC/AGC algorithm. |
| | | # values: centre, spot, matrix, custom |
| | | rpiCameraMetering: centre |
| | | # fixed gain |
| | | rpiCameraGain: 0 |
| | | # EV compensation of the image [-10, 10] |
| | | rpiCameraEV: 0 |
| | | # Region of interest, in format x,y,width,height |
| | | rpiCameraROI: |
| | | # whether to enable HDR on Raspberry Camera 3. |
| | | rpiCameraHDR: false |
| | | # tuning file |
| | | rpiCameraTuningFile: |
| | | # sensor mode, in format [width]:[height]:[bit-depth]:[packing] |
| | | # bit-depth and packing are optional. |
| | | rpiCameraMode: |
| | | # frames per second |
| | | rpiCameraFPS: 30 |
| | | # period between IDR frames |
| | | rpiCameraIDRPeriod: 60 |
| | | # bitrate |
| | | rpiCameraBitrate: 1000000 |
| | | # H264 profile |
| | | rpiCameraProfile: main |
| | | # H264 level |
| | | rpiCameraLevel: '4.1' |
| | | # Autofocus mode |
| | | # values: auto, manual, continuous |
| | | rpiCameraAfMode: auto |
| | | # Autofocus range |
| | | # values: normal, macro, full |
| | | rpiCameraAfRange: normal |
| | | # Autofocus speed |
| | | # values: normal, fast |
| | | rpiCameraAfSpeed: normal |
| | | # Lens position (for manual autofocus only), will be set to focus to a specific distance |
| | | # calculated by the following formula: d = 1 / value |
| | | # Examples: 0 moves the lens to infinity. |
| | | # 0.5 moves the lens to focus on objects 2m away. |
| | | # 2 moves the lens to focus on objects 50cm away. |
| | | rpiCameraLensPosition: 0.0 |
| | | # Specifies the autofocus window, in the form x,y,width,height where the coordinates |
| | | # are given as a proportion of the entire image. |
| | | rpiCameraAfWindow: |
| | | # enables printing text on each frame. |
| | | rpiCameraTextOverlayEnable: false |
| | | # text that is printed on each frame. |
| | | # format is the one of the strftime() function. |
| | | rpiCameraTextOverlay: '%Y-%m-%d %H:%M:%S - MediaMTX' |
| | | |
| | | ############################################### |
| | | # Default path settings -> Hooks |
| | | |
| | | # Command to run when this path is initialized. |
| | | # This can be used to publish a stream when the server is launched. |
| | | # This is terminated with SIGINT when the program closes. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | runOnInit: |
| | | # Restart the command if it exits. |
| | | runOnInitRestart: no |
| | | |
| | | # Command to run when this path is requested by a reader. |
| | | # This can be used to publish a stream on demand. |
| | | # This is terminated with SIGINT when the path is not requested anymore. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | runOnDemand: |
| | | # Restart the command if it exits. |
| | | runOnDemandRestart: no |
| | | # Readers will be put on hold until the runOnDemand command starts publishing |
| | | # or until this amount of time has passed. |
| | | runOnDemandStartTimeout: 10s |
| | | # The command will be closed when there are no |
| | | # readers connected and this amount of time has passed. |
| | | runOnDemandCloseAfter: 10s |
| | | |
| | | # Command to run when the stream is ready to be read, whenever it is |
| | | # published by a client or pulled from a server / camera. |
| | | # This is terminated with SIGINT when the stream is not ready anymore. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | # * MTX_SOURCE_TYPE: source type |
| | | # * MTX_SOURCE_ID: source ID |
| | | runOnReady: |
| | | # Restart the command if it exits. |
| | | runOnReadyRestart: no |
| | | # Command to run when the stream is not available anymore. |
| | | # Environment variables are the same of runOnReady. |
| | | runOnNotReady: |
| | | |
| | | # Command to run when a client starts reading. |
| | | # This is terminated with SIGINT when a client stops reading. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | # * MTX_READER_TYPE: reader type |
| | | # * MTX_READER_ID: reader ID |
| | | runOnRead: |
| | | # Restart the command if it exits. |
| | | runOnReadRestart: no |
| | | # Command to run when a client stops reading. |
| | | # Environment variables are the same of runOnRead. |
| | | runOnUnread: |
| | | |
| | | # Command to run when a recording segment is created. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | # * MTX_SEGMENT_PATH: segment file path |
| | | runOnRecordSegmentCreate: |
| | | |
| | | # Command to run when a recording segment is complete. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | # * MTX_SEGMENT_PATH: segment file path |
| | | runOnRecordSegmentComplete: |
| | | |
| | | ############################################### |
| | | # Path settings |
| | | |
| | | # These settings are path-dependent, and the map key is the name of the path. |
| | | # Settings in "paths" are applied to specific paths, and the map key |
| | | # is the name of the path. |
| | | # Any setting in "pathDefaults" can be overridden here. |
| | | # It's possible to use regular expressions by using a tilde as prefix, |
| | | # for example "~^(test1|test2)$" will match both "test1" and "test2", |
| | | # for example "~^prefix" will match all paths that start with "prefix". |
| | | # Settings under the path "all" are applied to all paths that do not match |
| | | # another entry. |
| | | paths: |
| | | all: |
| | | ############################################### |
| | | # General path settings |
| | | # example: |
| | | # my_camera: |
| | | # source: rtsp://my_camera |
| | | |
| | | # Source of the stream. This can be: |
| | | # * publisher -> the stream is provided by a RTSP, RTMP, WebRTC or SRT client |
| | | # * rtsp://existing-url -> the stream is pulled from another RTSP server / camera |
| | | # * rtsps://existing-url -> the stream is pulled from another RTSP server / camera with RTSPS |
| | | # * rtmp://existing-url -> the stream is pulled from another RTMP server / camera |
| | | # * rtmps://existing-url -> the stream is pulled from another RTMP server / camera with RTMPS |
| | | # * http://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera |
| | | # * https://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera with HTTPS |
| | | # * udp://ip:port -> the stream is pulled with UDP, by listening on the specified IP and port |
| | | # * srt://existing-url -> the stream is pulled from another SRT server / camera |
| | | # * whep://existing-url -> the stream is pulled from another WebRTC server / camera |
| | | # * wheps://existing-url -> the stream is pulled from another WebRTC server / camera with HTTPS |
| | | # * redirect -> the stream is provided by another path or server |
| | | # * rpiCamera -> the stream is provided by a Raspberry Pi Camera |
| | | source: publisher |
| | | # If the source is a URL, and the source certificate is self-signed |
| | | # or invalid, you can provide the fingerprint of the certificate in order to |
| | | # validate it anyway. It can be obtained by running: |
| | | # openssl s_client -connect source_ip:source_port </dev/null 2>/dev/null | sed -n '/BEGIN/,/END/p' > server.crt |
| | | # openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' |
| | | sourceFingerprint: |
| | | # If the source is a URL, it will be pulled only when at least |
| | | # one reader is connected, saving bandwidth. |
| | | sourceOnDemand: no |
| | | # If sourceOnDemand is "yes", readers will be put on hold until the source is |
| | | # ready or until this amount of time has passed. |
| | | sourceOnDemandStartTimeout: 10s |
| | | # If sourceOnDemand is "yes", the source will be closed when there are no |
| | | # readers connected and this amount of time has passed. |
| | | sourceOnDemandCloseAfter: 10s |
| | | # Maximum number of readers. Zero means no limit. |
| | | maxReaders: 0 |
| | | |
| | | ############################################### |
| | | # Authentication path settings |
| | | |
| | | # Username required to publish. |
| | | # SHA256-hashed values can be inserted with the "sha256:" prefix. |
| | | publishUser: |
| | | # Password required to publish. |
| | | # SHA256-hashed values can be inserted with the "sha256:" prefix. |
| | | publishPass: |
| | | # IPs or networks (x.x.x.x/24) allowed to publish. |
| | | publishIPs: [] |
| | | |
| | | # Username required to read. |
| | | # SHA256-hashed values can be inserted with the "sha256:" prefix. |
| | | readUser: |
| | | # password required to read. |
| | | # SHA256-hashed values can be inserted with the "sha256:" prefix. |
| | | readPass: |
| | | # IPs or networks (x.x.x.x/24) allowed to read. |
| | | readIPs: [] |
| | | |
| | | ############################################### |
| | | # Publisher path settings (when source is "publisher") |
| | | |
| | | # allow another client to disconnect the current publisher and publish in its place. |
| | | overridePublisher: yes |
| | | # if no one is publishing, redirect readers to this path. |
| | | # It can be can be a relative path (i.e. /otherstream) or an absolute RTSP URL. |
| | | fallback: |
| | | |
| | | ############################################### |
| | | # RTSP path settings (when source is a RTSP or a RTSPS URL) |
| | | |
| | | # protocol used to pull the stream. available values are "automatic", "udp", "multicast", "tcp". |
| | | sourceProtocol: automatic |
| | | # support sources that don't provide server ports or use random server ports. This is a security issue |
| | | # and must be used only when interacting with sources that require it. |
| | | sourceAnyPortEnable: no |
| | | # range header to send to the source, in order to start streaming from the specified offset. |
| | | # available values: |
| | | # * clock: Absolute time |
| | | # * npt: Normal Play Time |
| | | # * smpte: SMPTE timestamps relative to the start of the recording |
| | | rtspRangeType: |
| | | # available values: |
| | | # * clock: UTC ISO 8601 combined date and time string, e.g. 20230812T120000Z |
| | | # * npt: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" |
| | | # * smpte: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" |
| | | rtspRangeStart: |
| | | |
| | | ############################################### |
| | | # Redirect path settings (when source is "redirect") |
| | | |
| | | # RTSP URL which clients will be redirected to. |
| | | sourceRedirect: |
| | | |
| | | ############################################### |
| | | # Raspberry Pi Camera path settings (when source is "rpiCamera") |
| | | |
| | | # ID of the camera |
| | | rpiCameraCamID: 0 |
| | | # width of frames |
| | | rpiCameraWidth: 1920 |
| | | # height of frames |
| | | rpiCameraHeight: 1080 |
| | | # flip horizontally |
| | | rpiCameraHFlip: false |
| | | # flip vertically |
| | | rpiCameraVFlip: false |
| | | # brightness [-1, 1] |
| | | rpiCameraBrightness: 0 |
| | | # contrast [0, 16] |
| | | rpiCameraContrast: 1 |
| | | # saturation [0, 16] |
| | | rpiCameraSaturation: 1 |
| | | # sharpness [0, 16] |
| | | rpiCameraSharpness: 1 |
| | | # exposure mode. |
| | | # values: normal, short, long, custom |
| | | rpiCameraExposure: normal |
| | | # auto-white-balance mode. |
| | | # values: auto, incandescent, tungsten, fluorescent, indoor, daylight, cloudy, custom |
| | | rpiCameraAWB: auto |
| | | # denoise operating mode. |
| | | # values: off, cdn_off, cdn_fast, cdn_hq |
| | | rpiCameraDenoise: "off" |
| | | # fixed shutter speed, in microseconds. |
| | | rpiCameraShutter: 0 |
| | | # metering mode of the AEC/AGC algorithm. |
| | | # values: centre, spot, matrix, custom |
| | | rpiCameraMetering: centre |
| | | # fixed gain |
| | | rpiCameraGain: 0 |
| | | # EV compensation of the image [-10, 10] |
| | | rpiCameraEV: 0 |
| | | # Region of interest, in format x,y,width,height |
| | | rpiCameraROI: |
| | | # whether to enable HDR on Raspberry Camera 3. |
| | | rpiCameraHDR: false |
| | | # tuning file |
| | | rpiCameraTuningFile: |
| | | # sensor mode, in format [width]:[height]:[bit-depth]:[packing] |
| | | # bit-depth and packing are optional. |
| | | rpiCameraMode: |
| | | # frames per second |
| | | rpiCameraFPS: 30 |
| | | # period between IDR frames |
| | | rpiCameraIDRPeriod: 60 |
| | | # bitrate |
| | | rpiCameraBitrate: 1000000 |
| | | # H264 profile |
| | | rpiCameraProfile: main |
| | | # H264 level |
| | | rpiCameraLevel: '4.1' |
| | | # Autofocus mode |
| | | # values: auto, manual, continuous |
| | | rpiCameraAfMode: auto |
| | | # Autofocus range |
| | | # values: normal, macro, full |
| | | rpiCameraAfRange: normal |
| | | # Autofocus speed |
| | | # values: normal, fast |
| | | rpiCameraAfSpeed: normal |
| | | # Lens position (for manual autofocus only), will be set to focus to a specific distance |
| | | # calculated by the following formula: d = 1 / value |
| | | # Examples: 0 moves the lens to infinity. |
| | | # 0.5 moves the lens to focus on objects 2m away. |
| | | # 2 moves the lens to focus on objects 50cm away. |
| | | rpiCameraLensPosition: 0.0 |
| | | # Specifies the autofocus window, in the form x,y,width,height where the coordinates |
| | | # are given as a proportion of the entire image. |
| | | rpiCameraAfWindow: |
| | | # enables printing text on each frame. |
| | | rpiCameraTextOverlayEnable: false |
| | | # text that is printed on each frame. |
| | | # format is the one of the strftime() function. |
| | | rpiCameraTextOverlay: '%Y-%m-%d %H:%M:%S - MediaMTX' |
| | | |
| | | ############################################### |
| | | # External commands path settings |
| | | |
| | | # Command to run when this path is initialized. |
| | | # This can be used to publish a stream and keep it always opened. |
| | | # Prepend ./ to run an executable in the current folder (example: "./ffmpeg") |
| | | # This is terminated with SIGINT when the program closes. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | runOnInit: |
| | | # Restart the command if it exits. |
| | | runOnInitRestart: no |
| | | |
| | | # Command to run when this path is requested. |
| | | # This can be used to publish a stream on demand. |
| | | # Prepend ./ to run an executable in the current folder (example: "./ffmpeg") |
| | | # This is terminated with SIGINT when the path is not requested anymore. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | runOnDemand: |
| | | # Restart the command if it exits. |
| | | runOnDemandRestart: no |
| | | # Readers will be put on hold until the runOnDemand command starts publishing |
| | | # or until this amount of time has passed. |
| | | runOnDemandStartTimeout: 10s |
| | | # The command will be closed when there are no |
| | | # readers connected and this amount of time has passed. |
| | | runOnDemandCloseAfter: 10s |
| | | |
| | | # Command to run when the stream is ready to be read, whether it is |
| | | # published by a client or pulled from a server / camera. |
| | | # Prepend ./ to run an executable in the current folder (example: "./ffmpeg") |
| | | # This is terminated with SIGINT when the stream is not ready anymore. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | runOnReady: |
| | | # Restart the command if it exits. |
| | | runOnReadyRestart: no |
| | | |
| | | # Command to run when a clients starts reading. |
| | | # Prepend ./ to run an executable in the current folder (example: "./ffmpeg") |
| | | # This is terminated with SIGINT when a client stops reading. |
| | | # The following environment variables are available: |
| | | # * MTX_PATH: path name |
| | | # * RTSP_PORT: RTSP server port |
| | | # * G1, G2, ...: regular expression groups, if path name is |
| | | # a regular expression. |
| | | runOnRead: |
| | | # Restart the command if it exits. |
| | | runOnReadRestart: no |
| | | # Settings under path "all_others" are applied to all paths that |
| | | # do not match another entry. |
| | | all_others: |
| | |
| | | <pattern>${log.pattern}</pattern> |
| | | </encoder> |
| | | </appender> |
| | | <!--dhSdk日志输出--> |
| | | <appender name="sdk" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
| | | <file>${log.path}/sdk.log</file> |
| | | <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
| | | <!--按天回滚daily--> |
| | | <fileNamePattern>${log.path}/sdk.%d{yyyy-MM-dd}.log</fileNamePattern> |
| | | <!--日志最大的历史60天--> |
| | | <maxHistory>60</maxHistory> |
| | | </rollingPolicy> |
| | | <encoder> |
| | | <pattern>${log.pattern}</pattern> |
| | | </encoder> |
| | | </appender> |
| | | <!--minio日志输出--> |
| | | <appender name="minio" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
| | | <file>${log.path}/minio.log</file> |
| | |
| | | <logger name="dhSdk" level="INFO"> |
| | | <appender-ref ref="dhSdk"/> |
| | | </logger> |
| | | <!--sdk日志--> |
| | | <logger name="sdk" level="INFO"> |
| | | <appender-ref ref="sdk"/> |
| | | </logger> |
| | | <!--mqtt日志--> |
| | | <logger name="mqtt" level="INFO"> |
| | | <appender-ref ref="mqtt"/> |
| | |
| | | */ |
| | | @Aspect |
| | | @Component |
| | | @Slf4j(topic = "hikSdk") |
| | | @Slf4j(topic = "sdk") |
| | | public class SdkOperateAspect { |
| | | |
| | | @Resource |
| | |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.device.camera.domain.ArdCameras; |
| | | import com.ruoyi.device.camera.domain.CameraCmd; |
| | | import com.ruoyi.device.camera.service.ICameraSdkService; |
| | | import com.ruoyi.device.hiksdk.common.GlobalVariable; |
| | | import com.ruoyi.device.hiksdk.service.IHikClientService; |
| | | import com.ruoyi.utils.websocket.util.WebSocketUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS; |
| | | |
| | |
| | | @Slf4j |
| | | public class PushTask { |
| | | |
| | | @Resource |
| | | RedisCache redisCache; |
| | | @Resource |
| | | ICameraSdkService cameraSdkService; |
| | | @Resource |
| | | IGlobalAlarmService globalAlarmService; |
| | | /** |
| | | * @描述 定时推送所有报警的点位数量 |
| | | * @参数 [] |
| | |
| | | */ |
| | | public void globalAlarmCountPush() { |
| | | try { |
| | | IGlobalAlarmService globalAlarmService = SpringUtils.getBean(IGlobalAlarmService.class); |
| | | Map<String, Object> stringIntegerMap = globalAlarmService.selectAlarmLogsCount(); |
| | | if (ONLINE_USER_SESSIONS.size() > 0) { |
| | | WebSocketUtils.sendMessageAll(stringIntegerMap); |
| | |
| | | */ |
| | | public void ptzPush() { |
| | | try { |
| | | RedisCache redisCache = SpringUtils.getBean(RedisCache.class); |
| | | IHikClientService hikClientService = SpringUtils.getBean(IHikClientService.class); |
| | | List<Map<String, Object>> list = new ArrayList<>(); |
| | | List<Object> Objects = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY); |
| | | if (Objects.size() > 0) { |
| | |
| | | { |
| | | continue; |
| | | } |
| | | //推送大光电 |
| | | if(!"1".equals(camera.getGdtype())) |
| | | { |
| | | continue; |
| | |
| | | cmd.setChanNo(1); |
| | | cmd.setOperator(camera.getOperatorId()); |
| | | //推送在线的相机 |
| | | boolean onLine = hikClientService.isOnLine(cmd); |
| | | boolean onLine = cameraSdkService.isOnLine(cmd); |
| | | if(!onLine) |
| | | { |
| | | continue; |
| | | } |
| | | Map<String, Object> ptz = hikClientService.getGisInfo(cmd); |
| | | Map<String, Object> ptz = cameraSdkService.getGisInfo(cmd); |
| | | if (StringUtils.isNull(ptz)) { |
| | | continue; |
| | | } |
| | |
| | | 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; |
| | |
| | | @Resource |
| | | IArdCamerasService iArdCamerasService; |
| | | @Resource |
| | | IHikClientService iHikClientService; |
| | | IHikClientService hikClientService; |
| | | @Resource |
| | | IDhClientService dhClientService; |
| | | @Resource |
| | | IVtduService vtduService; |
| | | @Resource |
| | |
| | | */ |
| | | 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"); |
| | |
| | | } |
| | | iArdCamerasService.updateArdCameras(camera); |
| | | } |
| | | |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error("同步相机在线状态异常:" + ex.getMessage()); |
| | |
| | | * 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()); |
| | | } |
| | | } |