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 | 83 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 83 insertions(+), 0 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 780f536..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,6 +2,7 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +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; @@ -20,6 +21,7 @@ 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; @@ -28,16 +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 java.net.MalformedURLException; import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; import java.util.UUID; @@ -76,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) @@ -149,6 +162,76 @@ 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) -- Gitblit v1.8.0