src/main/java/com/genersoft/iot/vmp/media/bean/RecordInfo.java
@@ -10,6 +10,7 @@ private String url; private long startTime; private double timeLen; private String params; public static RecordInfo getInstance(OnRecordMp4HookParam hookParam) { RecordInfo recordInfo = new RecordInfo(); @@ -79,6 +80,14 @@ this.timeLen = timeLen; } public String getParams() { return params; } public void setParams(String params) { this.params = params; } @Override public String toString() { return "RecordInfo{" + @@ -87,6 +96,7 @@ ", 文件大小=" + fileSize + ", 开始时间=" + startTime + ", 时长=" + timeLen + ", params=" + params + '}'; } } src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -24,12 +24,7 @@ import com.genersoft.iot.vmp.service.redisMsg.IRedisRpcService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.utils.MediaServerUtils; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.OtherPsSendInfo; import com.genersoft.iot.vmp.vmanager.bean.OtherRtpSendInfo; import com.genersoft.iot.vmp.vmanager.bean.StreamContent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -41,11 +36,6 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import javax.sip.InvalidArgumentException; import javax.sip.SipException; import java.text.ParseException; import java.util.List; import java.util.Map; /** @@ -159,7 +149,7 @@ @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8") public HookResult onPlay(@RequestBody OnPlayHookParam param) { Map<String, String> paramMap = urlParamToMap(param.getParams()); Map<String, String> paramMap = MediaServerUtils.urlParamToMap(param.getParams()); // 对于播放流进行鉴权 boolean authenticateResult = mediaService.authenticatePlay(param.getApp(), param.getStream(), paramMap.get("callId")); if (!authenticateResult) { @@ -215,7 +205,7 @@ if (!ObjectUtils.isEmpty(mediaServer.getTranscodeSuffix()) && !"null".equalsIgnoreCase(mediaServer.getTranscodeSuffix()) && param.getStream().endsWith(mediaServer.getTranscodeSuffix()) ) { return; return HookResult.SUCCESS(); } if (param.getSchema().equalsIgnoreCase("rtsp")) { if (param.isRegist()) { @@ -242,7 +232,7 @@ logger.info("[ZLM HOOK]流无人观看:{}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); MediaServerItem mediaInfo = mediaServerService.getOne(param.getMediaServerId()); MediaServer mediaInfo = mediaServerService.getOne(param.getMediaServerId()); if (mediaInfo == null) { JSONObject ret = new JSONObject(); ret.put("code", 0); src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java
@@ -20,11 +20,6 @@ PageInfo<CloudRecordItem> getList(int page, int count, String query, String app, String stream, String startTime, String endTime, List<MediaServer> mediaServerItems, String callId); /** * 根据hook消息增加一条记录 */ void addRecord(OnRecordMp4HookParam param); /** * 获取所有的日期 */ List<String> getDateList(String app, String stream, int year, int month, List<MediaServer> mediaServerItems); @@ -56,5 +51,5 @@ */ DownloadFileInfo getPlayUrlPath(Integer recordId); List<CloudRecordItem> getAllList(String query, String app, String stream, String startTime, String endTime, List<MediaServerItem> mediaServerItems, String callId, List<Integer> ids); List<CloudRecordItem> getAllList(String query, String app, String stream, String startTime, String endTime, List<MediaServer> mediaServerItems, String callId, List<Integer> ids); } src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java
@@ -1,7 +1,6 @@ package com.genersoft.iot.vmp.service.bean; import com.genersoft.iot.vmp.media.event.media.MediaRecordMp4Event; import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam; import com.genersoft.iot.vmp.utils.MediaServerUtils; import java.util.Map; @@ -92,7 +91,7 @@ cloudRecordItem.setMediaServerId(param.getMediaServer().getId()); cloudRecordItem.setTimeLen((long) param.getRecordInfo().getTimeLen() * 1000); cloudRecordItem.setEndTime((param.getRecordInfo().getStartTime() + (long)param.getRecordInfo().getTimeLen()) * 1000); Map<String, String> paramsMap = MediaServerUtils.urlParamToMap(param.getParams()); Map<String, String> paramsMap = MediaServerUtils.urlParamToMap(param.getRecordInfo().getParams()); if (paramsMap.get("callId") != null) { cloudRecordItem.setCallId(paramsMap.get("callId")); } src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java
@@ -5,14 +5,12 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.media.event.media.MediaRecordMp4Event; import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils; import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam; import com.genersoft.iot.vmp.service.ICloudRecordService; import com.genersoft.iot.vmp.media.event.media.MediaRecordMp4Event; import com.genersoft.iot.vmp.media.service.IMediaServerService; import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils; import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; import com.genersoft.iot.vmp.service.ICloudRecordService; import com.genersoft.iot.vmp.service.bean.CloudRecordItem; import com.genersoft.iot.vmp.service.bean.DownloadFileInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -41,6 +39,7 @@ @DS("share") public class CloudRecordServiceImpl implements ICloudRecordService { private final static Logger logger = LoggerFactory.getLogger(CloudRecordServiceImpl.class); @Autowired @@ -59,7 +58,7 @@ private VideoStreamSessionManager streamSession; @Override public PageInfo<CloudRecordItem> getList(int page, int count, String query, String app, String stream, String startTime, String endTime, List<MediaServerItem> mediaServerItems, String callId) { public PageInfo<CloudRecordItem> getList(int page, int count, String query, String app, String stream, String startTime, String endTime, List<MediaServer> mediaServerItems, String callId) { // 开始时间和结束时间在数据库中都是以秒为单位的 Long startTimeStamp = null; Long endTimeStamp = null; @@ -111,7 +110,13 @@ @EventListener public void onApplicationEvent(MediaRecordMp4Event event) { CloudRecordItem cloudRecordItem = CloudRecordItem.getInstance(event); logger.info("[添加录像记录] {}/{} 内容:{}", event.getApp(), event.getStream(), event.getRecordInfo()); if (ObjectUtils.isEmpty(cloudRecordItem.getCallId())) { StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(event.getApp(), event.getStream()); if (streamAuthorityInfo != null) { cloudRecordItem.setCallId(streamAuthorityInfo.getCallId()); } } logger.info("[添加录像记录] {}/{}, callId: {}, 内容:{}", event.getApp(), event.getStream(), cloudRecordItem.getCallId(), event.getRecordInfo()); cloudRecordServiceMapper.add(cloudRecordItem); } @@ -239,7 +244,7 @@ } @Override public List<CloudRecordItem> getAllList(String query, String app, String stream, String startTime, String endTime, List<MediaServerItem> mediaServerItems, String callId, List<Integer> ids) { public List<CloudRecordItem> getAllList(String query, String app, String stream, String startTime, String endTime, List<MediaServer> mediaServerItems, String callId, List<Integer> ids) { // 开始时间和结束时间在数据库中都是以秒为单位的 Long startTimeStamp = null; Long endTimeStamp = null; src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -12,12 +12,6 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.bean.ResultForOnPublish; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.service.*; src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java
@@ -75,22 +75,22 @@ if (ObjectUtils.isEmpty(month)) { month = calendar.get(Calendar.MONTH) + 1; } List<MediaServer> mediaServerItems; List<MediaServer> mediaServers; if (!ObjectUtils.isEmpty(mediaServerId)) { mediaServerItems = new ArrayList<>(); MediaServer mediaServerItem = mediaServerService.getOne(mediaServerId); if (mediaServerItem == null) { mediaServers = new ArrayList<>(); MediaServer mediaServer = mediaServerService.getOne(mediaServerId); if (mediaServer == null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体: " + mediaServerId); } mediaServerItems.add(mediaServerItem); mediaServers.add(mediaServer); } else { mediaServerItems = mediaServerService.getAllOnlineList(); mediaServers = mediaServerService.getAllOnlineList(); } if (mediaServerItems.isEmpty()) { if (mediaServers.isEmpty()) { return new ArrayList<>(); } return cloudRecordService.getDateList(app, stream, year, month, mediaServerItems); return cloudRecordService.getDateList(app, stream, year, month, mediaServers); } @ResponseBody @@ -120,18 +120,18 @@ logger.info("[云端录像] 查询 app->{}, stream->{}, mediaServerId->{}, page->{}, count->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, page, count, startTime, endTime, callId); List<MediaServer> mediaServerItems; List<MediaServer> mediaServers; if (!ObjectUtils.isEmpty(mediaServerId)) { mediaServerItems = new ArrayList<>(); MediaServer mediaServerItem = mediaServerService.getOne(mediaServerId); if (mediaServerItem == null) { mediaServers = new ArrayList<>(); MediaServer mediaServer = mediaServerService.getOne(mediaServerId); if (mediaServer == null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体: " + mediaServerId); } mediaServerItems.add(mediaServerItem); mediaServers.add(mediaServer); } else { mediaServerItems = mediaServerService.getAllOnlineList(); mediaServers = mediaServerService.getAllOnlineList(); } if (mediaServerItems.isEmpty()) { if (mediaServers.isEmpty()) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "当前无流媒体"); } if (query != null && ObjectUtils.isEmpty(query.trim())) { @@ -152,7 +152,7 @@ if (callId != null && ObjectUtils.isEmpty(callId.trim())) { callId = null; } return cloudRecordService.getList(page, count, query, app, stream, startTime, endTime, mediaServerItems, callId); return cloudRecordService.getList(page, count, query, app, stream, startTime, endTime, mediaServers, callId); } @ResponseBody @@ -175,20 +175,20 @@ @RequestParam(required = false) String callId, @RequestParam(required = false) String remoteHost ){ MediaServer mediaServerItem; MediaServer mediaServer; if (mediaServerId == null) { mediaServerItem = mediaServerService.getDefaultMediaServer(); mediaServer = mediaServerService.getDefaultMediaServer(); }else { mediaServerItem = mediaServerService.getOne(mediaServerId); mediaServer = mediaServerService.getOne(mediaServerId); } if (mediaServerItem == null) { if (mediaServer == null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的流媒体"); }else { if (remoteHost == null) { remoteHost = request.getScheme() + "://" + mediaServerItem.getIp() + ":" + mediaServerItem.getRecordAssistPort(); remoteHost = request.getScheme() + "://" + mediaServer.getIp() + ":" + mediaServer.getRecordAssistPort(); } } return cloudRecordService.addTask(app, stream, mediaServerItem, startTime, endTime, callId, remoteHost, mediaServerId != null); return cloudRecordService.addTask(app, stream, mediaServer, startTime, endTime, callId, remoteHost, mediaServerId != null); } @ResponseBody @@ -309,18 +309,18 @@ logger.info("[下载指定录像文件的压缩包] 查询 app->{}, stream->{}, mediaServerId->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, startTime, endTime, callId); List<MediaServerItem> mediaServerItems; List<MediaServer> mediaServers; if (!ObjectUtils.isEmpty(mediaServerId)) { mediaServerItems = new ArrayList<>(); MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); if (mediaServerItem == null) { mediaServers = new ArrayList<>(); MediaServer mediaServer = mediaServerService.getOne(mediaServerId); if (mediaServer == null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体: " + mediaServerId); } mediaServerItems.add(mediaServerItem); mediaServers.add(mediaServer); } else { mediaServerItems = mediaServerService.getAll(); mediaServers = mediaServerService.getAll(); } if (mediaServerItems.isEmpty()) { if (mediaServers.isEmpty()) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "当前无流媒体"); } if (query != null && ObjectUtils.isEmpty(query.trim())) { @@ -344,7 +344,7 @@ if (stream != null && callId != null) { response.addHeader( "Content-Disposition", "attachment;filename=" + stream + "_" + callId + ".zip" ); } List<CloudRecordItem> cloudRecordItemList = cloudRecordService.getAllList(query, app, stream, startTime, endTime, mediaServerItems, callId, ids); List<CloudRecordItem> cloudRecordItemList = cloudRecordService.getAllList(query, app, stream, startTime, endTime, mediaServers, callId, ids); if (ObjectUtils.isEmpty(cloudRecordItemList)) { return; } @@ -412,18 +412,18 @@ logger.info("[云端录像] 查询URL app->{}, stream->{}, mediaServerId->{}, page->{}, count->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, page, count, startTime, endTime, callId); List<MediaServerItem> mediaServerItems; List<MediaServer> mediaServers; if (!ObjectUtils.isEmpty(mediaServerId)) { mediaServerItems = new ArrayList<>(); MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); if (mediaServerItem == null) { mediaServers = new ArrayList<>(); MediaServer mediaServer = mediaServerService.getOne(mediaServerId); if (mediaServer == null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体: " + mediaServerId); } mediaServerItems.add(mediaServerItem); mediaServers.add(mediaServer); } else { mediaServerItems = mediaServerService.getAll(); mediaServers = mediaServerService.getAll(); } if (mediaServerItems.isEmpty()) { if (mediaServers.isEmpty()) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "当前无流媒体"); } if (query != null && ObjectUtils.isEmpty(query.trim())) { @@ -444,15 +444,15 @@ if (callId != null && ObjectUtils.isEmpty(callId.trim())) { callId = null; } MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer(); if (mediaServerItem == null) { MediaServer mediaServer = mediaServerService.getDefaultMediaServer(); if (mediaServer == null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体节点"); } if (remoteHost == null) { remoteHost = request.getScheme() + "://" + request.getLocalAddr() + ":" + (request.getScheme().equals("https")? mediaServerItem.getHttpSSlPort() : mediaServerItem.getHttpPort()); (request.getScheme().equals("https")? mediaServer.getHttpSSlPort() : mediaServer.getHttpPort()); } PageInfo<CloudRecordItem> cloudRecordItemPageInfo = cloudRecordService.getList(page, count, query, app, stream, startTime, endTime, mediaServerItems, callId); PageInfo<CloudRecordItem> cloudRecordItemPageInfo = cloudRecordService.getList(page, count, query, app, stream, startTime, endTime, mediaServers, callId); PageInfo<CloudRecordUrl> cloudRecordUrlPageInfo = new PageInfo<>(); if (!ObjectUtils.isEmpty(cloudRecordItemPageInfo)) { cloudRecordUrlPageInfo.setPageNum(cloudRecordItemPageInfo.getPageNum());