From db6dd3f7550c433f06475540a13598cbeed12d08 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 19 七月 2023 11:33:58 +0800
Subject: [PATCH] Merge branch 'wvp-28181-2.0' into main-dev

---
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java |  141 +++++++++++++++++++++++++---------------------
 1 files changed, 76 insertions(+), 65 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
index f6f42b3..e67e373 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -1,6 +1,5 @@
 package com.genersoft.iot.vmp.vmanager.gb28181.play;
 
-import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.genersoft.iot.vmp.common.InviteInfo;
@@ -25,6 +24,8 @@
 import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
 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.vmanager.bean.*;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
 import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
@@ -44,6 +45,10 @@
 import java.util.List;
 import java.util.UUID;
 
+
+/**
+ * @author lin
+ */
 @Tag(name  = "鍥芥爣璁惧鐐规挱")
 
 @RestController
@@ -116,7 +121,7 @@
 		// 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ
 		resultHolder.put(key, uuid, result);
 
-		playService.play(newMediaServerItem, deviceId, channelId, ((code, msg, data) -> {
+		playService.play(newMediaServerItem, deviceId, channelId, null, (code, msg, data) -> {
 			WVPResult<StreamContent> wvpResult = new WVPResult<>();
 			if (code == InviteErrorCode.SUCCESS.getCode()) {
 				wvpResult.setCode(ErrorCode.SUCCESS.getCode());
@@ -125,7 +130,7 @@
 				if (data != null) {
 					StreamInfo streamInfo = (StreamInfo)data;
 					if (userSetting.getUseSourceIpAsStreamIp()) {
-						streamInfo.channgeStreamIp(request.getLocalName());
+						streamInfo.channgeStreamIp(request.getLocalAddr());
 					}
 					wvpResult.setData(new StreamContent(streamInfo));
 				}
@@ -133,18 +138,18 @@
 				wvpResult.setCode(code);
 				wvpResult.setMsg(msg);
 			}
-			System.out.println(JSON.toJSONString(wvpResult));
 			requestMessage.setData(wvpResult);
 			resultHolder.invokeResult(requestMessage);
-		}));
+		});
 		return result;
 	}
 
 	@Operation(summary = "鍋滄鐐规挱")
 	@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
 	@Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
+	@Parameter(name = "isSubStream", description = "鏄惁瀛愮爜娴侊紙true-瀛愮爜娴侊紝false-涓荤爜娴侊級锛岄粯璁や负false", required = true)
 	@GetMapping("/stop/{deviceId}/{channelId}")
-	public JSONObject playStop(@PathVariable String deviceId, @PathVariable String channelId) {
+	public JSONObject playStop(@PathVariable String deviceId, @PathVariable String channelId,boolean isSubStream) {
 
 		logger.debug(String.format("璁惧棰勮/鍥炴斁鍋滄API璋冪敤锛宻treamId锛�%s_%s", deviceId, channelId ));
 
@@ -171,11 +176,12 @@
 			}
 		}
 		inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
-
 		storager.stopPlay(deviceId, channelId);
+
 		JSONObject json = new JSONObject();
 		json.put("deviceId", deviceId);
 		json.put("channelId", channelId);
+		json.put("isSubStream", isSubStream);
 		return json;
 	}
 
@@ -252,68 +258,42 @@
 
 	@Operation(summary = "璇煶骞挎挱鍛戒护")
 	@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
