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 | 655 +++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 363 insertions(+), 292 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 3d233dc..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 @@ -2,377 +2,448 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; import com.genersoft.iot.vmp.common.InviteInfo; -import com.genersoft.iot.vmp.common.InviteSessionStatus; 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; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 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.bean.MediaServer; +import com.genersoft.iot.vmp.media.service.IMediaServerService; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 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.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; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +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 javax.sip.InvalidArgumentException; -import javax.sip.SipException; -import java.text.ParseException; +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.*; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; +import java.util.Map; import java.util.UUID; -@Tag(name = "鍥芥爣璁惧鐐规挱") + +/** + * @author lin + */ +@Tag(name = "鍥芥爣璁惧鐐规挱") @RestController @RequestMapping("/api/play") public class PlayController { - private final static Logger logger = LoggerFactory.getLogger(PlayController.class); + private final static Logger logger = LoggerFactory.getLogger(PlayController.class); + @Value("${platform.upload}") + public String upload; + @Autowired + private SIPCommander cmder; + @Autowired + private ZLMRESTfulUtils zlmresTfulUtils; + @Autowired + private VideoStreamSessionManager streamSession; - @Autowired - private SIPCommander cmder; + @Autowired + private IVideoManagerStorage storager; - @Autowired - private VideoStreamSessionManager streamSession; + @Autowired + private IInviteStreamService inviteStreamService; - @Autowired - private IVideoManagerStorage storager; + @Autowired + private DeferredResultHolder resultHolder; - @Autowired - private IRedisCatchStorage redisCatchStorage; + @Autowired + private IPlayService playService; - @Autowired - private IInviteStreamService inviteStreamService; + @Autowired + private IMediaServerService mediaServerService; - @Autowired - private ZLMRESTfulUtils zlmresTfulUtils; + @Autowired + private UserSetting userSetting; - @Autowired - private DeferredResultHolder resultHolder; + private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - @Autowired - private IPlayService playService; + @Operation(summary = "寮�濮嬬偣鎾�", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true) + @GetMapping("/start/{deviceId}/{channelId}") + public DeferredResult<WVPResult<StreamContent>> play(HttpServletRequest request, @PathVariable String deviceId, + @PathVariable String channelId) { - @Autowired - private IMediaService mediaService; + logger.info("[寮�濮嬬偣鎾璢 deviceId锛歿}, channelId锛歿}, ", deviceId, channelId); + // 鑾峰彇鍙敤鐨剒lm + Device device = storager.queryVideoDevice(deviceId); + MediaServer newMediaServerItem = playService.getNewMediaServerItem(device); - @Autowired - private IMediaServerService mediaServerService; + 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<StreamContent>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue()); - @Autowired - private UserSetting userSetting; + 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); + }); - @Operation(summary = "寮�濮嬬偣鎾�") - @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) - @Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true) - @GetMapping("/start/{deviceId}/{channelId}") - public DeferredResult<WVPResult<StreamContent>> play(HttpServletRequest request, @PathVariable String deviceId, - @PathVariable String channelId) { + // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ + resultHolder.put(key, uuid, result); - logger.info("[寮�濮嬬偣鎾璢 deviceId锛歿}, channelId锛歿}, ", deviceId, channelId); - // 鑾峰彇鍙敤鐨剒lm - Device device = storager.queryVideoDevice(deviceId); - MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); + playService.play(newMediaServerItem, deviceId, channelId, null, (code, msg, data) -> { + WVPResult<StreamContent> wvpResult = new WVPResult<>(); + if (code == InviteErrorCode.SUCCESS.getCode()) { + wvpResult.setCode(ErrorCode.SUCCESS.getCode()); + wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); - 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<StreamContent>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue()); + 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 (!ObjectUtils.isEmpty(newMediaServerItem.getTranscodeSuffix()) && !"null".equalsIgnoreCase(newMediaServerItem.getTranscodeSuffix())) { + streamInfo.setStream(streamInfo.getStream() + "_" + newMediaServerItem.getTranscodeSuffix()); + } + wvpResult.setData(new StreamContent(streamInfo)); + } else { + wvpResult.setCode(code); + wvpResult.setMsg(msg); + } + } else { + wvpResult.setCode(code); + wvpResult.setMsg(msg); + } + requestMessage.setData(wvpResult); + // 姝ゅ蹇呴』閲婃斁鎵�鏈夎姹� + resultHolder.invokeAllResult(requestMessage); + }); + return result; + } - 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); + @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) throws IOException { + logger.info("[寮�濮嬬偣鎾璢 deviceId锛歿}, channelId锛歿}, ", deviceId, channelId); + // 鑾峰彇鍙敤鐨剒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); - playService.play(newMediaServerItem, deviceId, channelId, null, (code, msg, data) -> { - WVPResult<StreamContent> wvpResult = new WVPResult<>(); - if (code == InviteErrorCode.SUCCESS.getCode()) { - wvpResult.setCode(ErrorCode.SUCCESS.getCode()); - wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); + //瀛樻椿鏃堕棿 + DeferredResult<WVPResult<String>> result = new DeferredResult<>(120 * 1000L); - if (data != null) { - StreamInfo streamInfo = (StreamInfo)data; - if (userSetting.getUseSourceIpAsStreamIp()) { - streamInfo.channgeStreamIp(request.getLocalAddr()); - } - wvpResult.setData(new StreamContent(streamInfo)); - } - }else { - wvpResult.setCode(code); - wvpResult.setMsg(msg); - } - requestMessage.setData(wvpResult); - resultHolder.invokeResult(requestMessage); - }); - return result; - } + //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); + }); - @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,boolean isSubStream) { + // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ + resultHolder.put(key, uuid, result); - logger.debug(String.format("璁惧棰勮/鍥炴斁鍋滄API璋冪敤锛宻treamId锛�%s_%s", deviceId, channelId )); + 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 (deviceId == null || channelId == null) { - throw new ControllerException(ErrorCode.ERROR400); - } + 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 (!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); + } + } else { + wvpResult.setCode(code); + wvpResult.setMsg(msg); + } + requestMessage.setData(wvpResult); + // 姝ゅ蹇呴』閲婃斁鎵�鏈夎姹� + resultHolder.invokeAllResult(requestMessage); + }); + return result; + } - Device device = storager.queryVideoDevice(deviceId); - if (device == null) { - throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧[" + deviceId + "]涓嶅瓨鍦�"); - } + private String getImg(String rtspUrl) { + String imgUrl = null; + 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.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); +// } - 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); + if (frame != null) { + System.out.println("鎴愬姛鎹曡幏涓�甯�"); + // 灏咶rame杞崲涓篗at + OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat(); + Mat mat = converter.convertToMat(frame); - JSONObject json = new JSONObject(); - json.put("deviceId", deviceId); - json.put("channelId", channelId); - json.put("isSubStream", isSubStream); - return json; - } + imgUrl = format.format(new Date()) + "_" + IdUtils.randomUUID() + ".png"; + // 鐢熸垚鍥剧墖璺緞 + String imgPath = upload + 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(); + } + } + } + } + return imgUrl; + } - /** - * 灏嗕笉鏄痟264鐨勮棰戦�氳繃ffmpeg 杞爜涓篽264 + aac - * @param streamId 娴両D - */ - @Operation(summary = "灏嗕笉鏄痟264鐨勮棰戦�氳繃ffmpeg 杞爜涓篽264 + aac") - @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(), "杞爜澶辫触"); - } - } - } + @Operation(summary = "鍋滄鐐规挱", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true) + @GetMapping("/stop/{deviceId}/{channelId}") + public JSONObject playStop(@PathVariable String deviceId, @PathVariable String channelId) { - /** - * 缁撴潫杞爜 - */ - @Operation(summary = "缁撴潫杞爜") - @Parameter(name = "key", description = "瑙嗛娴乲ey", required = true) - @Parameter(name = "mediaServerId", description = "娴佸獟浣撴湇鍔D", required = true) - @PostMapping("/convertStop/{key}") - public void playConvertStop(@PathVariable String key, String mediaServerId) { - if (mediaServerId == null) { - throw new ControllerException(ErrorCode.ERROR400.getCode(), "娴佸獟浣擄細" + mediaServerId + "涓嶅瓨鍦�" ); - } - MediaServerItem 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 { - throw new ControllerException(ErrorCode.ERROR100 ); - } - } - } + logger.debug(String.format("璁惧棰勮/鍥炴斁鍋滄API璋冪敤锛宻treamId锛�%s_%s", deviceId, channelId)); - @Operation(summary = "璇煶骞挎挱鍛戒护") - @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) - @GetMapping("/broadcast/{deviceId}") - @PostMapping("/broadcast/{deviceId}") - public DeferredResult<String> broadcastApi(@PathVariable String deviceId) { + if (deviceId == null || channelId == null) { + throw new ControllerException(ErrorCode.ERROR400); + } + + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧[" + deviceId + "]涓嶅瓨鍦�"); + } + + playService.stopPlay(device, channelId); + JSONObject json = new JSONObject(); + json.put("deviceId", deviceId); + json.put("channelId", channelId); + return json; + } + + /** + * 缁撴潫杞爜 + */ + @Operation(summary = "缁撴潫杞爜", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "key", description = "瑙嗛娴乲ey", required = true) + @Parameter(name = "mediaServerId", description = "娴佸獟浣撴湇鍔D", required = true) + @PostMapping("/convertStop/{key}") + public void playConvertStop(@PathVariable String key, String mediaServerId) { + if (mediaServerId == null) { + throw new ControllerException(ErrorCode.ERROR400.getCode(), "娴佸獟浣擄細" + mediaServerId + "涓嶅瓨鍦�"); + } + MediaServer mediaInfo = mediaServerService.getOne(mediaServerId); + if (mediaInfo == null) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "浣跨敤鐨勬祦濯掍綋宸茬粡鍋滄杩愯"); + } else { + Boolean deleted = mediaServerService.delFFmpegSource(mediaInfo, key); + if (!deleted) { + throw new ControllerException(ErrorCode.ERROR100); + } + } + } + + @Operation(summary = "璇煶骞挎挱鍛戒护", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) + @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璋冪敤"); } 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; - } - String uuid = UUID.randomUUID().toString(); if (device == null) { + throw new ControllerException(ErrorCode.ERROR400.getCode(), "鏈壘鍒拌澶囷細 " + deviceId); + } + if (channelId == null) { + throw new ControllerException(ErrorCode.ERROR400.getCode(), "鏈壘鍒伴�氶亾锛� " + channelId); + } - 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; - } - 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()); - } + return playService.audioBroadcast(device, channelId, broadcastMode); - 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; - } + } - @Operation(summary = "鑾峰彇鎵�鏈夌殑ssrc") - @GetMapping("/ssrc") - public JSONObject getSSRC() { - if (logger.isDebugEnabled()) { - logger.debug("鑾峰彇鎵�鏈夌殑ssrc"); - } - JSONArray objects = new JSONArray(); - List<SsrcTransaction> allSsrc = streamSession.getAllSsrc(); - for (SsrcTransaction transaction : allSsrc) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("deviceId", transaction.getDeviceId()); - jsonObject.put("channelId", transaction.getChannelId()); - jsonObject.put("ssrc", transaction.getSsrc()); - jsonObject.put("streamId", transaction.getStream()); - objects.add(jsonObject); - } + @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); + } - JSONObject jsonObject = new JSONObject(); - jsonObject.put("data", objects); - jsonObject.put("count", objects.size()); - return jsonObject; - } + @Operation(summary = "鑾峰彇鎵�鏈夌殑ssrc", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @GetMapping("/ssrc") + public JSONObject getSSRC() { + if (logger.isDebugEnabled()) { + logger.debug("鑾峰彇鎵�鏈夌殑ssrc"); + } + JSONArray objects = new JSONArray(); + List<SsrcTransaction> allSsrc = streamSession.getAllSsrc(); + for (SsrcTransaction transaction : allSsrc) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("deviceId", transaction.getDeviceId()); + jsonObject.put("channelId", transaction.getChannelId()); + jsonObject.put("ssrc", transaction.getSsrc()); + jsonObject.put("streamId", transaction.getStream()); + objects.add(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); - } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("data", objects); + jsonObject.put("count", objects.size()); + return jsonObject; + } - DeferredResult<String> result = new DeferredResult<>(3 * 1000L); - String key = DeferredResultHolder.CALLBACK_CMD_SNAP + deviceId; - String uuid = UUID.randomUUID().toString(); - resultHolder.put(key, uuid, result); + @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("/snap") + public DeferredResult<String> getSnap(String deviceId, String channelId, boolean isSubStream) { + if (logger.isDebugEnabled()) { + logger.debug("鑾峰彇鎴浘: {}/{}", deviceId, channelId); + } - RequestMessage message = new RequestMessage(); - message.setKey(key); - message.setId(uuid); + DeferredResult<String> result = new DeferredResult<>(3 * 1000L); + String key = DeferredResultHolder.CALLBACK_CMD_SNAP + deviceId; + String uuid = UUID.randomUUID().toString(); + resultHolder.put(key, uuid, result); - 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; - } + 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