From 33b51c40ddd9750a19b2c6a6618fb22386f87cd7 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 13 十一月 2020 18:12:21 +0800 Subject: [PATCH] 增加强制不查询编码信息配置 --- src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 100 insertions(+), 5 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 20078a7..56d1c7b 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 @@ -1,12 +1,19 @@ package com.genersoft.iot.vmp.vmanager.playback; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,6 +22,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +@CrossOrigin @RestController @RequestMapping("/api") public class PlaybackController { @@ -26,16 +34,103 @@ @Autowired private IVideoManagerStorager storager; - + + @Autowired + private ZLMRESTfulUtils zlmresTfulUtils; + @GetMapping("/playback/{deviceId}/{channelId}") 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)); + } + + if (StringUtils.isEmpty(deviceId) || StringUtils.isEmpty(channelId)) { + String log = String.format("璁惧鍥炴斁 API璋冪敤澶辫触锛宒eviceId锛�%s 锛宑hannelId锛�%s",deviceId, channelId); + logger.warn(log); + return new ResponseEntity<String>(log,HttpStatus.BAD_REQUEST); + } + Device device = storager.queryVideoDevice(deviceId); - String ssrc = cmder.playbackStreamCmd(device, channelId, startTime, endTime); + StreamInfo streamInfo = storager.queryPlaybackByDevice(deviceId, channelId); + + if (streamInfo != null) { + 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); +// } +// } + streamInfo = cmder.playbackStreamCmd(device, channelId, startTime, endTime); + + String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); if (logger.isDebugEnabled()) { - logger.debug(String.format("璁惧棰勮 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s",deviceId, channelId)); - logger.debug("璁惧棰勮 API璋冪敤锛宻src锛�"+ssrc+",ZLMedia streamId:"+Integer.toHexString(Integer.parseInt(ssrc))); + logger.debug("璁惧鍥炴斁 API璋冪敤锛宻src锛�" + streamInfo.getSsrc() + ",ZLMedia streamId:" + streamId); + } + // 绛夊緟鎺ㄦ祦, 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.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绉掑悗閲嶈瘯..."); + } + }else { + Thread.sleep(2000); + continue; + } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + 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){ + + cmder.streamByeCmd(ssrc); + + if (logger.isDebugEnabled()) { + logger.debug(String.format("璁惧褰曞儚鍥炴斁鍋滄 API璋冪敤锛宻src锛�%s", ssrc)); } if(ssrc!=null) { @@ -43,7 +138,7 @@ json.put("ssrc", ssrc); return new ResponseEntity<String>(json.toString(),HttpStatus.OK); } else { - logger.warn("璁惧棰勮API璋冪敤澶辫触锛�"); + logger.warn("璁惧褰曞儚鍥炴斁鍋滄API璋冪敤澶辫触锛�"); return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR); } } -- Gitblit v1.8.0