From ab491a079ba4ab85ffef35d14c0767eba01455d8 Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期三, 15 一月 2025 09:18:36 +0800 Subject: [PATCH] 切正式服 --- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java | 166 ++++++++++++++++++++++++++----------------------------- 1 files changed, 79 insertions(+), 87 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 c436e16..409042c 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 @@ -36,22 +36,23 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; -import org.bytedeco.javacv.FFmpegFrameGrabber; -import org.bytedeco.javacv.Frame; -import org.bytedeco.javacv.FrameGrabber; -import org.bytedeco.javacv.OpenCVFrameConverter; +import org.bytedeco.javacv.*; 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.beans.factory.annotation.Value; 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.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; +import java.awt.image.BufferedImage; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.*; @@ -72,7 +73,8 @@ public class PlayController { private final static Logger logger = LoggerFactory.getLogger(PlayController.class); - + @Value("${platform.upload}") + public String upload; @Autowired private SIPCommander cmder; @Autowired @@ -180,93 +182,72 @@ public DeferredResult<WVPResult<String>> playReturnImg(HttpServletRequest request, @PathVariable String deviceId, @PathVariable String channelId) throws IOException { logger.info("[寮�濮嬬偣鎾璢 deviceId锛歿}, channelId锛歿}, ", deviceId, channelId); - DeferredResult<WVPResult<String>> result = new DeferredResult<>(20 * 1000L); - //宸茬粡瀛樺湪娴� - InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); - if (inviteInfo != null) { - logger.info("宸插瓨鍦ㄦ祦"); - if (inviteInfo.getStreamInfo() != null) { - // 宸插瓨鍦ㄧ嚎鐩存帴鎴浘 - MediaServer mediaServerItemInuse = mediaServerService.getOne(inviteInfo.getStreamInfo().getMediaServerId()); - String streamUrl; - if (mediaServerItemInuse.getRtspPort() != 0) { - streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServerItemInuse.getRtspPort(), "rtp", inviteInfo.getStreamInfo().getStream()); - } else { - streamUrl = String.format("http://127.0.0.1:%s/%s/%s.live.mp4", mediaServerItemInuse.getHttpPort(), "rtp", inviteInfo.getStreamInfo().getStream()); - } - WVPResult<String> wvpResult = new WVPResult<>(); - String img = getImg(streamUrl); - wvpResult.setData(img); + // 鑾峰彇鍙敤鐨剒lm + Device device = storager.queryVideoDevice(deviceId); + MediaServer newMediaServerItem = playService.getNewMediaServerItem(device); + RequestMessage requestMessage = new RequestMessage(); + String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId; + requestMessage.setKey(key); + String uuid = UUID.randomUUID().toString(); + requestMessage.setId(uuid); + + //瀛樻椿鏃堕棿 + DeferredResult<WVPResult<String>> result = new DeferredResult<>(120 * 1000L); + + //120绉掑瓨娲� + result.onTimeout(() -> { + logger.info("[鐐规挱绛夊緟瓒呮椂] deviceId锛歿}, channelId锛歿}, ", deviceId, channelId); + // 閲婃斁rtpserver + WVPResult<StreamInfo> wvpResult = new WVPResult<>(); + wvpResult.setCode(ErrorCode.ERROR100.getCode()); + wvpResult.setMsg("鐐规挱瓒呮椂"); + requestMessage.setData(wvpResult); + resultHolder.invokeAllResult(requestMessage); + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); + storager.stopPlay(deviceId, channelId); + }); + + // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ + resultHolder.put(key, uuid, result); + + playService.play(newMediaServerItem, deviceId, channelId, null, (code, msg, data) -> { + WVPResult<String> wvpResult = new WVPResult<>(); + if (code == InviteErrorCode.SUCCESS.getCode()) { wvpResult.setCode(ErrorCode.SUCCESS.getCode()); wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); - result.setResult(wvpResult); - } - } else { - logger.info("鏈瓨鍦ㄦ祦"); - // 鑾峰彇鍙敤鐨剒lm - Device device = storager.queryVideoDevice(deviceId); - MediaServer newMediaServerItem = playService.getNewMediaServerItem(device); - RequestMessage requestMessage = new RequestMessage(); - String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId; - requestMessage.setKey(key); - String uuid = UUID.randomUUID().toString(); - requestMessage.setId(uuid); - //20绉掑瓨娲� - result.onTimeout(() -> { - logger.info("[鐐规挱绛夊緟瓒呮椂] deviceId锛歿}, channelId锛歿}, ", deviceId, channelId); - // 閲婃斁rtpserver - WVPResult<StreamInfo> wvpResult = new WVPResult<>(); - wvpResult.setCode(ErrorCode.ERROR100.getCode()); - wvpResult.setMsg("鐐规挱瓒呮椂"); - requestMessage.setData(wvpResult); - resultHolder.invokeAllResult(requestMessage); - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); - storager.stopPlay(deviceId, channelId); - }); - - // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ - resultHolder.put(key, uuid, result); - - playService.play(newMediaServerItem, deviceId, channelId, null, (code, msg, data) -> { - WVPResult<String> wvpResult = new WVPResult<>(); - if (code == InviteErrorCode.SUCCESS.getCode()) { - wvpResult.setCode(ErrorCode.SUCCESS.getCode()); - wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); - - if (data != null) { - StreamInfo streamInfo = (StreamInfo) data; - if (userSetting.getUseSourceIpAsStreamIp()) { - streamInfo = streamInfo.clone();//娣辨嫹璐� - String host; - try { - URL url = new URL(request.getRequestURL().toString()); - host = url.getHost(); - } catch (MalformedURLException e) { - host = request.getLocalAddr(); - } - streamInfo.channgeStreamIp(host); + if (data != null) { + StreamInfo streamInfo = (StreamInfo) data; + if (userSetting.getUseSourceIpAsStreamIp()) { + streamInfo = streamInfo.clone();//娣辨嫹璐� + String host; + try { + URL url = new URL(request.getRequestURL().toString()); + host = url.getHost(); + } catch (MalformedURLException e) { + host = request.getLocalAddr(); } - if (!ObjectUtils.isEmpty(newMediaServerItem.getTranscodeSuffix()) && !"null".equalsIgnoreCase(newMediaServerItem.getTranscodeSuffix())) { - streamInfo.setStream(streamInfo.getStream() + "_" + newMediaServerItem.getTranscodeSuffix()); - } - StreamContent streamContent = new StreamContent(streamInfo); - String rtspUrl = streamContent.getFmp4(); // 鍙杕p4鍦板潃 - String img = getImg(rtspUrl); - wvpResult.setData(img); - } else { - wvpResult.setCode(code); - wvpResult.setMsg(msg); + streamInfo.channgeStreamIp(host); } + if (!ObjectUtils.isEmpty(newMediaServerItem.getTranscodeSuffix()) && !"null".equalsIgnoreCase(newMediaServerItem.getTranscodeSuffix())) { + streamInfo.setStream(streamInfo.getStream() + "_" + newMediaServerItem.getTranscodeSuffix()); + } + StreamContent streamContent = new StreamContent(streamInfo); + String rtspUrl = streamContent.getFmp4(); // 鍙杕p4鍦板潃 + String img = getImg(rtspUrl); + wvpResult.setData(img); } else { wvpResult.setCode(code); wvpResult.setMsg(msg); } - requestMessage.setData(wvpResult); - // 姝ゅ蹇呴』閲婃斁鎵�鏈夎姹� - resultHolder.invokeAllResult(requestMessage); - }); - } + } else { + wvpResult.setCode(code); + wvpResult.setMsg(msg); + } + requestMessage.setData(wvpResult); + // 姝ゅ蹇呴』閲婃斁鎵�鏈夎姹� + resultHolder.invokeAllResult(requestMessage); + }); return result; } @@ -277,10 +258,21 @@ FFmpegFrameGrabber grabber = null; try { grabber = new FFmpegFrameGrabber(rtspUrl); -// grabber.setOption("rtsp_transport", "tcp"); // 浣跨敤tcp鐨勬柟寮忥紝涓嶇劧浼氫涪鍖呭緢涓ラ噸 -// grabber.setVideoOption("probesize", "10000"); // 璁剧疆鎹曡幏鍒嗘瀽鐨勬渶澶у瓧鑺� - grabber.start(); +// grabber.setOption("rtsp_transport", "tcp"); // 浣跨敤tcp鐨勬柟寮忥紝涓嶇劧浼氫涪鍖呭緢涓ラ噸 +// grabber.setVideoOption("probesize", "10000"); // 璁剧疆鎹曡幏鍒嗘瀽鐨勬渶澶у瓧鑺� +// grabber.setFrameRate(25); + grabber.startUnsafe(); Frame frame = grabber.grabImage(); // 鐩存帴鎹曡幏涓�甯� +// //杞崲鍥惧儚 +// Java2DFrameConverter converter = new Java2DFrameConverter(); +// BufferedImage srcImage = converter.getBufferedImage(frame); +// if (srcImage!=null) { +// //鍒涘缓鏂囦欢 +// File file = new File(picPath); +// //杈撳嚭鏂囦欢 +// ImageIO.write(srcImage, "png", file); +// } + if (frame != null) { System.out.println("鎴愬姛鎹曡幏涓�甯�"); // 灏咶rame杞崲涓篗at @@ -289,7 +281,7 @@ imgUrl = format.format(new Date()) + "_" + IdUtils.randomUUID() + ".png"; // 鐢熸垚鍥剧墖璺緞 - String imgPath = "/home/zgyw/uploadPath/" + imgUrl; + String imgPath = upload + imgUrl; System.out.println("鍥剧墖淇濆瓨鍦板潃锛�" + imgPath); imgUrl = "/profile/" + imgUrl; // 淇濆瓨鍥剧墖 -- Gitblit v1.8.0