From 48ca11aaf324d017c08fadabf27c753fdd76c9b7 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 10 十月 2024 20:19:36 +0800
Subject: [PATCH] xxx
---
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java | 194 ++++++++++++++++++++++++-----------------------
1 files changed, 99 insertions(+), 95 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 ca8cbcf..4103f6b 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,17 +14,15 @@
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.zlm.ZLMRESTfulUtils;
-import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+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.IMediaServerService;
-import com.genersoft.iot.vmp.service.IMediaService;
import com.genersoft.iot.vmp.service.IPlayService;
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.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;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
@@ -34,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;
@@ -71,13 +74,7 @@
private IVideoManagerStorage storager;
@Autowired
- private IRedisCatchStorage redisCatchStorage;
-
- @Autowired
private IInviteStreamService inviteStreamService;
-
- @Autowired
- private ZLMRESTfulUtils zlmresTfulUtils;
@Autowired
private DeferredResultHolder resultHolder;
@@ -86,13 +83,12 @@
private IPlayService playService;
@Autowired
- private IMediaService mediaService;
-
- @Autowired
private IMediaServerService mediaServerService;
@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)
@@ -104,7 +100,7 @@
logger.info("[寮�濮嬬偣鎾璢 deviceId锛歿}, channelId锛歿}, ", deviceId, channelId);
// 鑾峰彇鍙敤鐨剒lm
Device device = storager.queryVideoDevice(deviceId);
- MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
+ MediaServer newMediaServerItem = playService.getNewMediaServerItem(device);
RequestMessage requestMessage = new RequestMessage();
String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId;
@@ -147,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);
@@ -157,17 +156,88 @@
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("鑾峰彇缁撴灉锛�" + play);
+ 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 ));
@@ -180,72 +250,12 @@
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;
}
-
- /**
- * 灏嗕笉鏄痟264鐨勮棰戦�氳繃ffmpeg 杞爜涓篽264 + aac
- * @param streamId 娴両D
- */
- @Operation(summary = "灏嗕笉鏄痟264鐨勮棰戦�氳繃ffmpeg 杞爜涓篽264 + aac", security = @SecurityRequirement(name = JwtUtils.HEADER))
- @Parameter(name = "streamId", description = "瑙嗛娴両D", required = true)
- @PostMapping("/convert/{streamId}")
- public JSONObject playConvert(@PathVariable String streamId) {
-// StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
-
- InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, streamId);
- if (inviteInfo == null || inviteInfo.getStreamInfo() == null) {
- logger.warn("瑙嗛杞爜API璋冪敤澶辫触锛�, 瑙嗛娴佸凡缁忓仠姝�!");
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏈壘鍒拌棰戞祦淇℃伅, 瑙嗛娴佸彲鑳藉凡缁忓仠姝�");
- }
- MediaServerItem mediaInfo = mediaServerService.getOne(inviteInfo.getStreamInfo().getMediaServerId());
- JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaInfo, streamId);
- if (!rtpInfo.getBoolean("exist")) {
- logger.warn("瑙嗛杞爜API璋冪敤澶辫触锛�, 瑙嗛娴佸凡鍋滄鎺ㄦ祦!");
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏈壘鍒拌棰戞祦淇℃伅, 瑙嗛娴佸彲鑳藉凡鍋滄鎺ㄦ祦");
- } else {
- String dstUrl = String.format("rtmp://%s:%s/convert/%s", "127.0.0.1", mediaInfo.getRtmpPort(),
- streamId );
- String srcUrl = String.format("rtsp://%s:%s/rtp/%s", "127.0.0.1", mediaInfo.getRtspPort(), streamId);
- JSONObject jsonObject = zlmresTfulUtils.addFFmpegSource(mediaInfo, srcUrl, dstUrl, "1000000", true, false, null);
- logger.info(jsonObject.toJSONString());
- if (jsonObject != null && jsonObject.getInteger("code") == 0) {
- JSONObject data = jsonObject.getJSONObject("data");
- if (data != null) {
- JSONObject result = new JSONObject();
- result.put("key", data.getString("key"));
- StreamInfo streamInfoResult = mediaService.getStreamInfoByAppAndStreamWithCheck("convert", streamId, mediaInfo.getId(), false);
- result.put("StreamInfo", streamInfoResult);
- return result;
- }else {
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "杞爜澶辫触");
- }
- }else {
- throw new ControllerException(ErrorCode.ERROR100.getCode(), "杞爜澶辫触");
- }
- }
- }
-
/**
* 缁撴潫杞爜
*/
@@ -257,18 +267,12 @@
if (mediaServerId == null) {
throw new ControllerException(ErrorCode.ERROR400.getCode(), "娴佸獟浣擄細" + mediaServerId + "涓嶅瓨鍦�" );
}
- MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
+ MediaServer mediaInfo = mediaServerService.getOne(mediaServerId);
if (mediaInfo == null) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "浣跨敤鐨勬祦濯掍綋宸茬粡鍋滄杩愯" );
}else {
- JSONObject jsonObject = zlmresTfulUtils.delFFmpegSource(mediaInfo, key);
- logger.info(jsonObject.toJSONString());
- if (jsonObject != null && jsonObject.getInteger("code") == 0) {
- JSONObject data = jsonObject.getJSONObject("data");
- if (data == null || data.getBoolean("flag") == null || !data.getBoolean("flag")) {
- throw new ControllerException(ErrorCode.ERROR100 );
- }
- }else {
+ Boolean deleted = mediaServerService.delFFmpegSource(mediaInfo, key);
+ if (!deleted) {
throw new ControllerException(ErrorCode.ERROR100 );
}
}
--
Gitblit v1.8.0