From b10a65483d709838fbe7d871b83fd5d42f2ef37e Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 04 三月 2022 10:30:55 +0800 Subject: [PATCH] 去除lombok,readme更新 --- src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 125 ++++++++++++++++++++++++++--------------- 1 files changed, 80 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java index d7b8ffe..9c87a0a 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java @@ -16,10 +16,10 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IMediaServerService; +import com.genersoft.iot.vmp.service.bean.PlayBackCallback; import com.genersoft.iot.vmp.service.bean.SSRCInfo; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; import com.genersoft.iot.vmp.service.IMediaService; @@ -34,12 +34,8 @@ import org.springframework.util.ResourceUtils; import org.springframework.web.context.request.async.DeferredResult; -import javax.sip.DialogTerminatedEvent; -import javax.sip.ResponseEvent; -import javax.sip.TimeoutEvent; -import javax.sip.TransactionTerminatedEvent; -import javax.sip.message.Response; import java.io.FileNotFoundException; +import java.util.Objects; import java.util.UUID; @SuppressWarnings(value = {"rawtypes", "unchecked"}) @@ -56,9 +52,6 @@ @Autowired private IRedisCatchStorage redisCatchStorage; - - @Autowired - private RedisUtil redis; @Autowired private DeferredResultHolder resultHolder; @@ -85,7 +78,13 @@ RequestMessage msg = new RequestMessage(); String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId; msg.setKey(key); - msg.setId(playResult.getUuid()); + String uuid = UUID.randomUUID().toString(); + msg.setId(uuid); + playResult.setUuid(uuid); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(userSetup.getPlayTimeout()); + playResult.setResult(result); + // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ + resultHolder.put(key, uuid, result); if (mediaServerItem == null) { WVPResult wvpResult = new WVPResult(); wvpResult.setCode(-1); @@ -94,34 +93,29 @@ resultHolder.invokeResult(msg); return playResult; } - - Device device = storager.queryVideoDevice(deviceId); + Device device = redisCatchStorage.getDevice(deviceId); StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId); playResult.setDevice(device); - String uuid = UUID.randomUUID().toString(); - playResult.setUuid(uuid); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(userSetup.getPlayTimeout()); - playResult.setResult(result); - // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ - resultHolder.put(key, uuid, result); // 瓒呮椂澶勭悊 result.onTimeout(()->{ logger.warn(String.format("璁惧鐐规挱瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId)); WVPResult wvpResult = new WVPResult(); wvpResult.setCode(-1); - SIPDialog dialog = streamSession.getDialog(deviceId, channelId); + SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, streamInfo.getStream()); if (dialog != null) { wvpResult.setMsg("鏀舵祦瓒呮椂锛岃绋嶅�欓噸璇�"); }else { wvpResult.setMsg("鐐规挱瓒呮椂锛岃绋嶅�欓噸璇�"); } + msg.setData(wvpResult); // 鐐规挱瓒呮椂鍥炲BYE - cmder.streamByeCmd(device.getDeviceId(), channelId); + cmder.streamByeCmd(device.getDeviceId(), channelId, streamInfo.getStream()); // 閲婃斁rtpserver - mediaServerService.closeRTPServer(playResult.getDevice(), channelId); + mediaServerService.closeRTPServer(playResult.getDevice(), channelId, streamInfo.getStream()); // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰 resultHolder.invokeAllResult(msg); + // TODO 閲婃斁ssrc }); result.onCompletion(()->{ // 鐐规挱缁撴潫鏃惰皟鐢ㄦ埅鍥炬帴鍙� @@ -134,22 +128,23 @@ classPath = classPath.substring(0, classPath.lastIndexOf("/") + 1); } if (classPath.startsWith("file:")) { - classPath = classPath.substring(classPath.indexOf(":") + 1, classPath.length()); + classPath = classPath.substring(classPath.indexOf(":") + 1); } String path = classPath + "static/static/snap/"; // 鍏煎Windows绯荤粺璺緞锛堝幓闄ゅ墠闈㈢殑鈥�/鈥濓級 if(System.getProperty("os.name").contains("indows")) { - path = path.substring(1, path.length()); + path = path.substring(1); } String fileName = deviceId + "_" + channelId + ".jpg"; ResponseEntity responseEntity = (ResponseEntity)result.getResult(); if (responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) { WVPResult wvpResult = (WVPResult)responseEntity.getBody(); - if (wvpResult.getCode() == 0) { + if (Objects.requireNonNull(wvpResult).getCode() == 0) { StreamInfo streamInfoForSuccess = (StreamInfo)wvpResult.getData(); MediaServerItem mediaInfo = mediaServerService.getOne(streamInfoForSuccess.getMediaServerId()); String streamUrl = streamInfoForSuccess.getFmp4(); // 璇锋眰鎴浘 + logger.info("[璇锋眰鎴浘]: " + fileName); zlmresTfulUtils.getSnap(mediaInfo, streamUrl, 15, 1, path, fileName); } } @@ -158,18 +153,16 @@ } }); if (streamInfo == null) { - SSRCInfo ssrcInfo; String streamId = null; if (mediaServerItem.isRtpEnable()) { streamId = String.format("%s_%s", device.getDeviceId(), channelId); } - ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId); - + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId); // 鍙戦�佺偣鎾秷鎭� cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInUse, JSONObject response) -> { logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); - onPublishHandlerForPlay(mediaServerItemInUse, response, deviceId, channelId, uuid.toString()); + onPublishHandlerForPlay(mediaServerItemInUse, response, deviceId, channelId, uuid); if (hookEvent != null) { hookEvent.response(mediaServerItem, response); } @@ -177,7 +170,7 @@ WVPResult wvpResult = new WVPResult(); wvpResult.setCode(-1); // 鐐规挱杩斿洖sip閿欒 - mediaServerService.closeRTPServer(playResult.getDevice(), channelId); + mediaServerService.closeRTPServer(playResult.getDevice(), channelId, ssrcInfo.getStream()); wvpResult.setMsg(String.format("鐐规挱澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); msg.setData(wvpResult); resultHolder.invokeAllResult(msg); @@ -188,11 +181,11 @@ }); } else { - String streamId = streamInfo.getStreamId(); + String streamId = streamInfo.getStream(); if (streamId == null) { WVPResult wvpResult = new WVPResult(); wvpResult.setCode(-1); - wvpResult.setMsg(String.format("鐐规挱澶辫触锛� redis缂撳瓨streamId绛変簬null")); + wvpResult.setMsg("鐐规挱澶辫触锛� redis缂撳瓨streamId绛変簬null"); msg.setData(wvpResult); resultHolder.invokeAllResult(msg); return playResult; @@ -217,18 +210,16 @@ // TODO 鐐规挱鍓嶆槸鍚﹂噸缃姸鎬� redisCatchStorage.stopPlay(streamInfo); storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); - SSRCInfo ssrcInfo; String streamId2 = null; if (mediaServerItem.isRtpEnable()) { streamId2 = String.format("%s_%s", device.getDeviceId(), channelId); } - ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId2); - + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId2); cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); - onPublishHandlerForPlay(mediaServerItemInuse, response, deviceId, channelId, uuid.toString()); + onPublishHandlerForPlay(mediaServerItemInuse, response, deviceId, channelId, uuid); }, (event) -> { - mediaServerService.closeRTPServer(playResult.getDevice(), channelId); + mediaServerService.closeRTPServer(playResult.getDevice(), channelId, ssrcInfo.getStream()); WVPResult wvpResult = new WVPResult(); wvpResult.setCode(-1); wvpResult.setMsg(String.format("鐐规挱澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); @@ -246,12 +237,12 @@ RequestMessage msg = new RequestMessage(); msg.setId(uuid); msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId); - StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId, uuid); + StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId); if (streamInfo != null) { DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId); if (deviceChannel != null) { - deviceChannel.setStreamId(streamInfo.getStreamId()); - storager.startPlay(deviceId, channelId, streamInfo.getStreamId()); + deviceChannel.setStreamId(streamInfo.getStream()); + storager.startPlay(deviceId, channelId, streamInfo.getStream()); } redisCatchStorage.startPlay(streamInfo); msg.setData(JSON.toJSONString(streamInfo)); @@ -274,7 +265,7 @@ public MediaServerItem getNewMediaServerItem(Device device) { if (device == null) return null; String mediaServerId = device.getMediaServerId(); - MediaServerItem mediaServerItem = null; + MediaServerItem mediaServerItem; if (mediaServerId == null) { mediaServerItem = mediaServerService.getMediaServerForMinimumLoad(); }else { @@ -286,14 +277,57 @@ return mediaServerItem; } + @Override - public void onPublishHandlerForPlayBack(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId, String uuid) { + public DeferredResult<ResponseEntity<String>> playBack(String deviceId, String channelId, String startTime, String endTime, PlayBackCallback callback) { + String uuid = UUID.randomUUID().toString(); + String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId; + DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L); + Device device = storager.queryVideoDevice(deviceId); + if (device == null) { + result.setResult(new ResponseEntity<>(HttpStatus.BAD_REQUEST)); + return result; + } + + MediaServerItem newMediaServerItem = getNewMediaServerItem(device); + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId, uuid, result); RequestMessage msg = new RequestMessage(); - msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId); msg.setId(uuid); - StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId, uuid); - if (streamInfo != null) { + msg.setKey(key); + result.onTimeout(()->{ + msg.setData("鍥炴斁瓒呮椂"); + callback.call(msg); + }); + cmder.playbackStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, (MediaServerItem mediaServerItem, JSONObject response) -> { + logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); + StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId); + if (streamInfo == null) { + logger.warn("璁惧鍥炴斁API璋冪敤澶辫触锛�"); + msg.setData("璁惧鍥炴斁API璋冪敤澶辫触锛�"); + callback.call(msg); + return; + } redisCatchStorage.startPlayback(streamInfo); + msg.setData(JSON.toJSONString(streamInfo)); + callback.call(msg); + }, event -> { + msg.setData(String.format("鍥炴斁澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); + callback.call(msg); + }); + return result; + } + + + + @Override + public void onPublishHandlerForDownload(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, String uuid) { + RequestMessage msg = new RequestMessage(); + msg.setKey(DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId); + msg.setId(uuid); + StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId); + if (streamInfo != null) { + redisCatchStorage.startDownload(streamInfo); msg.setData(JSON.toJSONString(streamInfo)); resultHolder.invokeResult(msg); } else { @@ -303,7 +337,8 @@ } } - public StreamInfo onPublishHandler(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId, String uuid) { + + public StreamInfo onPublishHandler(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId) { String streamId = resonse.getString("stream"); JSONArray tracks = resonse.getJSONArray("tracks"); StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(mediaServerItem,"rtp", streamId, tracks); -- Gitblit v1.8.0