|
|
@@ -228,7 +228,7 @@ public class ZLMRTPServerFactory {
|
|
|
int localPort = 0;
|
|
|
if (userSetting.getGbSendStreamStrict()) {
|
|
|
if (userSetting.getGbSendStreamStrict()) {
|
|
|
- localPort = keepPort(serverItem, ssrc);
|
|
|
+ localPort = keepPort(serverItem, ssrc, null);
|
|
|
if (localPort == 0) {
|
|
|
return null;
|
|
|
}
|
|
|
@@ -264,7 +264,7 @@ public class ZLMRTPServerFactory {
|
|
|
// 默认为随机端口
|
|
|
int localPort = 0;
|
|
|
if (userSetting.getGbSendStreamStrict()) {
|
|
|
- localPort = keepPort(serverItem, ssrc);
|
|
|
+ localPort = keepPort(serverItem, ssrc, null);
|
|
|
if (localPort == 0) {
|
|
|
return null;
|
|
|
}
|
|
|
@@ -288,23 +288,28 @@ public class ZLMRTPServerFactory {
|
|
|
/**
|
|
|
* 保持端口,直到需要需要发流时再释放
|
|
|
*/
|
|
|
- public int keepPort(MediaServerItem serverItem, String ssrc) {
|
|
|
- int localPort = 0;
|
|
|
+ public int keepPort(MediaServerItem serverItem, String ssrc, Integer localPort) {
|
|
|
Map<String, Object> param = new HashMap<>(3);
|
|
|
- param.put("port", 0);
|
|
|
+ if (localPort == null) {
|
|
|
+ localPort = 0;
|
|
|
+ }
|
|
|
+ param.put("port", localPort);
|
|
|
param.put("enable_tcp", 1);
|
|
|
param.put("stream_id", ssrc);
|
|
|
JSONObject jsonObject = zlmresTfulUtils.openRtpServer(serverItem, param);
|
|
|
if (jsonObject.getInteger("code") == 0) {
|
|
|
localPort = jsonObject.getInteger("port");
|
|
|
HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(ssrc, null, serverItem.getId());
|
|
|
+ Integer finalLocalPort = localPort;
|
|
|
hookSubscribe.addSubscribe(hookSubscribeForRtpServerTimeout,
|
|
|
(MediaServerItem mediaServerItem, JSONObject response)->{
|
|
|
- logger.info("[上级点播] {}->监听端口到期继续保持监听", ssrc);
|
|
|
- int port = keepPort(serverItem, ssrc);
|
|
|
- if (port == 0) {
|
|
|
- logger.info("[上级点播] {}->监听端口失败,移除监听", ssrc);
|
|
|
- hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout);
|
|
|
+ if (ssrc.equals(response.getString("ssrc"))) {
|
|
|
+ logger.info("[上级点播] {}->监听端口到期继续保持监听", ssrc);
|
|
|
+ int port = keepPort(serverItem, ssrc, finalLocalPort);
|
|
|
+ if (port == 0) {
|
|
|
+ logger.info("[上级点播] {}->监听端口失败,移除监听", ssrc);
|
|
|
+ hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout);
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
logger.info("[保持端口] {}->监听端口: {}", ssrc, localPort);
|