From b7ad0a907f59a2bc0455565e76c12bf152016469 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期五, 27 十月 2023 18:06:46 +0800
Subject: [PATCH] 合并pr 优化sql

---
 src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java |  180 +++++++++++++++++++++++++++++------------------------------
 1 files changed, 89 insertions(+), 91 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
old mode 100644
new mode 100755
index 208fa9d..889909a
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -3,19 +3,18 @@
 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.common.VideoManagerConstants;
 import com.genersoft.iot.vmp.conf.DynamicTask;
 import com.genersoft.iot.vmp.conf.SipConfig;
 import com.genersoft.iot.vmp.conf.UserSetting;
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
-import com.genersoft.iot.vmp.gb28181.session.SsrcConfig;
-import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
-import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
-import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
-import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
+import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
+import com.genersoft.iot.vmp.media.zlm.*;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
 import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData;
+import com.genersoft.iot.vmp.service.IInviteStreamService;
 import com.genersoft.iot.vmp.service.IMediaServerService;
 import com.genersoft.iot.vmp.service.bean.MediaServerLoad;
 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
@@ -25,23 +24,30 @@
 import com.genersoft.iot.vmp.utils.JsonUtil;
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
+import com.genersoft.iot.vmp.vmanager.bean.RecordFile;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.Response;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
+import org.springframework.util.Assert;
 import org.springframework.util.ObjectUtils;
 
 import java.io.File;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 
 /**
  * 濯掍綋鏈嶅姟鍣ㄨ妭鐐圭鐞�
@@ -56,6 +62,9 @@
     @Autowired
     private SipConfig sipConfig;
 
+    @Autowired
+    private SSRCFactory ssrcFactory;
+
     @Value("${server.ssl.enabled:false}")
     private boolean sslEnabled;
 
@@ -64,6 +73,9 @@
 
     @Autowired
     private UserSetting userSetting;
+
+    @Autowired
+    private SendRtpPortManager sendRtpPortManager;
 
     @Autowired
     private AssistRESTfulUtils assistRESTfulUtils;
@@ -82,7 +94,7 @@
 
 
     @Autowired
-    private ZLMRTPServerFactory zlmrtpServerFactory;
+    private ZLMServerFactory zlmServerFactory;
 
     @Autowired
     private EventPublisher publisher;
@@ -94,7 +106,16 @@
     private IRedisCatchStorage redisCatchStorage;
 
     @Autowired
+    private IInviteStreamService inviteStreamService;
+
+    @Autowired
     private RedisTemplate<Object, Object> redisTemplate;
+
+    @Qualifier("taskExecutor")
+    @Autowired
+    private ThreadPoolTaskExecutor taskExecutor;
+
+
 
     /**
      * 鍒濆鍖�
@@ -107,10 +128,8 @@
                 continue;
             }
             // 鏇存柊
-            if (mediaServerItem.getSsrcConfig() == null) {
-                SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain());
-                mediaServerItem.setSsrcConfig(ssrcConfig);
-                redisTemplate.opsForValue().set(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId(), mediaServerItem);
+            if (!ssrcFactory.hasMediaServerSSRC(mediaServerItem.getId())) {
+                ssrcFactory.initMediaServerSSRC(mediaServerItem.getId(), null);
             }
             // 鏌ヨredis鏄惁瀛樺湪姝ediaServer
             String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
@@ -118,57 +137,44 @@
             if (hasKey != null && ! hasKey) {
                 redisTemplate.opsForValue().set(key, mediaServerItem);
             }
-
         }
     }
 
-    @Override
-    public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean ssrcCheck, boolean isPlayback) {
-        return openRTPServer(mediaServerItem, streamId, null, ssrcCheck,isPlayback);
-    }
 
     @Override
-    public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String presetSsrc, boolean ssrcCheck, boolean isPlayback, Integer port) {
+    public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String presetSsrc, boolean ssrcCheck,
+                                  boolean isPlayback, Integer port, Boolean reUsePort, Integer tcpMode) {
         if (mediaServerItem == null || mediaServerItem.getId() == null) {
             logger.info("[openRTPServer] 澶辫触, mediaServerItem == null || mediaServerItem.getId() == null");
             return null;
         }
         // 鑾峰彇mediaServer鍙敤鐨剆src
-        String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
-
-        SsrcConfig ssrcConfig = mediaServerItem.getSsrcConfig();
-        if (ssrcConfig == null) {
-            logger.info("media server [ {} ] ssrcConfig is null", mediaServerItem.getId());
-            return null;
+        String ssrc;
+        if (presetSsrc != null) {
+            ssrc = presetSsrc;
         }else {
-            String ssrc;
-            if (presetSsrc != null) {
-                ssrc = presetSsrc;
+            if (isPlayback) {
+                ssrc = ssrcFactory.getPlayBackSsrc(mediaServerItem.getId());
             }else {
-                if (isPlayback) {
-                    ssrc = ssrcConfig.getPlayBackSsrc();
-                }else {
-                    ssrc = ssrcConfig.getPlaySsrc();
-                }
+                ssrc = ssrcFactory.getPlaySsrc(mediaServerItem.getId());
             }
-
-            if (streamId == null) {
-                streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
-            }
-            int rtpServerPort;
-            if (mediaServerItem.isRtpEnable()) {
-                rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0, port);
-            } else {
-                rtpServerPort = mediaServerItem.getRtpProxyPort();
-            }
-            redisTemplate.opsForValue().set(key, mediaServerItem);
-            return new SSRCInfo(rtpServerPort, ssrc, streamId);
         }
-    }
 
-    @Override
-    public SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback) {
-        return openRTPServer(mediaServerItem, streamId, ssrc, ssrcCheck, isPlayback, null);
+        if (streamId == null) {
+            streamId = String.format("%08x", Long.parseLong(ssrc)).toUpperCase();
+        }
+        int ssrcCheckParam = 0;
+        if (ssrcCheck && tcpMode > 1) {
+            // 鐩墠zlm涓嶆敮鎸� tcp妯″紡鏇存柊ssrc锛屾殏鏃跺叧闂璼src鏍¢獙
+            logger.warn("[openRTPServer] TCP琚姩/TCP涓诲姩鏀舵祦鏃讹紝榛樿鍏抽棴ssrc妫�楠�");
+        }
+        int rtpServerPort;
+        if (mediaServerItem.isRtpEnable()) {
+            rtpServerPort = zlmServerFactory.createRTPServer(mediaServerItem, streamId, (ssrcCheck && tcpMode == 0) ? Long.parseLong(ssrc) : 0, port, reUsePort, tcpMode);
+        } else {
+            rtpServerPort = mediaServerItem.getRtpProxyPort();
+        }
+        return new SSRCInfo(rtpServerPort, ssrc, streamId);
     }
 
     @Override
@@ -176,7 +182,16 @@
         if (mediaServerItem == null) {
             return;
         }
-        zlmrtpServerFactory.closeRtpServer(mediaServerItem, streamId);
+        zlmServerFactory.closeRtpServer(mediaServerItem, streamId);
+    }
+
+    @Override
+    public void closeRTPServer(MediaServerItem mediaServerItem, String streamId, CommonCallback<Boolean> callback) {
+        if (mediaServerItem == null) {
+            callback.run(false);
+            return;
+        }
+        zlmServerFactory.closeRtpServer(mediaServerItem, streamId, callback);
     }
 
     @Override
@@ -186,16 +201,17 @@
     }
 
     @Override
+    public Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc) {
+        return zlmServerFactory.updateRtpServerSSRC(mediaServerItem, streamId, ssrc);
+    }
+
+    @Override
     public void releaseSsrc(String mediaServerItemId, String ssrc) {
         MediaServerItem mediaServerItem = getOne(mediaServerItemId);
         if (mediaServerItem == null || ssrc == null) {
             return;
         }
-        SsrcConfig ssrcConfig = mediaServerItem.getSsrcConfig();
-        ssrcConfig.releaseSsrc(ssrc);
-        mediaServerItem.setSsrcConfig(ssrcConfig);
-        String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
-        redisTemplate.opsForValue().set(key, mediaServerItem);
+        ssrcFactory.releaseSsrc(mediaServerItemId, ssrc);
     }
 
     /**
@@ -203,8 +219,7 @@
      */
     @Override
     public void clearRTPServer(MediaServerItem mediaServerItem) {
-        mediaServerItem.setSsrcConfig(new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain()));
-        redisTemplate.opsForZSet().add(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(), mediaServerItem.getId(), 0);
+        ssrcFactory.reset(mediaServerItem.getId());
 
     }
 
