From b64f32080537840cfd772d14dfc1df1ccddc4330 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 01 七月 2023 18:10:33 +0800
Subject: [PATCH] 优化发流逻辑

---
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java |  137 +++------------------------------------------
 1 files changed, 10 insertions(+), 127 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
index c1b42f8..1d25697 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -1,22 +1,18 @@
 package com.genersoft.iot.vmp.media.zlm;
 
 import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.genersoft.iot.vmp.common.CommonCallback;
 import com.genersoft.iot.vmp.conf.UserSetting;
 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
-import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
-import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForRtpServerTimeout;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam;
-import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRtpServerTimeoutHookParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
 
 @Component
 public class ZLMRTPServerFactory {
@@ -32,68 +28,9 @@
     @Autowired
     private ZlmHttpHookSubscribe hookSubscribe;
 
-    private int[] portRangeArray = new int[2];
+    @Autowired
+    private SendRtpPortManager sendRtpPortManager;
 
-    public int getFreePort(MediaServerItem mediaServerItem, int startPort, int endPort, List<Integer> usedFreelist) {
-        if (endPort <= startPort) {
-            return -1;
-        }
-        if (usedFreelist == null) {
-            usedFreelist = new ArrayList<>();
-        }
-        JSONObject listRtpServerJsonResult = zlmresTfulUtils.listRtpServer(mediaServerItem);
-        if (listRtpServerJsonResult != null) {
-            JSONArray data = listRtpServerJsonResult.getJSONArray("data");
-            if (data != null) {
-                for (int i = 0; i < data.size(); i++) {
-                    JSONObject dataItem = data.getJSONObject(i);
-                    usedFreelist.add(dataItem.getInteger("port"));
-                }
-            }
-        }
-
-        Map<String, Object> param = new HashMap<>();
-        int result = -1;
-        // 璁剧疆鎺ㄦ祦绔彛
-        if (startPort%2 == 1) {
-            startPort ++;
-        }
-        boolean checkPort = false;
-        for (int i = startPort; i < endPort  + 1; i+=2) {
-            if (!usedFreelist.contains(i)){
-                checkPort = true;
-                startPort = i;
-                break;
-            }
-        }
-        if (!checkPort) {
-            logger.warn("鏈壘鍒拌妭鐐箋}涓婅寖鍥碵{}-{}]鐨勭┖闂茬鍙�", mediaServerItem.getId(), startPort, endPort);
-            return -1;
-        }
-        param.put("port", startPort);
-        String stream = UUID.randomUUID().toString();
-        param.put("enable_tcp", 1);
-        param.put("stream_id", stream);
-//        param.put("port", 0);
-        JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param);
-
-        if (openRtpServerResultJson != null) {
-            if (openRtpServerResultJson.getInteger("code") == 0) {
-                result= openRtpServerResultJson.getInteger("port");
-                Map<String, Object> closeRtpServerParam = new HashMap<>();
-                closeRtpServerParam.put("stream_id", stream);
-                zlmresTfulUtils.closeRtpServer(mediaServerItem, closeRtpServerParam);
-            }else {
-                usedFreelist.add(startPort);
-                startPort +=2;
-                result = getFreePort(mediaServerItem, startPort, endPort,usedFreelist);
-            }
-        }else {
-            //  妫�鏌LM鐘舵��
-            logger.error("鍒涘缓RTP Server 澶辫触 {}: 璇锋鏌LM鏈嶅姟", param.get("port"));
-        }
-        return result;
-    }
 
     /**
      * 寮�鍚痳tpServer
@@ -222,16 +159,14 @@
      * @return SendRtpItem
      */
     public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId,
