From bfd1628d5b6e753091b0aa702a520b08cc64cc76 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 21 十二月 2020 15:29:17 +0800
Subject: [PATCH] 修复重复调用open rtp server 的bug 增加对rtp server开启释放的统一管理
---
src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java | 2 +
/dev/null | 56 ----------------------------
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java | 22 ++++++----
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 18 ++++++---
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java | 4 ++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java | 7 +++
6 files changed, 38 insertions(+), 71 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
index 3da654a..46e5945 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -213,4 +213,11 @@
* @param device 瑙嗛璁惧
*/
boolean mobilePostitionQuery(Device device);
+
+ /**
+ * 閲婃斁rtpserver
+ * @param device
+ * @param channelId
+ */
+ void closeRTPServer(Device device, String channelId);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index 097d2b7..7d91d7b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -8,7 +8,6 @@
import javax.sip.Dialog;
import javax.sip.InvalidArgumentException;
import javax.sip.SipException;
-import javax.sip.SipFactory;
import javax.sip.SipProvider;
import javax.sip.TransactionDoesNotExistException;
import javax.sip.address.SipURI;
@@ -16,11 +15,10 @@
import javax.sip.message.Request;
import com.alibaba.fastjson.JSONObject;
-import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.MediaServerConfig;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
-import com.genersoft.iot.vmp.media.zlm.ZLMUtils;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -63,7 +61,7 @@
private SipProvider udpSipProvider;
@Autowired
- private ZLMUtils zlmUtils;
+ private ZLMRTPServerFactory zlmrtpServerFactory;
@Value("${media.rtp.enable}")
private boolean rtpEnable;
@@ -288,7 +286,7 @@
String mediaPort = null;
// 浣跨敤鍔ㄦ�乽dp绔彛
if (rtpEnable) {
- mediaPort = zlmUtils.getNewRTPPort(streamId) + "";
+ mediaPort = zlmrtpServerFactory.createRTPServer(streamId) + "";
}else {
mediaPort = mediaInfo.getRtpProxyPort();
}
@@ -383,7 +381,7 @@
String mediaPort = null;
// 浣跨敤鍔ㄦ�乽dp绔彛
if (rtpEnable) {
- mediaPort = zlmUtils.getNewRTPPort(streamId) + "";
+ mediaPort = zlmrtpServerFactory.createRTPServer(streamId) + "";
}else {
mediaPort = mediaInfo.getRtpProxyPort();
}
@@ -459,6 +457,7 @@
}
dialog.sendRequest(clientTransaction);
streamSession.remove(streamId);
+ zlmrtpServerFactory.closeRTPServer(streamId);
} catch (TransactionDoesNotExistException e) {
e.printStackTrace();
} catch (SipException e) {
@@ -701,4 +700,11 @@
}
+ @Override
+ public void closeRTPServer(Device device, String channelId) {
+ if (rtpEnable) {
+ String streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
+ zlmrtpServerFactory.closeRTPServer(streamId);
+ }
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
index 1e38bdc..ac1f51a 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
@@ -116,4 +116,8 @@
public JSONObject openRtpServer(Map<String, Object> param){
return sendPost("openRtpServer",param);
}
+
+ public JSONObject closeRtpServer(Map<String, Object> param) {
+ return sendPost("closeRtpServer",param);
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java
deleted file mode 100644
index 132e1e1..0000000
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.genersoft.iot.vmp.media.zlm;
-
-import com.alibaba.fastjson.JSONObject;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@Component
-public class ZLMUtils {
-
- @Value("${media.rtp.udpPortRange}")
- private String udpPortRange;
-
- @Autowired
- private ZLMRESTfulUtils zlmresTfulUtils;
-
- private int[] udpPortRangeArray = new int[2];
-
- private int currentPort = 0;
-
- public int getNewRTPPort(String streamId) {
-// String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
- Map<String, Object> param = new HashMap<>();
- int newPort = getPortFromUdpPortRange();
- param.put("port", newPort);
- param.put("enable_tcp", 1);
- param.put("stream_id", streamId);
- JSONObject jsonObject = zlmresTfulUtils.openRtpServer(param);
- if (jsonObject != null && jsonObject.getInteger("code") == 0) {
- return newPort;
- } else {
- return getNewRTPPort(streamId);
- }
- }
-
- private int getPortFromUdpPortRange() {
- if (currentPort == 0) {
- String[] udpPortRangeStrArray = udpPortRange.split(",");
- udpPortRangeArray[0] = Integer.parseInt(udpPortRangeStrArray[0]);
- udpPortRangeArray[1] = Integer.parseInt(udpPortRangeStrArray[1]);
- }
-
- if (currentPort == 0 || currentPort++ > udpPortRangeArray[1]) {
- currentPort = udpPortRangeArray[0];
- return udpPortRangeArray[0];
- } else {
- if (currentPort % 2 == 1) {
- currentPort++;
- }
- return currentPort++;
- }
- }
-}
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 3da666a..ce907e8 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
@@ -7,6 +7,7 @@
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.vmanager.service.IPlayService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,14 +63,7 @@
UUID uuid = UUID.randomUUID();
DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
- // 瓒呮椂澶勭悊
- result.onTimeout(()->{
- logger.warn(String.format("璁惧鐐规挱瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId));
- RequestMessage msg = new RequestMessage();
- msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
- msg.setData("Timeout");
- resultHolder.invokeResult(msg);
- });
+
// 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ
resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid, result);
@@ -89,13 +83,23 @@
resultHolder.invokeResult(msg);
} else {
storager.stopPlay(streamInfo);
- // TODO playStreamCmd 瓒呮椂澶勭悊
cmder.playStreamCmd(device, channelId, (JSONObject response) -> {
logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString());
playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString());
});
}
}
+
+ // 瓒呮椂澶勭悊
+ result.onTimeout(()->{
+ logger.warn(String.format("璁惧鐐规挱瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId));
+ // 閲婃斁rtpserver
+ cmder.closeRTPServer(device, channelId);
+ RequestMessage msg = new RequestMessage();
+ msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
+ msg.setData("Timeout");
+ resultHolder.invokeResult(msg);
+ });
return result;
}
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 5964e99..6ef3a5f 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/ApiStreamController.java
@@ -86,6 +86,8 @@
JSONObject result = new JSONObject();
result.put("error","timeout");
resultDeferredResult.setResult(result);
+
+ // 娓呯悊RTP server
});
DeviceChannel deviceChannel = storager.queryChannel(serial, code);
--
Gitblit v1.8.0