@@ -214,16 +229,8 @@
         mediaServerMapper.update(mediaSerItem);
         MediaServerItem mediaServerItemInRedis = getOne(mediaSerItem.getId());
         MediaServerItem mediaServerItemInDataBase = mediaServerMapper.queryOne(mediaSerItem.getId());
-        if (mediaServerItemInRedis != null && mediaServerItemInRedis.getSsrcConfig() != null) {
-            mediaServerItemInDataBase.setSsrcConfig(mediaServerItemInRedis.getSsrcConfig());
-        }else {
-            mediaServerItemInDataBase.setSsrcConfig(
-                    new SsrcConfig(
-                            mediaServerItemInDataBase.getId(),
-                            null,
-                            sipConfig.getDomain()
-                    )
-            );
+        if (mediaServerItemInRedis == null || !ssrcFactory.hasMediaServerSSRC(mediaSerItem.getId())) {
+            ssrcFactory.initMediaServerSSRC(mediaServerItemInDataBase.getId(),null);
         }
         String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItemInDataBase.getId();
         redisTemplate.opsForValue().set(key, mediaServerItemInDataBase);
@@ -404,14 +411,8 @@
         }
         mediaServerMapper.update(serverItem);
         String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + zlmServerConfig.getGeneralMediaServerId();
