From 2f108a46d05e34981d52b447d73f0cfd8e8c30fd Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 17 十一月 2021 16:24:31 +0800
Subject: [PATCH] Merge pull request #232 from chenparty/wvp-28181-2.0
---
src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java | 171 ++++++++++++++++----------------------------------------
1 files changed, 50 insertions(+), 121 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java
index 76df0d2..ae7e921 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java
@@ -1,26 +1,25 @@
package com.genersoft.iot.vmp.web;
import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
-import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
-import com.genersoft.iot.vmp.vmanager.play.PlayController;
+import com.genersoft.iot.vmp.vmanager.gb28181.play.PlayController;
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.web.bind.annotation.*;
+import org.springframework.web.context.request.async.DeferredResult;
/**
- * 鍏煎LiveGBS鐨凙PI锛氬疄鏃剁洿鎾�
+ * API鍏煎锛氬疄鏃剁洿鎾�
*/
+@SuppressWarnings(value = {"rawtypes", "unchecked"})
@CrossOrigin
@RestController
@RequestMapping(value = "/api/v1/stream")
@@ -34,12 +33,16 @@
@Autowired
private IVideoManagerStorager storager;
- @Value("${media.closeWaitRTPInfo}")
- private boolean closeWaitRTPInfo;
+ @Autowired
+ private IRedisCatchStorage redisCatchStorage;
+
+
+ // @Autowired
+ // private ZLMRESTfulUtils zlmresTfulUtils;
@Autowired
- private ZLMRESTfulUtils zlmresTfulUtils;
+ private PlayController playController;
/**
* 瀹炴椂鐩存挱 - 寮�濮嬬洿鎾�
@@ -55,132 +58,60 @@
* @return
*/
@RequestMapping(value = "/start")
- private JSONObject start(String serial ,
- @RequestParam(required = false)Integer channel ,
- @RequestParam(required = false)String code,
- @RequestParam(required = false)String cdn,
- @RequestParam(required = false)String audio,
- @RequestParam(required = false)String transport,
- @RequestParam(required = false)String checkchannelstatus ,
- @RequestParam(required = false)String transportmode,
- @RequestParam(required = false)String timeout
+ private DeferredResult<JSONObject> start(String serial ,
+ @RequestParam(required = false)Integer channel ,
+ @RequestParam(required = false)String code,
+ @RequestParam(required = false)String cdn,
+ @RequestParam(required = false)String audio,
+ @RequestParam(required = false)String transport,
+ @RequestParam(required = false)String checkchannelstatus ,
+ @RequestParam(required = false)String transportmode,
+ @RequestParam(required = false)String timeout
){
- int getEncoding = closeWaitRTPInfo? 1: 0;
+ DeferredResult<JSONObject> resultDeferredResult = new DeferredResult<JSONObject>();
Device device = storager.queryVideoDevice(serial);
-
if (device == null ) {
JSONObject result = new JSONObject();
result.put("error","device[ " + serial + " ]鏈壘鍒�");
- return result;
+ resultDeferredResult.setResult(result);
}else if (device.getOnline() == 0) {
JSONObject result = new JSONObject();
result.put("error","device[ " + code + " ]offline");
- return result;
+ resultDeferredResult.setResult(result);
}
+ resultDeferredResult.onTimeout(()->{
+ logger.info("鎾斁绛夊緟瓒呮椂");
+ JSONObject result = new JSONObject();
+ result.put("error","timeout");
+ resultDeferredResult.setResult(result);
+
+ // 娓呯悊RTP server
+ });
DeviceChannel deviceChannel = storager.queryChannel(serial, code);
if (deviceChannel == null) {
JSONObject result = new JSONObject();
result.put("error","channel[ " + code + " ]鏈壘鍒�");
- return result;
+ resultDeferredResult.setResult(result);
}else if (deviceChannel.getStatus() == 0) {
JSONObject result = new JSONObject();
result.put("error","channel[ " + code + " ]offline");
- return result;
+ resultDeferredResult.setResult(result);
}
+ DeferredResult<ResponseEntity<String>> play = playController.play(serial, code);
- // 鏌ヨ鏄惁宸茬粡鍦ㄦ挱鏀�
- StreamInfo streamInfo = storager.queryPlayByDevice(device.getDeviceId(), code);
- if (streamInfo == null) {
- logger.debug("streamInfo 绛変簬null, 閲嶆柊鐐规挱");
- streamInfo = cmder.playStreamCmd(device, code);
- }else {
- logger.debug("streamInfo 涓嶇瓑浜巒ull, 鍚戞祦濯掍綋鏌ヨ鏄惁姝e湪鎺ㄦ祦");
- String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase();
- JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId);
- if (rtpInfo.getBoolean("exist")) {
- logger.debug("鍚戞祦濯掍綋鏌ヨ姝e湪鎺ㄦ祦, 鐩存帴杩斿洖: " + streamInfo.getRtsp());
- JSONObject result = new JSONObject();
- result.put("StreamID", streamInfo.getSsrc());
- result.put("DeviceID", device.getDeviceId());
- result.put("ChannelID", code);
- result.put("ChannelName", deviceChannel.getName());
- result.put("ChannelCustomName ", "");
- result.put("FLV ", streamInfo.getFlv());
- result.put("WS_FLV ", streamInfo.getWs_flv());
- result.put("RTMP", streamInfo.getRtmp());
- result.put("HLS", streamInfo.getHls());
- result.put("RTSP", streamInfo.getRtsp());
- result.put("CDN", "");
- result.put("SnapURL", "");
- result.put("Transport", device.getTransport());
- result.put("StartAt", "");
- result.put("Duration", "");
- result.put("SourceVideoCodecName", "");
- result.put("SourceVideoWidth", "");
- result.put("SourceVideoHeight", "");
- result.put("SourceVideoFrameRate", "");
- result.put("SourceAudioCodecName", "");
- result.put("SourceAudioSampleRate", "");
- result.put("AudioEnable", "");
- result.put("Ondemand", "");
- result.put("InBytes", "");
- result.put("InBitRate", "");
- result.put("OutBytes", "");
- result.put("NumOutputs", "");
- result.put("CascadeSize", "");
- result.put("RelaySize", "");
- result.put("ChannelPTZType", 0);
- return result;
- } else {
- logger.debug("鍚戞祦濯掍綋鏌ヨ娌℃湁鎺ㄦ祦, 閲嶆柊鐐规挱");
- storager.stopPlay(streamInfo);
- streamInfo = cmder.playStreamCmd(device, code);
- }
- }
-
- if (logger.isDebugEnabled()) {
- logger.debug(String.format("璁惧棰勮 API璋冪敤锛宒eviceId锛�%s 锛宑hannelId锛�%s",serial, code));
- logger.debug("璁惧棰勮 API璋冪敤锛宻src锛�"+streamInfo.getSsrc()+",ZLMedia streamId:"+Integer.toHexString(Integer.parseInt(streamInfo.getSsrc())));
- }
- boolean lockFlag = true;
- long startTime = System.currentTimeMillis();
- while (lockFlag) {
- try {
- if (System.currentTimeMillis() - startTime > 10 * 1000) {
- storager.stopPlay(streamInfo);
- logger.info("鎾斁绛夊緟瓒呮椂");
- JSONObject result = new JSONObject();
- result.put("error","timeout");
- return result;
- } else {
-
- StreamInfo streamInfoNow = storager.queryPlayByDevice(serial, code);
- logger.debug("姝e湪鍚戞祦濯掍綋鏌ヨ");
- if (streamInfoNow != null && streamInfoNow.getFlv() != null) {
- streamInfo = streamInfoNow;
- logger.debug("鍚戞祦濯掍綋鏌ヨ鍒�: " + streamInfoNow.getRtsp());
- lockFlag = false;
- continue;
- } else {
- Thread.sleep(2000);
- continue;
- }
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- if(streamInfo!=null) {
+ play.setResultHandler((Object o)->{
+ ResponseEntity<String> responseEntity = (ResponseEntity)o;
+ StreamInfo streamInfo = JSON.parseObject(responseEntity.getBody(), StreamInfo.class);
JSONObject result = new JSONObject();
- result.put("StreamID", streamInfo.getSsrc());
+ result.put("StreamID", streamInfo.getStreamId());
result.put("DeviceID", device.getDeviceId());
result.put("ChannelID", code);
result.put("ChannelName", deviceChannel.getName());
- result.put("ChannelCustomName ", "");
- result.put("FLV ", streamInfo.getFlv());
- result.put("WS_FLV ", streamInfo.getWs_flv());
+ result.put("ChannelCustomName", "");
+ result.put("FLV", streamInfo.getFlv());
+ result.put("WS_FLV", streamInfo.getWs_flv());
result.put("RTMP", streamInfo.getRtmp());
result.put("HLS", streamInfo.getHls());
result.put("RTSP", streamInfo.getRtsp());
@@ -204,13 +135,9 @@
result.put("CascadeSize", "");
result.put("RelaySize", "");
result.put("ChannelPTZType", 0);
- return result;
- } else {
- logger.warn("璁惧棰勮API璋冪敤澶辫触锛�");
- JSONObject result = new JSONObject();
- result.put("error","璋冪敤澶辫触");
- return result;
- }
+ resultDeferredResult.setResult(result);
+ });
+ return resultDeferredResult;
}
/**
@@ -229,14 +156,16 @@
@RequestParam(required = false)String check_outputs
){
- StreamInfo streamInfo = storager.queryPlayByDevice(serial, code);
+
+ StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(serial, code);
if (streamInfo == null) {
JSONObject result = new JSONObject();
result.put("error","鏈壘鍒版祦淇℃伅");
return result;
}
- cmder.streamByeCmd(streamInfo.getSsrc());
- storager.stopPlay(streamInfo);
+ cmder.streamByeCmd(serial, code);
+ redisCatchStorage.stopPlay(streamInfo);
+ storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
return null;
}
--
Gitblit v1.8.0