From 24cd9158d418bdacd88d080a2c80ac814be57948 Mon Sep 17 00:00:00 2001 From: Lawrence <1934378145@qq.com> Date: 星期一, 16 十一月 2020 12:39:10 +0800 Subject: [PATCH] 录像回放时同样根据设置决定是否事先取编码信息 --- src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java | 134 +++++++++++++++++++++++++------------------- 1 files changed, 75 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java index 56d1c7b..16713fe 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java @@ -7,6 +7,7 @@ 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.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; @@ -26,29 +27,33 @@ @RestController @RequestMapping("/api") public class PlaybackController { - + private final static Logger logger = LoggerFactory.getLogger(PlaybackController.class); - + @Autowired private SIPCommander cmder; - + @Autowired private IVideoManagerStorager storager; @Autowired private ZLMRESTfulUtils zlmresTfulUtils; + @Value("${media.closeWaitRTPInfo}") + private boolean closeWaitRTPInfo; + @GetMapping("/playback/{deviceId}/{channelId}") - public ResponseEntity<String> play(@PathVariable String deviceId,@PathVariable String channelId, String startTime, String endTime){ - + public ResponseEntity<String> play(@PathVariable String deviceId, @PathVariable String channelId, String startTime, + String endTime) { + if (logger.isDebugEnabled()) { - logger.debug(String.format("璁惧鍥炴斁 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s",deviceId, channelId)); + logger.debug(String.format("璁惧鍥炴斁 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId)); } - + if (StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(channelId)) { - String log = String.format("璁惧鍥炴斁 API璋冪敤澶辫触锛宒eviceId锛�%s 锛宑hannelId锛�%s",deviceId, channelId); + String log = String.format("璁惧鍥炴斁 API璋冪敤澶辫触锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId); logger.warn(log); - return new ResponseEntity<String>(log,HttpStatus.BAD_REQUEST); + return new ResponseEntity<String>(log, HttpStatus.BAD_REQUEST); } Device device = storager.queryVideoDevice(deviceId); @@ -58,20 +63,22 @@ cmder.streamByeCmd(streamInfo.getSsrc()); } -// }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); -// }else { -// storager.stopPlayback(streamInfo); -// streamInfo = cmder.playbackStreamCmd(device, channelId, startTime, endTime); -// } -// } + // }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); + // }else { + // storager.stopPlayback(streamInfo); + // streamInfo = cmder.playbackStreamCmd(device, channelId, startTime, endTime); + // } + // } streamInfo = cmder.playbackStreamCmd(device, channelId, startTime, endTime); String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); - + if (logger.isDebugEnabled()) { logger.debug("璁惧鍥炴斁 API璋冪敤锛宻src锛�" + streamInfo.getSsrc() + ",ZLMedia streamId:" + streamId); } @@ -81,62 +88,71 @@ long lockStartTime = System.currentTimeMillis(); JSONObject rtpInfo = null; - while (lockFlag) { - try { - if (System.currentTimeMillis() - lockStartTime > 75 * 1000) { - storager.stopPlayback(streamInfo); - logger.info("鎾斁绛夊緟瓒呮椂"); - return new ResponseEntity<String>("timeout",HttpStatus.OK); - }else { - streamInfo = storager.queryPlaybackByDevice(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.startPlayback(streamInfo); - }else { - logger.info("娴佺紪鐮佷俊鎭湭鑾峰彇锛�2绉掑悗閲嶈瘯..."); + if (closeWaitRTPInfo) { + String flv = storager.getMediaInfo().getWanIp() + ":" + storager.getMediaInfo().getHttpPort() + "/rtp/" + + streamId + ".flv"; + streamInfo.setFlv("http://" + flv); + streamInfo.setWs_flv("ws://" + flv); + storager.startPlayback(streamInfo); + } else { + while (lockFlag) { + try { + if (System.currentTimeMillis() - lockStartTime > 75 * 1000) { + storager.stopPlayback(streamInfo); + logger.info("鎾斁绛夊緟瓒呮椂"); + return new ResponseEntity<String>("timeout", HttpStatus.OK); + } else { + streamInfo = storager.queryPlaybackByDevice(deviceId, channelId); + if (!rtpPushed) { + logger.info("鏌ヨRTP鎺ㄦ祦淇℃伅..."); + rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); } - }else { - Thread.sleep(2000); - continue; + 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.startPlayback(streamInfo); + } else { + logger.info("娴佺紪鐮佷俊鎭湭鑾峰彇锛�2绉掑悗閲嶈瘯..."); + } + } else { + Thread.sleep(2000); + continue; + } } + } catch (InterruptedException e) { + e.printStackTrace(); } - } catch (InterruptedException e) { - e.printStackTrace(); } } - if(streamInfo!=null) { - return new ResponseEntity<String>(JSON.toJSONString(streamInfo),HttpStatus.OK); + if (streamInfo != null) { + return new ResponseEntity<String>(JSON.toJSONString(streamInfo), HttpStatus.OK); } else { logger.warn("璁惧鍥炴斁API璋冪敤澶辫触锛�"); return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR); } } - + @RequestMapping("/playback/{ssrc}/stop") - public ResponseEntity<String> playStop(@PathVariable String ssrc){ - + public ResponseEntity<String> playStop(@PathVariable String ssrc) { + cmder.streamByeCmd(ssrc); - + if (logger.isDebugEnabled()) { logger.debug(String.format("璁惧褰曞儚鍥炴斁鍋滄 API璋冪敤锛宻src锛�%s", ssrc)); } - - if(ssrc!=null) { + + if (ssrc != null) { JSONObject json = new JSONObject(); json.put("ssrc", ssrc); - return new ResponseEntity<String>(json.toString(),HttpStatus.OK); + return new ResponseEntity<String>(json.toString(), HttpStatus.OK); } else { logger.warn("璁惧褰曞儚鍥炴斁鍋滄API璋冪敤澶辫触锛�"); return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR); -- Gitblit v1.8.0