-        if (redisTemplate.opsForValue().get(key) == null) {
-            SsrcConfig ssrcConfig = new SsrcConfig(zlmServerConfig.getGeneralMediaServerId(), null, sipConfig.getDomain());
-            serverItem.setSsrcConfig(ssrcConfig);
-        }else {
-            MediaServerItem mediaServerItemInRedis = JsonUtil.redisJsonToObject(redisTemplate, key, MediaServerItem.class);
-            if (Objects.nonNull(mediaServerItemInRedis)) {
-                serverItem.setSsrcConfig(mediaServerItemInRedis.getSsrcConfig());
-            }
+        if (!ssrcFactory.hasMediaServerSSRC(serverItem.getId())) {
+            ssrcFactory.initMediaServerSSRC(zlmServerConfig.getGeneralMediaServerId(), null);
         }
         redisTemplate.opsForValue().set(key, serverItem);
         resetOnlineServerItem(serverItem);
@@ -433,7 +434,7 @@
         }
         final String zlmKeepaliveKey = zlmKeepaliveKeyPrefix + serverItem.getId();
         dynamicTask.stop(zlmKeepaliveKey);
-        dynamicTask.startDelay(zlmKeepaliveKey, new KeepAliveTimeoutRunnable(serverItem), (Math.getExponent(serverItem.getHookAliveInterval()) + 5) * 1000);
+        dynamicTask.startDelay(zlmKeepaliveKey, new KeepAliveTimeoutRunnable(serverItem), (serverItem.getHookAliveInterval().intValue() + 5) * 1000);
         publisher.zlmOnlineEventPublish(serverItem.getId());
 
         logger.info("[ZLM] 杩炴帴鎴愬姛 {} - {}:{} ",
@@ -586,11 +587,12 @@
         param.put("hook.on_server_keepalive",String.format("%s/on_server_keepalive", hookPrex));
         param.put("hook.on_send_rtp_stopped",String.format("%s/on_send_rtp_stopped", hookPrex));
         param.put("hook.on_rtp_server_timeout",String.format("%s/on_rtp_server_timeout", hookPrex));
-        if (mediaServerItem.getRecordAssistPort() > 0) {
-            param.put("hook.on_record_mp4",String.format("http://127.0.0.1:%s/api/record/on_record_mp4", mediaServerItem.getRecordAssistPort()));
-        }else {
-            param.put("hook.on_record_mp4","");
-        }
+        param.put("hook.on_record_mp4",String.format("%s/on_record_mp4", hookPrex));
+//        if (mediaServerItem.getRecordAssistPort() > 0) {
+//            param.put("hook.on_record_mp4",String.format("http://127.0.0.1:%s/api/record/on_record_mp4", mediaServerItem.getRecordAssistPort()));
+//        }else {
+//            param.put("hook.on_record_mp4","");
+//        }
         param.put("hook.timeoutSec","20");
         // 鎺ㄦ祦鏂紑鍚庡彲浠ュ湪瓒呮椂鏃堕棿鍐呴噸鏂拌繛鎺ヤ笂缁х画鎺ㄦ祦锛岃繖鏍锋挱鏀惧櫒浼氭帴鐫�鎾斁銆�
         // 缃�0鍏抽棴姝ょ壒鎬�(鎺ㄦ祦鏂紑浼氬鑷寸珛鍗虫柇寮�鎾斁鍣�)
@@ -704,13 +706,12 @@
             // 缂撳瓨涓嶅瓨鍦紝浠庢暟鎹簱鏌ヨ锛屽鏋滄暟鎹簱涓嶅瓨鍦ㄥ垯鏄敊璇殑
             mediaServerItem = getOneFromDatabase(mediaServerId);
             if (mediaServerItem == null) {
-                logger.warn("[鏇存柊ZLM 淇濇椿淇℃伅]澶辫触锛屾湭鎵惧埌娴佸獟浣撲俊鎭�");
+                logger.warn("[鏇存柊ZLM 淇濇椿淇℃伅] 娴佸獟浣搟}灏氭湭鍔犲叆浣跨敤,璇锋鏌ヨ妭鐐逛腑鏄惁鍚湁姝ゆ祦濯掍綋 ", mediaServerId);
                 return;
             }
             // zlm杩炴帴閲嶈瘯
             logger.warn("[鏇存柊ZLM 淇濇椿淇℃伅]灏濊瘯閾炬帴zml id {}", mediaServerId);
-            SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain());
-            mediaServerItem.setSsrcConfig(ssrcConfig);
+            ssrcFactory.initMediaServerSSRC(mediaServerItem.getId(), null);
             String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
             redisTemplate.opsForValue().set(key, mediaServerItem);
             clearRTPServer(mediaServerItem);
@@ -741,22 +742,19 @@
     }
 
     @Override
-    public boolean checkRtpServer(MediaServerItem mediaServerItem, String app, String stream) {
-        JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, stream);
-        if(rtpInfo.getInteger("code") == 0){
-            return rtpInfo.getBoolean("exist");
-        }
-        return false;
-    }
-
-    @Override
     public MediaServerLoad getLoad(MediaServerItem mediaServerItem) {
         MediaServerLoad result = new MediaServerLoad();
         result.setId(mediaServerItem.getId());
         result.setPush(redisCatchStorage.getPushStreamCount(mediaServerItem.getId()));
         result.setProxy(redisCatchStorage.getProxyStreamCount(mediaServerItem.getId()));
-        result.setGbReceive(redisCatchStorage.getGbReceiveCount(mediaServerItem.getId()));
+
+        result.setGbReceive(inviteStreamService.getStreamInfoCount(mediaServerItem.getId()));
         result.setGbSend(redisCatchStorage.getGbSendCount(mediaServerItem.getId()));
         return result;
     }
+
+    @Override
+    public List<MediaServerItem> getAllWithAssistPort() {
+        return mediaServerMapper.queryAllWithAssistPort();
+    }
 }

--
Gitblit v1.8.0