From 5602c458099e38c6c4278334e5cb4f8029c63a50 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 10 十月 2024 20:16:22 +0800
Subject: [PATCH] 初始化

---
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java |  119 ++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 92 insertions(+), 27 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 89a7724..32f827c 100755
--- 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
@@ -2,13 +2,11 @@
 
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
-import com.genersoft.iot.vmp.common.InviteInfo;
-import com.genersoft.iot.vmp.common.InviteSessionStatus;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.genersoft.iot.vmp.common.InviteSessionType;
 import com.genersoft.iot.vmp.common.StreamInfo;
 import com.genersoft.iot.vmp.conf.UserSetting;
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
-import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
 import com.genersoft.iot.vmp.conf.security.JwtUtils;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
@@ -16,13 +14,14 @@
 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
-import com.genersoft.iot.vmp.media.service.IMediaServerService;
 import com.genersoft.iot.vmp.media.bean.MediaServer;
+import com.genersoft.iot.vmp.media.service.IMediaServerService;
 import com.genersoft.iot.vmp.service.IInviteStreamService;
 import com.genersoft.iot.vmp.service.IPlayService;
 import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
 import com.genersoft.iot.vmp.utils.DateUtil;
+import com.genersoft.iot.vmp.utils.IdUtils;
 import com.genersoft.iot.vmp.vmanager.bean.AudioBroadcastResult;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
 import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
@@ -31,18 +30,25 @@
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.Frame;
+import org.bytedeco.javacv.FrameGrabber;
+import org.bytedeco.javacv.OpenCVFrameConverter;
+import org.bytedeco.opencv.global.opencv_imgcodecs;
+import org.bytedeco.opencv.opencv_core.Mat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.async.DeferredResult;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.sip.InvalidArgumentException;
-import javax.sip.SipException;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
@@ -81,6 +87,8 @@
 
 	@Autowired
 	private UserSetting userSetting;
+
+	private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
 
 	@Operation(summary = "寮�濮嬬偣鎾�", security = @SecurityRequirement(name = JwtUtils.HEADER))
 	@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
@@ -135,6 +143,9 @@
 						}
 						streamInfo.channgeStreamIp(host);
 					}
+					if (!ObjectUtils.isEmpty(newMediaServerItem.getTranscodeSuffix()) && !"null".equalsIgnoreCase(newMediaServerItem.getTranscodeSuffix())) {
+						streamInfo.setStream(streamInfo.getStream() + "_" + newMediaServerItem.getTranscodeSuffix());
+					}
 					wvpResult.setData(new StreamContent(streamInfo));
 				}else {
 					wvpResult.setCode(code);
@@ -145,17 +156,87 @@
 				wvpResult.setMsg(msg);
 			}
 			requestMessage.setData(wvpResult);
-			resultHolder.invokeResult(requestMessage);
+			// 姝ゅ蹇呴』閲婃斁鎵�鏈夎姹�
+			resultHolder.invokeAllResult(requestMessage);
 		});
 		return result;
 	}
 
