From 019827fd35f84465ee503fcc248b12a045da44d2 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 29 十一月 2021 18:09:49 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/wvp-28181-2.0' into wvp-28181-2.0

---
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java                                              |    2 
 .github/ISSUE_TEMPLATE/-------.md                                                                                                  |   10 +++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java                                                    |    7 +-
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java                                                              |   27 +++++++--
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java |    8 +-
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java                                            |    4 +
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java                                                                   |   10 +++
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java                                                        |    3 
 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java                                                              |    1 
 .github/ISSUE_TEMPLATE/--bug---.md                                                                                                 |   29 +++++++++
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java                                              |    4 
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java                                                             |   25 ++++++--
 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java                                                       |   24 ++++++--
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java                                        |    2 
 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java                                                               |    8 ++
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java                                                |    5 +
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/MessageRequestProcessor1.java                              |    9 +-
 src/main/java/com/genersoft/iot/vmp/service/IPlayService.java                                                                      |    2 
 18 files changed, 141 insertions(+), 39 deletions(-)

diff --git a/.github/ISSUE_TEMPLATE/-------.md b/.github/ISSUE_TEMPLATE/-------.md
new file mode 100644
index 0000000..461ce76
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/-------.md
@@ -0,0 +1,10 @@
+---
+name: "[ 鏂板姛鑳� ]"
+about: 鏂板姛鑳�
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+
diff --git a/.github/ISSUE_TEMPLATE/--bug---.md b/.github/ISSUE_TEMPLATE/--bug---.md
new file mode 100644
index 0000000..ff09d5c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/--bug---.md
@@ -0,0 +1,29 @@
+---
+name: "[ BUG ] "
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**鎻忚堪閿欒**
+鎻忚堪涓嬫偍閬囧埌鐨勯棶棰�
+
+**濡備綍澶嶇幇**
+鏈夋槑纭鐜版楠ょ殑闂浼氬緢瀹规槗琚В鍐�
+
+**棰勬湡琛屼负**
+娓呮櫚绠�娲佺殑鎻忚堪鎮ㄦ湡鏈涘彂鐢熺殑浜嬫儏
+
+**鎴浘**
+
+
+**鐜淇℃伅:**
+ - 1. 閮ㄧ讲鏂瑰紡 wvp-pro docker / zlm(docker) + 缂栬瘧wvp-pro/ wvp-prp + zlm閮芥槸缂栬瘧閮ㄧ讲/
+ - 2. 閮ㄧ讲鐜 windows / ubuntu/ centos ...
+ - 3. 绔彛寮�鏀炬儏鍐�
+ - 4. 鏄惁鏄叕缃戦儴缃�
+ - 5. 鏄惁浣跨敤https
+ - 6. 鏂逛究鐨勮瘽鎻愪緵涓嬩娇鐢ㄧ殑璁惧鍝佺墝鎴栧钩鍙�
+ - 7. 浣犲仛杩囧摢浜涘皾璇�
diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
index 8f109e2..b400271 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -27,6 +27,7 @@
 	public static final String PLAYER_PREFIX = "VMP_PLAYER_";
 
 	public static final String PLAY_BLACK_PREFIX = "VMP_PLAYBACK_";
+	public static final String DOWNLOAD_PREFIX = "VMP_DOWNLOAD_";
 
 	public static final String PLATFORM_KEEPLIVEKEY_PREFIX = "VMP_PLATFORM_KEEPLIVE_";
 
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
index dcac49d..24fc221 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
@@ -16,6 +16,8 @@
 
 	private String channelId;
 
+	private String sn;
+
 	private String name;
 	
 	private int sumNum;
@@ -61,4 +63,12 @@
 	public void setChannelId(String channelId) {
 		this.channelId = channelId;
 	}
