|
@@ -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();
|