+
+	@Operation(summary = "寮�濮嬬偣鎾苟杩斿洖鍥剧墖", security = @SecurityRequirement(name = JwtUtils.HEADER))
+	@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
+	@Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
+	@GetMapping("/start/img/{deviceId}/{channelId}")
+	public DeferredResult<WVPResult<String>> playReturnImg(HttpServletRequest request, @PathVariable String deviceId,
+														 @PathVariable String channelId) {
+
+		DeferredResult<WVPResult<StreamContent>> play = this.play(request, deviceId, channelId);
+		Object resultStr = play.getResult();
+		System.out.println("鑾峰彇缁撴灉锛�" + resultStr);
+		WVPResult wvpResult = (WVPResult) resultStr;
+		WVPResult<String> result = new WVPResult<>();
+		result.setData(this.getImg(wvpResult));
+		result.setCode(wvpResult.getCode());
+		result.setMsg(wvpResult.getMsg());
+		DeferredResult<WVPResult<String>> r = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
+		r.setResult(result);
+		return r;
+	}
+
+	private String getImg(WVPResult<StreamContent> wvpResult) {
+		String imgUrl = null;
+		if (wvpResult.getCode() == 0) {
+			String rtspUrl = wvpResult.getData().getFmp4(); // 鍙杕p4鍦板潃
+			if (StringUtils.hasText(rtspUrl)) {
+				System.out.println("鐩爣鍦板潃锛�" + rtspUrl);
+				FFmpegFrameGrabber grabber = null;
+				try {
+					grabber = new FFmpegFrameGrabber(rtspUrl);
+//                    grabber.setOption("rtsp_transport", "tcp"); // 浣跨敤tcp鐨勬柟寮忥紝涓嶇劧浼氫涪鍖呭緢涓ラ噸
+//                    grabber.setVideoOption("probesize", "10000"); // 璁剧疆鎹曡幏鍒嗘瀽鐨勬渶澶у瓧鑺�
+					grabber.start();
+					Frame frame = grabber.grabImage(); // 鐩存帴鎹曡幏涓�甯�
+					if (frame != null) {
+						System.out.println("鎴愬姛鎹曡幏涓�甯�");
+						// 灏咶rame杞崲涓篗at
+						OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
+						Mat mat = converter.convertToMat(frame);
+
+						imgUrl = format.format(new Date()) + "_" + IdUtils.randomUUID() + ".png";
+						// 鐢熸垚鍥剧墖璺緞
+						String imgPath = "/home/zgyw/uploadPath/" + imgUrl;
+						System.out.println("鍥剧墖淇濆瓨鍦板潃锛�" + imgPath);
+						imgUrl = "/profile/" + imgUrl;
+						// 淇濆瓨鍥剧墖
+						opencv_imgcodecs.imwrite(imgPath, mat);
+					} else {
+						System.out.println("鏈崟鑾峰埌甯�");
+					}
+				} catch (FrameGrabber.Exception e) {
+					e.printStackTrace();
+				} finally {
+					if (grabber != null) {
+						try {
+							grabber.stop(); // 鍋滄鎹曡幏
+						} catch (FrameGrabber.Exception e) {
+							e.printStackTrace();
+						}
+					}
+				}
+			}
+		} else {
+			System.out.println("璇锋眰澶辫触锛岄敊璇爜锛�" + wvpResult.getCode() + "--" + wvpResult.getMsg());
+		}
+		System.out.println("鍥剧墖URL锛�" + imgUrl);
+		return imgUrl;
+	}
+
+
 	@Operation(summary = "鍋滄鐐规挱", security = @SecurityRequirement(name = JwtUtils.HEADER))
 	@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,boolean isSubStream) {
+	public JSONObject playStop(@PathVariable String deviceId, @PathVariable String channelId) {
 
 		logger.debug(String.format("璁惧棰勮/鍥炴斁鍋滄API璋冪敤锛宻treamId锛�%s_%s", deviceId, channelId ));
 
@@ -168,26 +249,10 @@
 			throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧[" + deviceId + "]涓嶅瓨鍦�");
 		}
 
-		InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
-		if (inviteInfo == null) {
-			throw new ControllerException(ErrorCode.ERROR100.getCode(), "鐐规挱鏈壘鍒�");
-		}
-		if (InviteSessionStatus.ok == inviteInfo.getStatus()) {
-			try {
-				logger.info("[鍋滄鐐规挱] {}/{}", device.getDeviceId(), channelId);
-				cmder.streamByeCmd(device, channelId, inviteInfo.getStream(), null, null);
-			} catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
-				logger.error("[鍛戒护鍙戦�佸け璐 鍋滄鐐规挱锛� 鍙戦�丅YE: {}", e.getMessage());
-				throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
-			}
-		}
-		inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
-		storager.stopPlay(deviceId, channelId);
-
+		playService.stopPlay(device, channelId);
 		JSONObject json = new JSONObject();
 		json.put("deviceId", deviceId);
 		json.put("channelId", channelId);
-		json.put("isSubStream", isSubStream);
 		return json;
 	}
 	/**

--
Gitblit v1.8.0