From 44d216100b45c3337c593ee82ee68e7e0f35d24b Mon Sep 17 00:00:00 2001 From: Lawrence <1934378145@qq.com> Date: 星期三, 16 十二月 2020 20:29:19 +0800 Subject: [PATCH] 与master分支同步 --- src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java | 137 +++++++++++++++++++-------------------------- 1 files changed, 59 insertions(+), 78 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java index 300ffc3..e741b5a 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java @@ -4,7 +4,10 @@ import com.alibaba.fastjson.JSONArray; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.MediaServerConfig; +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; +import com.genersoft.iot.vmp.vmanager.service.IPlayService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +25,10 @@ import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import org.springframework.web.context.request.async.DeferredResult; + +import java.text.DecimalFormat; +import java.util.UUID; @CrossOrigin @RestController @@ -39,94 +46,57 @@ @Autowired private ZLMRESTfulUtils zlmresTfulUtils; - @Value("${media.closeWaitRTPInfo}") - private boolean closeWaitRTPInfo; + @Autowired + private DeferredResultHolder resultHolder; + + @Autowired + private IPlayService playService; @GetMapping("/play/{deviceId}/{channelId}") - public ResponseEntity<String> play(@PathVariable String deviceId, @PathVariable String channelId, - Integer getEncoding) { + public DeferredResult<ResponseEntity<String>> play(@PathVariable String deviceId, + @PathVariable String channelId) { - if (getEncoding == null) getEncoding = 0; - getEncoding = closeWaitRTPInfo ? 0 : getEncoding; + Device device = storager.queryVideoDevice(deviceId); StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId); + UUID uuid = UUID.randomUUID(); + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(); + // 瓒呮椂澶勭悊 + result.onTimeout(()->{ + logger.warn(String.format("璁惧鐐规挱瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId)); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid); + msg.setData("Timeout"); + resultHolder.invokeResult(msg); + }); + // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ + resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid, result); + if (streamInfo == null) { - streamInfo = cmder.playStreamCmd(device, channelId); + // 鍙戦�佺偣鎾秷鎭� + cmder.playStreamCmd(device, channelId, (JSONObject response) -> { + logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); + playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString()); + }); } else { String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); if (rtpInfo.getBoolean("exist")) { - return new ResponseEntity<String>(JSON.toJSONString(streamInfo), HttpStatus.OK); + RequestMessage msg = new RequestMessage(); + msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid); + msg.setData(JSON.toJSONString(streamInfo)); + resultHolder.invokeResult(msg); } else { storager.stopPlay(streamInfo); - streamInfo = cmder.playStreamCmd(device, channelId); + // TODO playStreamCmd 瓒呮椂澶勭悊 + cmder.playStreamCmd(device, channelId, (JSONObject response) -> { + logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString()); + playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString()); + }); } } - String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); - // 绛夊緟鎺ㄦ祦, TODO 榛樿瓒呮椂30s - boolean lockFlag = true; - boolean rtpPushed = false; - long startTime = System.currentTimeMillis(); - JSONObject rtpInfo = null; - - if (getEncoding == 1) { - while (lockFlag) { - try { - if (System.currentTimeMillis() - startTime > 60 * 1000) { - storager.stopPlay(streamInfo); - logger.info("鎾斁绛夊緟瓒呮椂"); - return new ResponseEntity<String>("timeout", HttpStatus.OK); - } else { - streamInfo = storager.queryPlayByDevice(deviceId, channelId); - if (!rtpPushed) { - logger.info("鏌ヨRTP鎺ㄦ祦淇℃伅..."); - rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); - } - if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null - && streamInfo.getFlv() != null) { - logger.info("鏌ヨ娴佺紪鐮佷俊鎭細" + streamInfo.getFlv()); - rtpPushed = true; - Thread.sleep(2000); - JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId); - if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) { - lockFlag = false; - logger.info("娴佺紪鐮佷俊鎭凡鑾峰彇"); - JSONArray tracks = mediaInfo.getJSONArray("tracks"); - streamInfo.setTracks(tracks); - storager.startPlay(streamInfo); - } else { - logger.info("娴佺紪鐮佷俊鎭湭鑾峰彇锛�2绉掑悗閲嶈瘯..."); - } - } else { - Thread.sleep(2000); - continue; - } - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } else { - String flv = storager.getMediaInfo().getWanIp() + ":" + storager.getMediaInfo().getHttpPort() + "/rtp/" - + streamId + ".flv"; - streamInfo.setFlv("http://" + flv); - streamInfo.setWs_flv("ws://" + flv); - storager.startPlay(streamInfo); - } - - if (logger.isDebugEnabled()) { - logger.debug(String.format("璁惧棰勮 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId)); - logger.debug("璁惧棰勮 API璋冪敤锛宻src锛�" + streamInfo.getSsrc() + ",ZLMedia streamId:" - + Integer.toHexString(Integer.parseInt(streamInfo.getSsrc()))); - } - - if (streamInfo != null) { - return new ResponseEntity<String>(JSON.toJSONString(streamInfo), HttpStatus.OK); - } else { - logger.warn("璁惧棰勮API璋冪敤澶辫触锛�"); - return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR); - } + return result; } @PostMapping("/play/{ssrc}/stop") @@ -172,17 +142,28 @@ MediaServerConfig mediaInfo = storager.getMediaInfo(); String dstUrl = String.format("rtmp://%s:%s/convert/%s", "127.0.0.1", mediaInfo.getRtmpPort(), streamId ); - JSONObject jsonObject = zlmresTfulUtils.addFFmpegSource(streamInfo.getRtsp(), dstUrl, "1000000"); + String srcUrl = String.format("rtsp://%s:%s/rtp/%s", "127.0.0.1", mediaInfo.getRtspPort(), streamId); + JSONObject jsonObject = zlmresTfulUtils.addFFmpegSource(srcUrl, dstUrl, "1000000"); System.out.println(jsonObject); JSONObject result = new JSONObject(); if (jsonObject != null && jsonObject.getInteger("code") == 0) { result.put("code", 0); JSONObject data = jsonObject.getJSONObject("data"); if (data != null) { - result.put("key", data.getString("key")); - result.put("rtmp", dstUrl); - result.put("flv", String.format("http://%s:%s/convert/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); - result.put("ws_flv", String.format("ws://%s:%s/convert/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + result.put("key", data.getString("key")); + StreamInfo streamInfoResult = new StreamInfo(); + streamInfoResult.setRtmp(dstUrl); + streamInfoResult.setRtsp(String.format("rtsp://%s:%s/convert/%s", mediaInfo.getWanIp(), mediaInfo.getRtspPort(), streamId)); + streamInfoResult.setStreamId(streamId); + streamInfoResult.setFlv(String.format("http://%s:%s/convert/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + streamInfoResult.setWs_flv(String.format("ws://%s:%s/convert/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + streamInfoResult.setHls(String.format("http://%s:%s/convert/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + streamInfoResult.setWs_hls(String.format("ws://%s:%s/convert/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + streamInfoResult.setFmp4(String.format("http://%s:%s/convert/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + streamInfoResult.setWs_fmp4(String.format("ws://%s:%s/convert/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + streamInfoResult.setTs(String.format("http://%s:%s/convert/%s.live.ts", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + streamInfoResult.setWs_ts(String.format("ws://%s:%s/convert/%s.live.ts", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), streamId)); + result.put("data", streamInfoResult); } }else { result.put("code", 1); -- Gitblit v1.8.0