|
|
@@ -0,0 +1,219 @@
|
|
|
+package cn.iocoder.yudao.module.pms.service.yanfan.sip.record;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.redis.RedisCache;
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.redis.RedisKeyBuilder;
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.device.vo.YfSipDeviceRespVO;
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.sip.vo.VideoSessionInfo;
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.RecordApiUtils;
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.SipUtil;
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.yanfan.utils.ZlmApiUtils;
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.media.YfMediaServerDO;
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.yanfan.sip.device.YfSipDeviceDO;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.media.YfMediaServerService;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.play.IPlayService;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.play.model.Stream;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.ISipCmd;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.IZmlHookService;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.MessageInvoker;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.RecordCacheManager;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.device.YfSipDeviceService;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.model.RecordItem;
|
|
|
+import cn.iocoder.yudao.module.pms.service.yanfan.sip.model.RecordList;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class RecordServiceImpl implements IRecordService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MessageInvoker messageInvoker;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisCache redisCache;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RecordCacheManager recordCacheManager;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private YfSipDeviceService sipDeviceService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private YfMediaServerService mediaServerService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IZmlHookService zmlHookService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ZlmApiUtils zlmApiUtils;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RecordApiUtils recordApiUtils;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISipCmd sipCmd;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IPlayService playService;
|
|
|
+
|
|
|
+// @Autowired
|
|
|
+// private IOssDetailService ossDetailService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public RecordList listDevRecord(String deviceId, String channelId, String start, String end) {
|
|
|
+ YfSipDeviceDO dev = sipDeviceService.selectSipDeviceBySipId(deviceId);
|
|
|
+ if (dev != null) {
|
|
|
+ String sn = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
|
|
|
+ String recordkey = channelId + ":" + sn;
|
|
|
+ recordCacheManager.addlock(recordkey);
|
|
|
+ messageInvoker.recordInfoQuery(dev, sn, channelId, SipUtil.timestampToDate(start), SipUtil.timestampToDate(end));
|
|
|
+ String catchkey = RedisKeyBuilder.buildSipRecordinfoCacheKey(recordkey);
|
|
|
+ return (RecordList) messageInvoker.getExecResult(catchkey, SipUtil.DEFAULT_EXEC_TIMEOUT);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<RecordItem> listRecord(String channelId, String sn) {
|
|
|
+ String recordkey = channelId + ":" + sn;
|
|
|
+ String catchkey = RedisKeyBuilder.buildSipRecordinfoCacheKey(recordkey);
|
|
|
+ List<RecordItem> items = redisCache.getCacheList(catchkey);
|
|
|
+ if (items.size() > 1) {
|
|
|
+ items.sort(Comparator.naturalOrder());
|
|
|
+ }
|
|
|
+ return items;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONObject listServerRecord(String recordApi, Integer pageNum, Integer pageSize) {
|
|
|
+ return recordApiUtils.getRecordlist(recordApi, pageNum, pageSize, null).getJSONObject("data");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONArray listServerRecordByDate(String recordApi, Integer year, Integer month, String app, String stream) {
|
|
|
+ return recordApiUtils.getRecordDatelist(recordApi, year, month, app, stream, null).getJSONArray("data");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONObject listServerRecordByStream(String recordApi, Integer pageNum, Integer pageSize, String app) {
|
|
|
+ return recordApiUtils.getRecordStreamlist(recordApi, pageNum, pageSize, app, null).getJSONObject("data");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONObject listServerRecordByApp(String recordApi, Integer pageNum, Integer pageSize) {
|
|
|
+ return recordApiUtils.getRecordApplist(recordApi, pageNum, pageSize, null).getJSONObject("data");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONObject listServerRecordByFile(String recordApi, Integer pageNum, Integer pageSize, String app, String stream, String startTime, String endTime) {
|
|
|
+ return recordApiUtils.getRecordFilelist(recordApi, pageNum, pageSize, app, stream, startTime, endTime, null).getJSONObject("data");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONObject listServerRecordByDevice(Integer pageNum, Integer pageSize, String deviceId, String channelId, String startTime, String endTime) {
|
|
|
+ String playrsid = String.format("%s_%s_%s", SipUtil.PREFIX_PLAYRECORD, deviceId, channelId);
|
|
|
+ YfMediaServerDO mediaServer = mediaServerService.selectMediaServerBydeviceSipId(deviceId);
|
|
|
+ String recordApi = "";
|
|
|
+ if (mediaServer != null && Objects.equals(mediaServer.getProtocol(), "http")) {
|
|
|
+ recordApi = "http://" + mediaServer.getIp() + ":" + mediaServer.getRecordPort();
|
|
|
+ } else if (mediaServer != null && Objects.equals(mediaServer.getProtocol(), "https")) {
|
|
|
+ recordApi = "https://" + mediaServer.getDomain() + ":" + mediaServer.getRecordPort();
|
|
|
+ }
|
|
|
+ JSONObject obj = recordApiUtils.getRecordFilelist(recordApi, pageNum, pageSize, "rtp",
|
|
|
+ playrsid, startTime, endTime, null);
|
|
|
+ if (obj != null) {
|
|
|
+ obj = obj.getJSONObject("data");
|
|
|
+ obj.put("recordApi", recordApi);
|
|
|
+ log.info("obj:{}", obj);
|
|
|
+ }
|
|
|
+ return obj;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean startRecord(String stream) {
|
|
|
+// SysUser user = getLoginUser().getUser();
|
|
|
+ //缓存zlm服务器配置
|
|
|
+ YfMediaServerDO media = mediaServerService.selectMediaServerBytenantId(1L);
|
|
|
+ if (media != null) {
|
|
|
+ return zlmApiUtils.startRecord(media, "1", "live", stream).getBoolean("result");
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean stopRecord(String stream) {
|
|
|
+// SysUser user = getLoginUser().getUser();
|
|
|
+ YfMediaServerDO media = mediaServerService.selectMediaServerBytenantId(1L);
|
|
|
+ if (media != null) {
|
|
|
+ return zlmApiUtils.stopRecord(media, "1", "live", stream).getBoolean("result");
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean isRecording(String stream) {
|
|
|
+// SysUser user = getLoginUser().getUser();
|
|
|
+ YfMediaServerDO media = mediaServerService.selectMediaServerBytenantId(1L);
|
|
|
+ if (media != null) {
|
|
|
+ return zlmApiUtils.isRecording(media, "1", "live", stream).getBoolean("status");
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONObject getMp4RecordFile(String stream, String period) {
|
|
|
+// SysUser user = getLoginUser().getUser();
|
|
|
+ YfMediaServerDO media = mediaServerService.selectMediaServerBytenantId(1L);
|
|
|
+ if (media != null) {
|
|
|
+ return zlmApiUtils.getMp4RecordFile(media, period, "live", stream).getJSONObject("data");
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Stream download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed) {
|
|
|
+ YfSipDeviceDO dev = sipDeviceService.selectSipDeviceBySipId(deviceId);
|
|
|
+ YfSipDeviceRespVO bean = BeanUtil.toBean(dev, YfSipDeviceRespVO.class);
|
|
|
+ VideoSessionInfo info = sipCmd.downloadStreamCmd(bean, channelId, startTime, endTime, downloadSpeed);
|
|
|
+ return zmlHookService.updateStream(info);
|
|
|
+ }
|
|
|
+
|
|
|
+// @Override
|
|
|
+// public JSONObject upload(String recordApi, String file) {
|
|
|
+// JSONObject obj = recordApiUtils.uploadOss(recordApi, file, null).getJSONObject("data");
|
|
|
+// if (obj != null) {
|
|
|
+// JSONObject ossObj = obj.getJSONObject("data");
|
|
|
+// if (ossObj != null) {
|
|
|
+// OssDetail ossDetail = OssDetail.builder()
|
|
|
+// .fileName(ossObj.getString("fileName"))
|
|
|
+// .fileSuffix(ossObj.getString("fileSuffix"))
|
|
|
+// .url(ossObj.getString("url"))
|
|
|
+// .originalName(ossObj.getString("originalName"))
|
|
|
+// .service(ossObj.getString("service"))
|
|
|
+// .build();
|
|
|
+// ossDetailService.insertOssDetail(ossDetail);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return obj;
|
|
|
+// }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Stream playRecord(String deviceId, String channelId) {
|
|
|
+ return playService.play(deviceId, channelId, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JSONObject addStreamProxy(String deviceId, String proxyUrl, Integer count) {
|
|
|
+ YfMediaServerDO mediaServer = mediaServerService.selectMediaServerBydeviceSipId(deviceId);
|
|
|
+ return zlmApiUtils.addStreamProxy(mediaServer, "live", deviceId, proxyUrl, count);
|
|
|
+ }
|
|
|
+}
|