-                                         String deviceId, String channelId, boolean tcp, boolean rtcp, KeepPortCallback callback){
+                                         String deviceId, String channelId, boolean tcp, boolean rtcp){
 
         // 榛樿涓洪殢鏈虹鍙�
         int localPort = 0;
         if (userSetting.getGbSendStreamStrict()) {
-            if (userSetting.getGbSendStreamStrict()) {
-                localPort = keepPort(serverItem, ssrc, localPort, callback);
-                if (localPort == 0) {
-                    return null;
-                }
+            localPort = sendRtpPortManager.getNextPort(serverItem.getId());
+            if (localPort == 0) {
+                return null;
             }
         }
         SendRtpItem sendRtpItem = new SendRtpItem();
@@ -261,11 +196,11 @@
      * @return SendRtpItem
      */
     public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId,
-                                         String app, String stream, String channelId, boolean tcp, boolean rtcp, KeepPortCallback callback){
+                                         String app, String stream, String channelId, boolean tcp, boolean rtcp){
         // 榛樿涓洪殢鏈虹鍙�
         int localPort = 0;
         if (userSetting.getGbSendStreamStrict()) {
-            localPort = keepPort(serverItem, ssrc, localPort, callback);
+            localPort = sendRtpPortManager.getNextPort(serverItem.getId());
             if (localPort == 0) {
                 return null;
             }
@@ -284,58 +219,6 @@
         sendRtpItem.setMediaServerId(serverItem.getId());
         sendRtpItem.setRtcp(rtcp);
         return sendRtpItem;
-    }
-
-    public interface KeepPortCallback{
-        Boolean keep(String ssrc);
-    }
-
-    /**
-     * 淇濇寔绔彛锛岀洿鍒伴渶瑕侀渶瑕佸彂娴佹椂鍐嶉噴鏀�
-     */
-    public int keepPort(MediaServerItem serverItem, String ssrc, int localPort, KeepPortCallback keepPortCallback) {
-        Map<String, Object> param = new HashMap<>(3);
-        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());
-            // 璁㈤槄 zlm鍚姩浜嬩欢, 鏂扮殑zlm涔熶細浠庤繖閲岃繘鍏ョ郴缁�
-            Integer finalLocalPort = localPort;
-            hookSubscribe.addSubscribe(hookSubscribeForRtpServerTimeout,
-                    (MediaServerItem mediaServerItem, HookParam hookParam)->{
-                        logger.info("[涓婄骇鐐规挱] {}->鐩戝惉绔彛鍒版湡缁х画淇濇寔鐩戝惉: {}", ssrc, finalLocalPort);
-                        OnRtpServerTimeoutHookParam rtpServerTimeoutHookParam = (OnRtpServerTimeoutHookParam) hookParam;
-                        if (ssrc.equals(rtpServerTimeoutHookParam.getSsrc())) {
-                            if (keepPortCallback.keep(ssrc)) {
-                                logger.info("[涓婄骇鐐规挱] {}->鐩戝惉绔彛鍒版湡缁х画淇濇寔鐩戝惉", ssrc);
-                                keepPort(serverItem, ssrc, finalLocalPort, keepPortCallback);
-                            }else {
-                                logger.info("[涓婄骇鐐规挱] {}->鍙戦�佸彇娑堬紝鏃犻渶缁х画鐩戝惉", ssrc);
-                                releasePort(serverItem, ssrc);
-                            }
-                        }
-                    });
-            logger.info("[涓婄骇鐐规挱] {}->鐩戝惉绔彛: {}", ssrc, localPort);
-            return localPort;
-        }else {
-            logger.info("[涓婄骇鐐规挱] 鐩戝惉绔彛澶辫触: {}->{}", ssrc, localPort);
-            return 0;
-        }
-    }
-
-    /**
-     * 閲婃斁淇濇寔鐨勭鍙�
-     */
-    public boolean releasePort(MediaServerItem serverItem, String ssrc) {
-        logger.info("[涓婄骇鐐规挱] {}->閲婃斁鐩戝惉绔彛", ssrc);
-        boolean closeRTPServerResult = closeRtpServer(serverItem, ssrc);
-        HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(ssrc, null, serverItem.getId());
-        // 璁㈤槄 zlm鍚姩浜嬩欢, 鏂扮殑zlm涔熶細浠庤繖閲岃繘鍏ョ郴缁�
-        hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout);
-        return closeRTPServerResult;
     }
 
     /**

--
Gitblit v1.8.0