Просмотр исходного кода

改正并优化查询RTP流信息的流程

Lawrence 5 лет назад
Родитель
Сommit
37e97a782c

+ 40 - 32
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<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 @@ 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<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 @@ 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<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);

+ 20 - 9
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<String>(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<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();