+
+	public String getSn() {
+		return sn;
+	}
+
+	public void setSn(String sn) {
+		this.sn = sn;
+	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java
index 0327cc5..dff74cf 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/CheckForAllRecordsThread.java
@@ -53,7 +53,7 @@
         // 鑷劧椤哄簭鎺掑簭, 鍏冪礌杩涜鍗囧簭鎺掑垪
         this.recordInfo.getRecordList().sort(Comparator.naturalOrder());
         RequestMessage msg = new RequestMessage();
-        msg.setKey(DeferredResultHolder.CALLBACK_CMD_RECORDINFO + recordInfo.getDeviceId() + recordInfo.getChannelId());
+        msg.setKey(DeferredResultHolder.CALLBACK_CMD_RECORDINFO + recordInfo.getDeviceId() + recordInfo.getSn());
         msg.setData(recordInfo);
         deferredResultHolder.invokeAllResult(msg);
         logger.info("澶勭悊瀹屾垚锛岃繑鍥炵粨鏋�");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
index ee24376..48c4939 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
@@ -35,6 +35,10 @@
 
 	public static final String CALLBACK_CMD_PLAY = "CALLBACK_PLAY";
 
+	public static final String CALLBACK_CMD_PLAYBACK = "CALLBACK_PLAY";
+
+	public static final String CALLBACK_CMD_DOWNLOAD = "CALLBACK_DOWNLOAD";
+
 	public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP";
 
 	public static final String CALLBACK_CMD_MOBILEPOSITION = "CALLBACK_MOBILEPOSITION";
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
index 868dbb4..6e96dac 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -256,8 +256,9 @@
 	 * @param device 瑙嗛璁惧
 	 * @param startTime 寮�濮嬫椂闂�,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss
 	 * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss
+	 * @param sn
 	 */
-	boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, SipSubscribe.Event errorEvent);
+	boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, SipSubscribe.Event errorEvent);
 	
 	/**
 	 * 鏌ヨ鎶ヨ淇℃伅
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index e06a7fc..2f90dee 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -1196,14 +1196,15 @@
 	 * @param endTime 缁撴潫鏃堕棿,鏍煎紡瑕佹眰锛歽yyy-MM-dd HH:mm:ss
 	 */  
 	@Override
-	public boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, SipSubscribe.Event errorEvent) {
-		
+	public boolean recordInfoQuery(Device device, String channelId, String startTime, String endTime, int sn, SipSubscribe.Event errorEvent) {
+
+
 		try {
 			StringBuffer recordInfoXml = new StringBuffer(200);
 			recordInfoXml.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>\r\n");
 			recordInfoXml.append("<Query>\r\n");
 			recordInfoXml.append("<CmdType>RecordInfo</CmdType>\r\n");
-			recordInfoXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n");
+			recordInfoXml.append("<SN>" + sn + "</SN>\r\n");
 			recordInfoXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n");
 			recordInfoXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(startTime) + "</StartTime>\r\n");
 			recordInfoXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(endTime) + "</EndTime>\r\n");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/MessageRequestProcessor1.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/MessageRequestProcessor1.java
index 847f7e1..2a90841 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/MessageRequestProcessor1.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/MessageRequestProcessor1.java
@@ -914,21 +914,20 @@
 			String uuid = UUID.randomUUID().toString().replace("-", "");
 			RecordInfo recordInfo = new RecordInfo();
 			Element rootElement = getRootElement(evt);
-			Element deviceIdElement = rootElement.element("DeviceID");
-			String channelId = deviceIdElement.getText().toString();
-			String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + channelId;
+			String sn = getText(rootElement, "SN");
+			String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + sn;
 			if (device != null ) {
 				rootElement = getRootElement(evt, device.getCharset());
 			}
 			recordInfo.setDeviceId(deviceId);
-			recordInfo.setChannelId(channelId);
+			recordInfo.setSn(sn);
 			recordInfo.setName(getText(rootElement, "Name"));
 			if (getText(rootElement, "SumNum")== null || getText(rootElement, "SumNum") =="") {
 				recordInfo.setSumNum(0);
 			} else {
 				recordInfo.setSumNum(Integer.parseInt(getText(rootElement, "SumNum")));
 			}
-			String sn = getText(rootElement, "SN");
+
 			Element recordListElement = rootElement.element("RecordList");
 			if (recordListElement == null || recordInfo.getSumNum() == 0) {
 				logger.info("鏃犲綍鍍忔暟鎹�");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java
index f1919da..f0f8421 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java
@@ -64,18 +64,16 @@
             rootElement = getRootElement(evt, device.getCharset());
             String uuid = UUID.randomUUID().toString().replace("-", "");
             RecordInfo recordInfo = new RecordInfo();
-            Element deviceIdElement = rootElement.element("DeviceID");
-            String channelId = deviceIdElement.getText();
-            String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + device.getDeviceId() + channelId;
+            String sn = getText(rootElement, "SN");
+            String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + device.getDeviceId() + sn;
             recordInfo.setDeviceId(device.getDeviceId());
-            recordInfo.setChannelId(channelId);
+            recordInfo.setSn(sn);
             recordInfo.setName(getText(rootElement, "Name"));
             if (getText(rootElement, "SumNum") == null || getText(rootElement, "SumNum") == "") {
                 recordInfo.setSumNum(0);
             } else {
                 recordInfo.setSumNum(Integer.parseInt(getText(rootElement, "SumNum")));
             }
-            String sn = getText(rootElement, "SN");
             Element recordListElement = rootElement.element("RecordList");
             if (recordListElement == null || recordInfo.getSumNum() == 0) {
                 logger.info("鏃犲綍鍍忔暟鎹�");
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index d6e77c7..233416a 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -164,12 +164,20 @@
 				subscribe.response(mediaInfo, json);
 			}
 		}
+	 	String app = json.getString("app");
+	 	String stream = json.getString("stream");
+		StreamInfo streamInfo = redisCatchStorage.queryPlaybackByStreamId(stream);
 		JSONObject ret = new JSONObject();
+		// 褰曞儚鍥炴斁鏃朵笉杩涜褰曞儚涓嬭浇
+		if (streamInfo != null) {
+			ret.put("enableMP4", false);
+		}else {
+			ret.put("enableMP4", userSetup.isRecordPushLive());
+		}
 		ret.put("code", 0);
 		ret.put("msg", "success");
 		ret.put("enableHls", true);
 		ret.put("enableMP4", userSetup.isRecordPushLive());
-		ret.put("enableRtxp", true);
 		return new ResponseEntity<String>(ret.toString(), HttpStatus.OK);
 	}
 	
