Lawrence
2020-10-29 37e97a782c43f658a5bfee7ac1df31bb86d9b955
改正并优化查询RTP流信息的流程
2个文件已修改
101 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
@@ -26,32 +26,32 @@
@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<String> play(@PathVariable String deviceId,@PathVariable String channelId){
    public ResponseEntity<String> 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<String>(JSON.toJSONString(streamInfo),HttpStatus.OK);
            }else {
                return new ResponseEntity<String>(JSON.toJSONString(streamInfo), HttpStatus.OK);
            } else {
                storager.stopPlay(streamInfo);
                streamInfo = cmder.playStreamCmd(device, channelId);
            }
@@ -60,34 +60,40 @@
        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<String>("timeout",HttpStatus.OK);
                }else {
                    return new ResponseEntity<String>("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 @@
        }
        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<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);
        }
    }
    @PostMapping("/play/{ssrc}/stop")
    public ResponseEntity<String> playStop(@PathVariable String ssrc){
    public ResponseEntity<String> playStop(@PathVariable String ssrc) {
        cmder.streamByeCmd(ssrc);
        StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc);
        if (streamInfo == null) return new ResponseEntity<String>(HttpStatus.PAYMENT_REQUIRED);
        if (streamInfo == null)
            return new ResponseEntity<String>(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<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);
src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java
@@ -52,7 +52,7 @@
        }
        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 @@
//            if (rtpInfo.getBoolean("exist")) {
//                return new ResponseEntity<String>(JSON.toJSONString(streamInfo),HttpStatus.OK);
//            }else {
//                storager.stopPlayBlack(streamInfo);
//                storager.stopPlayback(streamInfo);
//                streamInfo = cmder.playbackStreamCmd(device, channelId, startTime, endTime);
//            }
//        }
@@ -77,29 +77,40 @@
        }
        // 等待推流, 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<String>("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();