From 37e97a782c43f658a5bfee7ac1df31bb86d9b955 Mon Sep 17 00:00:00 2001 From: Lawrence <1934378145@qq.com> Date: Thu, 29 Oct 2020 10:21:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E6=AD=A3=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2RTP=E6=B5=81=E4=BF=A1=E6=81=AF=E7=9A=84?= =?UTF-8?q?=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/vmanager/play/PlayController.java | 72 ++++++++++--------- .../vmanager/playback/PlaybackController.java | 29 +++++--- 2 files changed, 60 insertions(+), 41 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 64fb8f8c..00f268c3 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 @@ -26,32 +26,32 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorager; @RestController @RequestMapping("/api") public class PlayController { - + private final static Logger logger = LoggerFactory.getLogger(PlayController.class); - + @Autowired private SIPCommander cmder; - + @Autowired private IVideoManagerStorager storager; @Autowired private ZLMRESTfulUtils zlmresTfulUtils; - + @GetMapping("/play/{deviceId}/{channelId}") - public ResponseEntity play(@PathVariable String deviceId,@PathVariable String channelId){ - + public ResponseEntity play(@PathVariable String deviceId, @PathVariable String channelId) { + Device device = storager.queryVideoDevice(deviceId); StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId); if (streamInfo == null) { streamInfo = cmder.playStreamCmd(device, channelId); - }else { + } else { String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); if (rtpInfo.getBoolean("exist")) { - return new ResponseEntity(JSON.toJSONString(streamInfo),HttpStatus.OK); - }else { + return new ResponseEntity(JSON.toJSONString(streamInfo), HttpStatus.OK); + } else { storager.stopPlay(streamInfo); streamInfo = cmder.playStreamCmd(device, channelId); } @@ -60,34 +60,40 @@ public class PlayController { 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; while (lockFlag) { try { - if (System.currentTimeMillis() - startTime > 30 * 1000) { + if (System.currentTimeMillis() - startTime > 60 * 1000) { storager.stopPlay(streamInfo); logger.info("播放等待超时"); - return new ResponseEntity("timeout",HttpStatus.OK); - }else { + return new ResponseEntity("timeout", HttpStatus.OK); + } else { streamInfo = storager.queryPlayByDevice(deviceId, channelId); - JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); - if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null && streamInfo.getFlv() != null){ - logger.info("RTP已推流,查询编码信息:"+streamInfo.getFlv()); + 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("媒体编码信息已获取"); + logger.info("流编码信息已获取"); JSONArray tracks = mediaInfo.getJSONArray("tracks"); streamInfo.setTracks(tracks); storager.startPlay(streamInfo); - }else { - logger.info("媒体编码信息未获取,2秒后重试..."); + } else { + logger.info("流编码信息未获取,2秒后重试..."); } - }else { + } else { Thread.sleep(2000); continue; - }; + } } } catch (InterruptedException e) { e.printStackTrace(); @@ -95,33 +101,35 @@ public class PlayController { } if (logger.isDebugEnabled()) { - logger.debug(String.format("设备预览 API调用,deviceId:%s ,channelId:%s",deviceId, channelId)); - logger.debug("设备预览 API调用,ssrc:"+streamInfo.getSsrc()+",ZLMedia streamId:"+Integer.toHexString(Integer.parseInt(streamInfo.getSsrc()))); + logger.debug(String.format("设备预览 API调用,deviceId:%s ,channelId:%s", deviceId, channelId)); + logger.debug("设备预览 API调用,ssrc:" + streamInfo.getSsrc() + ",ZLMedia streamId:" + + Integer.toHexString(Integer.parseInt(streamInfo.getSsrc()))); } - - if(streamInfo!=null) { - return new ResponseEntity(JSON.toJSONString(streamInfo),HttpStatus.OK); + + if (streamInfo != null) { + return new ResponseEntity(JSON.toJSONString(streamInfo), HttpStatus.OK); } else { logger.warn("设备预览API调用失败!"); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); } } - + @PostMapping("/play/{ssrc}/stop") - public ResponseEntity playStop(@PathVariable String ssrc){ - + public ResponseEntity playStop(@PathVariable String ssrc) { + cmder.streamByeCmd(ssrc); StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc); - if (streamInfo == null) return new ResponseEntity(HttpStatus.PAYMENT_REQUIRED); + if (streamInfo == null) + return new ResponseEntity(HttpStatus.PAYMENT_REQUIRED); storager.stopPlay(streamInfo); if (logger.isDebugEnabled()) { logger.debug(String.format("设备预览停止API调用,ssrc:%s", ssrc)); } - - if(ssrc!=null) { + + if (ssrc != null) { JSONObject json = new JSONObject(); json.put("ssrc", ssrc); - return new ResponseEntity(json.toString(),HttpStatus.OK); + return new ResponseEntity(json.toString(), HttpStatus.OK); } else { logger.warn("设备预览停止API调用失败!"); return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); 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 e53cbbf2..56d1c7bd 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 @@ -52,7 +52,7 @@ public class PlaybackController { } Device device = storager.queryVideoDevice(deviceId); - StreamInfo streamInfo = storager.queryPlayBlackByDevice(deviceId, channelId); + StreamInfo streamInfo = storager.queryPlaybackByDevice(deviceId, channelId); if (streamInfo != null) { cmder.streamByeCmd(streamInfo.getSsrc()); @@ -64,7 +64,7 @@ public class PlaybackController { // if (rtpInfo.getBoolean("exist")) { // return new ResponseEntity(JSON.toJSONString(streamInfo),HttpStatus.OK); // }else { -// storager.stopPlayBlack(streamInfo); +// storager.stopPlayback(streamInfo); // streamInfo = cmder.playbackStreamCmd(device, channelId, startTime, endTime); // } // } @@ -77,29 +77,40 @@ public class PlaybackController { } // 等待推流, TODO 默认超时15s boolean lockFlag = true; + boolean rtpPushed = false; long lockStartTime = System.currentTimeMillis(); + JSONObject rtpInfo = null; + while (lockFlag) { try { if (System.currentTimeMillis() - lockStartTime > 75 * 1000) { - storager.stopPlayBlack(streamInfo); + storager.stopPlayback(streamInfo); + logger.info("播放等待超时"); return new ResponseEntity("timeout",HttpStatus.OK); }else { - streamInfo = storager.queryPlayBlackByDevice(deviceId, channelId); - JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); - if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo.getFlv() != null){ + 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.startPlayBlack(streamInfo); + storager.startPlayback(streamInfo); }else { - + logger.info("流编码信息未获取,2秒后重试..."); } }else { Thread.sleep(2000); continue; - }; + } } } catch (InterruptedException e) { e.printStackTrace();