@@ -358,14 +366,13 @@
 		String mediaServerId = json.getString("mediaServerId");
 		String streamId = json.getString("stream");
 		String app = json.getString("app");
-
-		// TODO 濡傛灉鍦ㄧ粰涓婄骇鎺ㄦ祦锛屼篃涓嶅仠姝€��
+		JSONObject ret = new JSONObject();
+		ret.put("code", 0);
 		if ("rtp".equals(app)){
-			JSONObject ret = new JSONObject();
-			ret.put("code", 0);
 			ret.put("close", true);
 			StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId);
 			if (streamInfoForPlayCatch != null) {
+				// 濡傛灉鍦ㄧ粰涓婄骇鎺ㄦ祦锛屼篃涓嶅仠姝€��
 				if (redisCatchStorage.isChannelSendingRTP(streamInfoForPlayCatch.getChannelId())) {
 					ret.put("close", false);
 				} else {
@@ -378,6 +385,12 @@
 				if (streamInfoForPlayBackCatch != null) {
 					cmder.streamByeCmd(streamInfoForPlayBackCatch.getDeviceID(), streamInfoForPlayBackCatch.getChannelId());
 					redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch);
+				}else {
+					StreamInfo streamInfoForDownload = redisCatchStorage.queryDownloadByStreamId(streamId);
+					// 杩涜褰曞儚涓嬭浇鏃舵棤浜鸿鐪嬩笉鏂祦
+					if (streamInfoForDownload != null) {
+						ret.put("close", false);
+					}
 				}
 			}
 			MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
@@ -386,8 +399,6 @@
 			}
 			return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
 		}else {
-			JSONObject ret = new JSONObject();
-			ret.put("code", 0);
 			StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(app, streamId);
 			if (streamProxyItem != null && streamProxyItem.isEnable_remove_none_reader()) {
 				ret.put("close", true);
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java b/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
index 9e5c444..8a7437c 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
@@ -18,4 +18,6 @@
     PlayResult play(MediaServerItem mediaServerItem, String deviceId, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent);
 
     MediaServerItem getNewMediaServerItem(Device device);
+
+    void onPublishHandlerForDownload(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, String toString);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index f67df04..640e99a 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -34,11 +34,6 @@
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.context.request.async.DeferredResult;
 
-import javax.sip.DialogTerminatedEvent;
-import javax.sip.ResponseEvent;
-import javax.sip.TimeoutEvent;
-import javax.sip.TransactionTerminatedEvent;
-import javax.sip.message.Response;
 import java.io.FileNotFoundException;
 import java.util.Objects;
 import java.util.UUID;
@@ -286,14 +281,33 @@
         return mediaServerItem;
     }
 
+
     @Override
     public void onPublishHandlerForPlayBack(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId, String uuid) {
         RequestMessage msg = new RequestMessage();
-        msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId);
+        msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId);
         msg.setId(uuid);
         StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId, uuid);
         if (streamInfo != null) {
             redisCatchStorage.startPlayback(streamInfo);
+            msg.setData(JSON.toJSONString(streamInfo));
+            resultHolder.invokeResult(msg);
+        } else {
+            logger.warn("璁惧鍥炴斁API璋冪敤澶辫触锛�");
+            msg.setData("璁惧鍥炴斁API璋冪敤澶辫触锛�");
+            resultHolder.invokeResult(msg);
+        }
+    }
+
+
+    @Override
+    public void onPublishHandlerForDownload(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, String uuid) {
+        RequestMessage msg = new RequestMessage();
+        msg.setKey(DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId);
+        msg.setId(uuid);
+        StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId, uuid);
+        if (streamInfo != null) {
+            redisCatchStorage.startDownload(streamInfo);
             msg.setData(JSON.toJSONString(streamInfo));
             resultHolder.invokeResult(msg);
         } else {
@@ -303,6 +317,7 @@
         }
     }
 