-    @GetMapping("/broadcast/{deviceId}")
-    @PostMapping("/broadcast/{deviceId}")
-    public DeferredResult<String> broadcastApi(@PathVariable String deviceId) {
-        if (logger.isDebugEnabled()) {
-            logger.debug("璇煶骞挎挱API璋冪敤");
-        }
-        Device device = storager.queryVideoDevice(deviceId);
-		DeferredResult<String> result = new DeferredResult<>(3 * 1000L);
-		String key  = DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId;
-		if (resultHolder.exist(key, null)) {
-			result.setResult("璁惧浣跨敤涓�");
-			return result;
+	@Parameter(name = "deviceId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
+	@Parameter(name = "timeout", description = "鎺ㄦ祦瓒呮椂鏃堕棿(绉�)", required = true)
+	@GetMapping("/broadcast/{deviceId}/{channelId}")
+	@PostMapping("/broadcast/{deviceId}/{channelId}")
+    public AudioBroadcastResult broadcastApi(@PathVariable String deviceId, @PathVariable String channelId, Integer timeout, Boolean broadcastMode) {
+		if (logger.isDebugEnabled()) {
+			logger.debug("璇煶骞挎挱API璋冪敤");
 		}
-		String uuid  = UUID.randomUUID().toString();
-        if (device == null) {
-
-			resultHolder.put(key, key,  result);
-			RequestMessage msg = new RequestMessage();
-			msg.setKey(key);
-			msg.setId(uuid);
-			JSONObject json = new JSONObject();
-			json.put("DeviceID", deviceId);
-			json.put("CmdType", "Broadcast");
-			json.put("Result", "Failed");
-			json.put("Description", "Device 涓嶅瓨鍦�");
-			msg.setData(json);
-			resultHolder.invokeResult(msg);
-			return result;
+		Device device = storager.queryVideoDevice(deviceId);
+		if (device == null) {
+			throw new ControllerException(ErrorCode.ERROR400.getCode(), "鏈壘鍒拌澶囷細 " + deviceId);
 		}
-		try {
-			cmder.audioBroadcastCmd(device, (event) -> {
-				RequestMessage msg = new RequestMessage();
-				msg.setKey(key);
-				msg.setId(uuid);
-				JSONObject json = new JSONObject();
-				json.put("DeviceID", deviceId);
-				json.put("CmdType", "Broadcast");
-				json.put("Result", "Failed");
-				json.put("Description", String.format("璇煶骞挎挱鎿嶄綔澶辫触锛岄敊璇爜锛� %s, %s", event.statusCode, event.msg));
-				msg.setData(json);
-				resultHolder.invokeResult(msg);
-			});
-		} catch (InvalidArgumentException | SipException | ParseException e) {
-			logger.error("[鍛戒护鍙戦�佸け璐 璇煶骞挎挱: {}", e.getMessage());
-			throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
+		if (channelId == null) {
+			throw new ControllerException(ErrorCode.ERROR400.getCode(), "鏈壘鍒伴�氶亾锛� " + channelId);
 		}
 
-		result.onTimeout(() -> {
-			logger.warn("璇煶骞挎挱鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�");
-			RequestMessage msg = new RequestMessage();
-			msg.setKey(key);
-			msg.setId(uuid);
-			JSONObject json = new JSONObject();
-			json.put("DeviceID", deviceId);
-			json.put("CmdType", "Broadcast");
-			json.put("Result", "Failed");
-			json.put("Error", "Timeout. Device did not response to broadcast command.");
-			msg.setData(json);
-			resultHolder.invokeResult(msg);
-		});
-		resultHolder.put(key, uuid, result);
-		return result;
+		return playService.audioBroadcast(device, channelId, broadcastMode);
+
+	}
+
+	@Operation(summary = "鍋滄璇煶骞挎挱")
+	@Parameter(name = "deviceId", description = "璁惧Id", required = true)
+	@Parameter(name = "channelId", description = "閫氶亾Id", required = true)
+	@GetMapping("/broadcast/stop/{deviceId}/{channelId}")
+	@PostMapping("/broadcast/stop/{deviceId}/{channelId}")
+	public void stopBroadcast(@PathVariable String deviceId, @PathVariable String channelId) {
+		if (logger.isDebugEnabled()) {
+			logger.debug("鍋滄璇煶骞挎挱API璋冪敤");
+		}
+//		try {
+//			playService.stopAudioBroadcast(deviceId, channelId);
+//		} catch (InvalidArgumentException | ParseException  | SipException e) {
+//			logger.error("[鍛戒护鍙戦�佸け璐 鍋滄璇煶: {}", e.getMessage());
+//			throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " +  e.getMessage());
+//		}
+		playService.stopAudioBroadcast(deviceId, channelId);
 	}
 
 	@Operation(summary = "鑾峰彇鎵�鏈夌殑ssrc")
@@ -339,5 +319,36 @@
 		return jsonObject;
 	}
 
+	@Operation(summary = "鑾峰彇鎴浘")
+	@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
+	@Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
+	@Parameter(name = "isSubStream", description = "鏄惁瀛愮爜娴侊紙true-瀛愮爜娴侊紝false-涓荤爜娴侊級锛岄粯璁や负false", required = true)
+	@GetMapping("/snap")
+	public DeferredResult<String> getSnap(String deviceId, String channelId,boolean isSubStream) {
+		if (logger.isDebugEnabled()) {
+			logger.debug("鑾峰彇鎴浘: {}/{}", deviceId, channelId);
+		}
+
+		DeferredResult<String> result = new DeferredResult<>(3 * 1000L);
+		String key  = DeferredResultHolder.CALLBACK_CMD_SNAP + deviceId;
+		String uuid  = UUID.randomUUID().toString();
+		resultHolder.put(key, uuid,  result);
+
+		RequestMessage message = new RequestMessage();
+		message.setKey(key);
+		message.setId(uuid);
+
+		String fileName = deviceId + "_" + channelId + "_" + DateUtil.getNowForUrl() + "jpg";
+		playService.getSnap(deviceId, channelId, fileName, (code, msg, data) -> {
+			if (code == InviteErrorCode.SUCCESS.getCode()) {
+				message.setData(data);
+			}else {
+				message.setData(WVPResult.fail(code, msg));
+			}
+			resultHolder.invokeResult(message);
+		});
+		return result;
+	}
+
 }
 

--
Gitblit v1.8.0