zhangqiankun vor 2 Jahren
Ursprung
Commit
130a2bb360

+ 4 - 9
src/main/java/com/persagy/cameractl/cvr/PlayBackController.java

@@ -11,7 +11,6 @@ import java.util.Timer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -46,8 +45,8 @@ public class PlayBackController {
 	@Autowired
 	private CVRConfig cvrConfig;
 	
-	@RequestMapping(value = "/playback/{operType}", method = RequestMethod.POST)
-	public Object play(@RequestBody Camera camera, @PathVariable("operType") String operType) throws Exception {
+	@RequestMapping(value = "/playback/stream", method = RequestMethod.POST)
+	public Object play(@RequestBody Camera camera) throws Exception {
 		// 验证是否需要走配置
 		if (StrUtil.isBlank(camera.streamId)) {
 			CameraStream stream = StreamInfoInit.CAMERA_2_STREAM.get(camera.cameraIndexCode);
@@ -80,17 +79,13 @@ public class PlayBackController {
         m_strDeviceInfo.read();
         
         //按时间回放和下载
-        String result = null;
         String targetFile = OtherTools.getVideoFilePath();
 		File file = new File(targetFile);
 		if (!file.exists()) {
 			file.createNewFile();
 		}
-		if ("stream".equals(operType)) {
-			result = this.playBackBytime(file, camera.startDateStr, camera.endDateStr, lUserID, camera.streamId);
-		} else {
-			return ResultTools.errorResult("非法请求");
-		}
+		
+		String result = this.playBackBytime(file, camera.startDateStr, camera.endDateStr, lUserID, camera.streamId);
         
         //退出程序时调用,每一台设备分别注销
         if (SystemInit.hCNetSDK.NET_DVR_Logout(lUserID)) {

+ 64 - 100
src/main/java/com/persagy/cameractl/cvr/PlayBackEventController.java

@@ -8,7 +8,6 @@ import java.util.Timer;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -16,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import com.persagy.cameractl.cvr.HCNetSDK.NET_DVR_USER_LOGIN_INFO;
 import com.persagy.cameractl.cvr.HCNetSDK.NET_DVR_VOD_PARA;
+import com.persagy.cameractl.init.SystemInit;
 import com.persagy.cameractl.utils.Camera;
 import com.persagy.cameractl.utils.OtherTools;
 import com.persagy.cameractl.utils.ResultClass;
@@ -35,18 +35,15 @@ import cn.hutool.core.date.DateUtil;
 public class PlayBackEventController {
 	public static Logger logger = LoggerFactory.getLogger(PlayBackEventController.class);
 
-	public static String test_stream_id = "18083116593134708100";
-	
-	public static volatile HCNetSDK hCNetSDK;
-	private volatile boolean isInit = false;
+	//public static String test_stream_id = "18083116593134708100";
 
 	@RequestMapping(value = "/playback/event", method = RequestMethod.POST)
-	public ResultClass play(@RequestBody Camera camera, @PathVariable("operType") String operType) throws Exception {
+	public ResultClass play(@RequestBody Camera camera) throws Exception {
 		ResultClass returnResult = new ResultClass();
 		returnResult.name = false;
 		
 		// SDK初始化
-		boolean init = this.init();
+		boolean init = SystemInit.init();
 		if (!init) {
 			returnResult.reason = "SDK初始化失败";
 			return returnResult;
@@ -54,11 +51,11 @@ public class PlayBackEventController {
         
         //登录设备,每一台设备分别登录; 登录句柄是唯一的,可以区分设备
         HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
-        NET_DVR_USER_LOGIN_INFO m_strLoginInfo = this.getLoginObject(camera.userName, camera.password, camera.cameraIp, (short)camera.cameraPort);
+        NET_DVR_USER_LOGIN_INFO m_strLoginInfo = SystemInit.getLoginObject(camera.userName, camera.password, camera.cameraIp, (short)camera.cameraPort);
 
-        int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
+        int lUserID = SystemInit.hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
         if (lUserID == -1) {
-        	int errCode = hCNetSDK.NET_DVR_GetLastError();
+        	int errCode = SystemInit.hCNetSDK.NET_DVR_GetLastError();
         	returnResult.reason = "设备注册失败,失败码:" + errCode;
 			return returnResult;
         }
@@ -66,25 +63,11 @@ public class PlayBackEventController {
         logger.info(camera.cameraIp + ": login success! " + "device serial number: " + new String(m_strDeviceInfo.struDeviceV30.sSerialNumber).trim());
         m_strDeviceInfo.read();
         
-        // nt lChannel = 3;
-        // byStartDChan为IP通道起始通道号, 预览回放NVR的IP通道时需要根据起始通道号进行取值
-        // int lDChannel = (int) m_strDeviceInfo.struDeviceV30.byStartDChan + lChannel -1;
-        int lDChannel = camera.channel;
-        logger.info("channle num: " + lDChannel);
-        
         //按时间回放和下载
-        String result = null;
-        /*if ("download".equals(operType)) {
-        	result = this.dowmloadRecordByTime(camera.startDateStr, camera.endDateStr, lUserID, lDChannel);
-		} else if ("stream".equals(operType)) {
-			result = this.playBackBytime(camera.startDateStr, camera.endDateStr, lUserID, lDChannel);
-		} else {
-			returnResult.reason = "非法请求";
-			return returnResult;
-		}*/
+        String result = this.playBackByFileEvent(camera.startDateStr, camera.endDateStr, lUserID, camera.streamId);
         
         //退出程序时调用,每一台设备分别注销
-        if (hCNetSDK.NET_DVR_Logout(lUserID)) {
+        if (SystemInit.hCNetSDK.NET_DVR_Logout(lUserID)) {
             logger.info("logout success");
         }
         
@@ -102,12 +85,16 @@ public class PlayBackEventController {
 	}
 	
 	/**
-	 * 按时间回放获取码流数据
+	 * 事件回放
 	 * 
+	 * @param startParam
+	 * @param endParam
 	 * @param userID
-	 * @throws IOException 
+	 * @param streamId
+	 * @return
+	 * @throws IOException
 	 */
-	public String findFileByEvent(String startParam, String endParam, int userID, int iChannelNo) throws IOException {
+	private String playBackByFileEvent(String startParam, String endParam, int userID, String streamId) throws IOException {
 		// 根据事件查找录像文件 -- 入参组装
 		HCNetSDK.NET_DVR_TIME_SEARCH_COND struStartTime = this.getNET_DVR_TIME_SEARCH_COND_Object(startParam);
 		HCNetSDK.NET_DVR_TIME_SEARCH_COND struEndTime = this.getNET_DVR_TIME_SEARCH_COND_Object(endParam);
@@ -120,33 +107,34 @@ public class PlayBackEventController {
 		search_event_param_v50.byQuickSearch = 1;
 		
 		HCNetSDK.NET_DVR_STREAM_INFO struIDInfo = new HCNetSDK.NET_DVR_STREAM_INFO();
-		struIDInfo.byID = test_stream_id.getBytes();
-		//struIDInfo.dwSize = struIDInfo.size();
+		struIDInfo.byID = streamId.getBytes();
+		struIDInfo.dwSize = struIDInfo.size();
 		
 		search_event_param_v50.uSeniorParam.struStreamIDParam.struIDInfo = struIDInfo;
+		search_event_param_v50.write();
 		
 		// 根据事件查找录像文件
-		int event_V50 = hCNetSDK.NET_DVR_FindFileByEvent_V50(userID, null);
+		int event_V50 = SystemInit.hCNetSDK.NET_DVR_FindFileByEvent_V50(userID, search_event_param_v50);
 		if (event_V50 < 0) {
-			logger.warn("NET_DVR_FindFileByEvent_V50 failure, errorCode: " + hCNetSDK.NET_DVR_GetLastError());
-			return "根据事件查找录像文件失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
+			logger.warn("NET_DVR_FindFileByEvent_V50 failure, errorCode: " + SystemInit.hCNetSDK.NET_DVR_GetLastError());
+			return "根据事件查找录像文件失败,错误码:" + SystemInit.hCNetSDK.NET_DVR_GetLastError();
 		}
 		
 		// 逐个获取查找到的文件信息 -- 入参组装
-		HCNetSDK.NET_DVR_TIME_SEARCH searchStruStartTime = this.getNET_DVR_TIME_SEARCH_Object(startParam);
-		HCNetSDK.NET_DVR_TIME_SEARCH searchStruEndTime = this.getNET_DVR_TIME_SEARCH_Object(endParam);
+		//HCNetSDK.NET_DVR_TIME_SEARCH searchStruStartTime = this.getNET_DVR_TIME_SEARCH_Object(startParam);
+		//HCNetSDK.NET_DVR_TIME_SEARCH searchStruEndTime = this.getNET_DVR_TIME_SEARCH_Object(endParam);
 		
 		HCNetSDK.NET_DVR_SEARCH_EVENT_RET_V50 search_event_ret_v50 = new HCNetSDK.NET_DVR_SEARCH_EVENT_RET_V50();
-		search_event_ret_v50.wMajorType = 100;
-		search_event_ret_v50.wMinorType = 0;
-		search_event_ret_v50.struStartTime = searchStruStartTime;
-		search_event_ret_v50.struEndTime = searchStruEndTime;
+		//search_event_ret_v50.wMajorType = 100;
+		//search_event_ret_v50.wMinorType = 0;
+		//search_event_ret_v50.struStartTime = searchStruStartTime;
+		//search_event_ret_v50.struEndTime = searchStruEndTime;
 		
-		// 逐个获取查找到的文件信息
-		int nextEvent_V50 = hCNetSDK.NET_DVR_FindNextEvent_V50(event_V50, search_event_ret_v50);
+		// 逐个获取查找到的文件信息,由于仅取10分钟内的录像,这里仅调用一次
+		int nextEvent_V50 = SystemInit.hCNetSDK.NET_DVR_FindNextEvent_V50(event_V50, search_event_ret_v50);
 		if (nextEvent_V50 < 0) {
-			logger.warn("NET_DVR_FindNextEvent_V50 failure, errorCode: " + hCNetSDK.NET_DVR_GetLastError());
-			return "根据事件查找录像文件失败,错误码:" + hCNetSDK.NET_DVR_GetLastError();
+			logger.warn("NET_DVR_FindNextEvent_V50 failure, errorCode: " + SystemInit.hCNetSDK.NET_DVR_GetLastError());
+			return "根据事件查找录像文件失败,错误码:" + SystemInit.hCNetSDK.NET_DVR_GetLastError();
 		} else if (nextEvent_V50 == 1002) {
 			try {
 				logger.info("NET_DVR_FindNextEvent_V50 searching ...");
@@ -156,20 +144,38 @@ public class PlayBackEventController {
 			}
 		} else if (nextEvent_V50 == 1004) {
 			logger.info("NET_DVR_FindNextEvent_V50 searching exception");
-			return "查找文件时异常,错误码:" + hCNetSDK.NET_DVR_GetLastError();
+			return "查找文件时异常,错误码:" + SystemInit.hCNetSDK.NET_DVR_GetLastError();
 		}
 		
+		search_event_ret_v50.read();
+		String eventFileName = new String(search_event_ret_v50.uSeniorRet.struStreamIDRet.byFileName);
+		logger.info("eventFileName: {}", eventFileName);
+		
+		logger.info("struStartTime.wYear: {}", search_event_ret_v50.struStartTime.wYear);
+		logger.info("struStartTime.byMonth: {}", search_event_ret_v50.struStartTime.byMonth);
+		logger.info("struStartTime.byDay: {}", search_event_ret_v50.struStartTime.byDay);
+		logger.info("struStartTime.byHour: {}", search_event_ret_v50.struStartTime.byHour);
+		logger.info("struStartTime.byMinute: {}", search_event_ret_v50.struStartTime.byMinute);
+		logger.info("struStartTime.bySecond: {}", search_event_ret_v50.struStartTime.bySecond);
+
+		logger.info("struEndTime.wYear: {}", search_event_ret_v50.struEndTime.wYear);
+		logger.info("struEndTime.byMonth: {}", search_event_ret_v50.struEndTime.byMonth);
+		logger.info("struEndTime.byDay: {}", search_event_ret_v50.struEndTime.byDay);
+		logger.info("struEndTime.byHour: {}", search_event_ret_v50.struEndTime.byHour);
+		logger.info("struEndTime.byMinute: {}", search_event_ret_v50.struEndTime.byMinute);
+		logger.info("struEndTime.bySecond: {}", search_event_ret_v50.struEndTime.bySecond);
+		
 		// 根据时间进行录像回放
-		NET_DVR_VOD_PARA net_dvr_vod_para = getPlayBackHkTime(startParam, endParam, iChannelNo);
-		int iPlayBack = hCNetSDK.NET_DVR_PlayBackByTime_V40(userID, net_dvr_vod_para);
+		NET_DVR_VOD_PARA net_dvr_vod_para = getPlayBackHkTime(startParam, endParam, streamId);
+		int iPlayBack = SystemInit.hCNetSDK.NET_DVR_PlayBackByTime_V40(userID, net_dvr_vod_para);
 		if (iPlayBack <= -1) {
-			logger.warn("playback failure, errorCode: " + hCNetSDK.NET_DVR_GetLastError());
+			logger.warn("playback failure, errorCode: " + SystemInit.hCNetSDK.NET_DVR_GetLastError());
 		}
 		
 		// 开启取流
-		if (!hCNetSDK.NET_DVR_PlayBackControl_V40(iPlayBack, HCNetSDK.NET_DVR_PLAYSTART, null, 0, null, new IntByReference(0))) {
-			logger.warn("NET_DVR_PLAYSTART failure, errorCode: " + hCNetSDK.NET_DVR_GetLastError());
-			return "取流失败,失败码:" + hCNetSDK.NET_DVR_GetLastError();
+		if (!SystemInit.hCNetSDK.NET_DVR_PlayBackControl_V40(iPlayBack, HCNetSDK.NET_DVR_PLAYSTART, null, 0, null, new IntByReference(0))) {
+			logger.warn("NET_DVR_PLAYSTART failure, errorCode: " + SystemInit.hCNetSDK.NET_DVR_GetLastError());
+			return "取流失败,失败码:" + SystemInit.hCNetSDK.NET_DVR_GetLastError();
 		}
 
 		// 保存回调函数的音频数据
@@ -178,11 +184,12 @@ public class PlayBackEventController {
 		if (!file.exists()) {
 			file.createNewFile();
 		}
+		logger.info("filename:{}", file.getName());
 		FileOutputStream outputStream = new FileOutputStream(file);
 		
 		// 设置回放回调函数
 		PlayDataCallBack playBackCallBack = new PlayDataCallBack(outputStream);
-		hCNetSDK.NET_DVR_SetPlayDataCallBack_V40(iPlayBack, playBackCallBack, Pointer.NULL);
+		SystemInit.hCNetSDK.NET_DVR_SetPlayDataCallBack_V40(iPlayBack, playBackCallBack, Pointer.NULL);
 
 		// 开始计时器
 		Timer playbacktimer = new Timer();// 新建定时器
@@ -200,73 +207,30 @@ public class PlayBackEventController {
 
 		// 如果还没有释放回放资源,需要调用NET_DVR_StopPlayBack释放
 		if (iPlayBack > 0) {
-			hCNetSDK.NET_DVR_StopPlayBack(iPlayBack);
+			SystemInit.hCNetSDK.NET_DVR_StopPlayBack(iPlayBack);
 			iPlayBack = -1;
 		}
 
 		playbacktimer.cancel(); // 关闭定时器
 		return "true";
 	}
-
-	/**
-	 * 获取登录对象
-	 * 
-	 * @param m_sUsername
-	 * @param m_sPassword
-	 * @param m_sDeviceIP
-	 * @param wPort
-	 * @return
-	 * @date 2022年6月23日 下午1:21:08
-	 */
-	private HCNetSDK.NET_DVR_USER_LOGIN_INFO getLoginObject(String m_sUsername, String m_sPassword, String m_sDeviceIP, short wPort) {
-		HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
-
-        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
-        System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
-
-        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
-        System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
-
-        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
-        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
-
-        m_strLoginInfo.wPort = wPort; //SDK端口
-        m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
-        m_strLoginInfo.write();
-        
-        return m_strLoginInfo;
-	}
-
-    /**
-     * 初始化SDK
-     * 
-     * @return
-     */
-	private boolean init() {
-		if (!isInit) {
-			// 初始化
-			hCNetSDK = HCNetSDK.INSTANCE;
-			isInit = hCNetSDK.NET_DVR_Init();
-		}
-		return isInit;
-	}
 	
     /**
      * 获取海康录像机格式的时间
      * 
      * @param startParam
      * @param endParam
-     * @param channle
+     * @param streamId
      * @return
      * @date 2022年6月23日 下午1:38:59
      */
-    private HCNetSDK.NET_DVR_VOD_PARA getPlayBackHkTime(String startParam, String endParam, int iChannelNo) {
+    private HCNetSDK.NET_DVR_VOD_PARA getPlayBackHkTime(String startParam, String endParam, String streamId) {
     	Date startTime = DateUtil.parse(startParam);
     	Date endTime = DateUtil.parse(endParam);
     	
         HCNetSDK.NET_DVR_VOD_PARA net_dvr_vod_para = new HCNetSDK.NET_DVR_VOD_PARA();
 		net_dvr_vod_para.dwSize = net_dvr_vod_para.size();
-		net_dvr_vod_para.struIDInfo.byID = test_stream_id.getBytes();
+		net_dvr_vod_para.struIDInfo.byID = streamId.getBytes();
 		net_dvr_vod_para.struBeginTime.dwYear = DateUtil.year(startTime);
 		net_dvr_vod_para.struBeginTime.dwMonth = DateUtil.month(startTime) + 1;
 		net_dvr_vod_para.struBeginTime.dwDay =  DateUtil.dayOfMonth(startTime);
@@ -316,7 +280,7 @@ public class PlayBackEventController {
      * @return
      * @date 2022年6月23日 下午1:38:59
      */
-    private HCNetSDK.NET_DVR_TIME_SEARCH getNET_DVR_TIME_SEARCH_Object(String timeParam) {
+    public HCNetSDK.NET_DVR_TIME_SEARCH getNET_DVR_TIME_SEARCH_Object(String timeParam) {
     	Date time = DateUtil.parse(timeParam);
     	
         HCNetSDK.NET_DVR_TIME_SEARCH net_dvr_time_search = new HCNetSDK.NET_DVR_TIME_SEARCH();