+
     public StreamInfo onPublishHandler(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId, String uuid) {
         String streamId = resonse.getString("stream");
         JSONArray tracks = resonse.getJSONArray("tracks");
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index 25743e1..5878339 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -144,4 +144,12 @@
      * @param streamId
      */
     void removePushStream(MediaServerItem mediaServerItem, String app, String streamId);
+
+    /**
+     * 寮�濮嬩笅杞藉綍鍍忔椂瀛樺叆
+     * @param streamInfo
+     */
+    boolean startDownload(StreamInfo streamInfo);
+
+    StreamInfo queryDownloadByStreamId(String streamId);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index 272a338..e98d8fa 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -64,15 +64,15 @@
                 streamInfo.getChannelId()));
     }
     @Override
-    public StreamInfo queryPlayByStreamId(String steamId) {
-        List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, steamId));
+    public StreamInfo queryPlayByStreamId(String streamId) {
+        List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, streamId));
         if (playLeys == null || playLeys.size() == 0) return null;
         return (StreamInfo)redis.get(playLeys.get(0).toString());
     }
 
     @Override
-    public StreamInfo queryPlaybackByStreamId(String steamId) {
-        List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, steamId));
+    public StreamInfo queryPlaybackByStreamId(String streamId) {
+        List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, streamId));
         if (playLeys == null || playLeys.size() == 0) return null;
         return (StreamInfo)redis.get(playLeys.get(0).toString());
     }
@@ -104,10 +104,15 @@
 
     @Override
     public boolean startPlayback(StreamInfo stream) {
-        return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getChannelId()),
-                stream);
+        return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getStreamId(),
+                        stream.getDeviceID(), stream.getChannelId()), stream);
     }
 
+    @Override
+    public boolean startDownload(StreamInfo streamInfo) {
+        return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, streamInfo.getStreamId(),
+                        streamInfo.getDeviceID(), streamInfo.getChannelId()), streamInfo);
+    }
 
     @Override
     public boolean stopPlayback(StreamInfo streamInfo) {
@@ -318,4 +323,11 @@
         String key = VideoManagerConstants.WVP_SERVER_STREAM_PUSH_PREFIX + app + "_" + streamId + "_" + mediaServerItem.getId();
         redis.del(key);
     }
+
+    @Override
+    public StreamInfo queryDownloadByStreamId(String streamId) {
+        List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.DOWNLOAD_PREFIX, streamId));
+        if (playLeys == null || playLeys.size() == 0) return null;
+        return (StreamInfo)redis.get(playLeys.get(0).toString());
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java
index f6228af..3f846c6 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/DownloadController.java
@@ -76,7 +76,7 @@
 		if (logger.isDebugEnabled()) {
 			logger.debug(String.format("鍘嗗彶濯掍綋涓嬭浇 API璋冪敤锛宒eviceId锛�%s锛宑hannelId锛�%s锛宒ownloadSpeed锛�%s", deviceId, channelId, downloadSpeed));
 		}
-		String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId;
+		String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId;
 		String uuid = UUID.randomUUID().toString();
 		DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(30000L);
 		// 瓒呮椂澶勭悊
@@ -114,7 +114,7 @@
 
 		cmder.downloadStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, (MediaServerItem mediaServerItem, JSONObject response) -> {
 			logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString());
-			playService.onPublishHandlerForPlayBack(mediaServerItem, response, deviceId, channelId, uuid.toString());
+			playService.onPublishHandlerForDownload(mediaServerItem, response, deviceId, channelId, uuid.toString());
 		}, event -> {
 			RequestMessage msg = new RequestMessage();
 			msg.setId(uuid);
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java
index a029073..fd1f2ab 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/playback/PlaybackController.java
@@ -78,7 +78,7 @@
 			logger.debug(String.format("璁惧鍥炴斁 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId));
 		}
 		String uuid = UUID.randomUUID().toString();
-		String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId;
+		String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId;
 		DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(30000L);
 		Device device = storager.queryVideoDevice(deviceId);
 		if (device == null) {
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java
index 5b33826..a8675e8 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java
@@ -59,11 +59,12 @@
 		// 鎸囧畾瓒呮椂鏃堕棿 1鍒嗛挓30绉�
 		DeferredResult<ResponseEntity<RecordInfo>> result = new DeferredResult<>(90*1000L);
 		String uuid = UUID.randomUUID().toString();
-		String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + channelId;
+		int sn  =  (int)((Math.random()*9+1)*100000);
+		String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + sn;
 		RequestMessage msg = new RequestMessage();
 		msg.setId(uuid);
 		msg.setKey(key);
-		cmder.recordInfoQuery(device, channelId, startTime, endTime, (eventResult -> {
+		cmder.recordInfoQuery(device, channelId, startTime, endTime, sn, (eventResult -> {
 			msg.setData("鏌ヨ褰曞儚澶辫触, status: " +  eventResult.statusCode + ", message: " + eventResult.msg );
 			resultHolder.invokeResult(msg);
 		}));

--
Gitblit v1.8.0