From 0858f7995b8236d79c6e39a5974cb7a13bcb4e3e Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 08 四月 2023 15:22:18 +0800
Subject: [PATCH] 优化ssrc存储结构,避免因为大量ssrc存在MediaServer中导致redis读取超时

---
 src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java |  126 +++++++++++++++++++++--------------------
 1 files changed, 65 insertions(+), 61 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
index d9f922a..9bd64f1 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -9,7 +9,7 @@
 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.gb28181.session.SSRCFactory;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
@@ -22,6 +22,7 @@
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.dao.MediaServerMapper;
 import com.genersoft.iot.vmp.utils.DateUtil;
+import com.genersoft.iot.vmp.utils.JsonUtil;
 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
 import okhttp3.OkHttpClient;
@@ -52,6 +53,9 @@
 
     @Autowired
     private SipConfig sipConfig;
+
+    @Autowired
+    private SSRCFactory ssrcFactory;
 
     @Value("${server.ssl.enabled:false}")
     private boolean sslEnabled;
@@ -89,6 +93,7 @@
     @Autowired
     private IRedisCatchStorage redisCatchStorage;
 
+
     /**
      * 鍒濆鍖�
      */
@@ -100,9 +105,8 @@
                 continue;
             }
             // 鏇存柊
-            if (mediaServerItem.getSsrcConfig() == null) {
-                SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain());
-                mediaServerItem.setSsrcConfig(ssrcConfig);
+            if (ssrcFactory.hasMediaServerSSRC(mediaServerItem.getId())) {
+                ssrcFactory.initMediaServerSSRC(mediaServerItem.getId(), null);
                 RedisUtil.set(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId(), mediaServerItem);
             }
             // 鏌ヨredis鏄惁瀛樺湪姝ediaServer
@@ -126,36 +130,27 @@
             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();
-            }
-            RedisUtil.set(key, mediaServerItem);
-            return new SSRCInfo(rtpServerPort, ssrc, streamId);
         }
+
+        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();
+        }
+        return new SSRCInfo(rtpServerPort, ssrc, streamId);
     }
 
     @Override
@@ -169,7 +164,6 @@
             return;
         }
         zlmrtpServerFactory.closeRtpServer(mediaServerItem, streamId);
-        releaseSsrc(mediaServerItem.getId(), streamId);
     }
 
     @Override
@@ -184,11 +178,7 @@
         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();
-        RedisUtil.set(key, mediaServerItem);
+        ssrcFactory.releaseSsrc(mediaServerItemId, ssrc);
     }
 
     /**
@@ -196,8 +186,7 @@
      */
     @Override
     public void clearRTPServer(MediaServerItem mediaServerItem) {
-        mediaServerItem.setSsrcConfig(new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain()));
-        RedisUtil.zAdd(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(), mediaServerItem.getId(), 0);
+        ssrcFactory.reset(mediaServerItem.getId());
 
     }
 
@@ -207,16 +196,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();
         RedisUtil.set(key, mediaServerItemInDataBase);
@@ -229,7 +210,10 @@
         String onlineKey = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId();
         for (Object mediaServerKey : mediaServerKeys) {
             String key = (String) mediaServerKey;
-            MediaServerItem mediaServerItem = (MediaServerItem) RedisUtil.get(key);
+            MediaServerItem mediaServerItem = JsonUtil.redisJsonToObject(key, MediaServerItem.class);
+            if (Objects.isNull(mediaServerItem)) {
+                continue;
+            }
             // 妫�鏌ョ姸鎬�
             Double aDouble = RedisUtil.zScore(onlineKey, mediaServerItem.getId());
             if (aDouble != null) {
@@ -281,7 +265,7 @@
             return null;
         }
         String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
-        return (MediaServerItem)RedisUtil.get(key);
+        return JsonUtil.redisJsonToObject(key, MediaServerItem.class);
     }
 
     @Override
@@ -393,12 +377,8 @@
         }
         mediaServerMapper.update(serverItem);
         String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + zlmServerConfig.getGeneralMediaServerId();
-        if (RedisUtil.get(key) == null) {
-            SsrcConfig ssrcConfig = new SsrcConfig(zlmServerConfig.getGeneralMediaServerId(), null, sipConfig.getDomain());
-            serverItem.setSsrcConfig(ssrcConfig);
-        }else {
-            MediaServerItem mediaServerItemInRedis = (MediaServerItem)RedisUtil.get(key);
-            serverItem.setSsrcConfig(mediaServerItemInRedis.getSsrcConfig());
+        if (ssrcFactory.hasMediaServerSSRC(serverItem.getId())) {
+            ssrcFactory.initMediaServerSSRC(zlmServerConfig.getGeneralMediaServerId(), null);
         }
         RedisUtil.set(key, serverItem);
         resetOnlineServerItem(serverItem);
@@ -488,7 +468,7 @@
      * @return MediaServerItem
      */
     @Override
-    public MediaServerItem getMediaServerForMinimumLoad() {
+    public MediaServerItem getMediaServerForMinimumLoad(Boolean hasAssist) {
         String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId();
 
         if (RedisUtil.zSize(key)  == null || RedisUtil.zSize(key) == 0) {
@@ -501,9 +481,31 @@
         // 鑾峰彇鍒嗘暟鏈�浣庣殑锛屽強骞跺彂鏈�浣庣殑
         Set<Object> objects = RedisUtil.zRange(key, 0, -1);
         ArrayList<Object> mediaServerObjectS = new ArrayList<>(objects);
+        MediaServerItem mediaServerItem = null;
+        if (hasAssist == null) {
+            String mediaServerId = (String)mediaServerObjectS.get(0);
+            mediaServerItem = getOne(mediaServerId);
+        }else if (hasAssist) {
+            for (Object mediaServerObject : mediaServerObjectS) {
+                String mediaServerId = (String)mediaServerObject;
+                MediaServerItem serverItem = getOne(mediaServerId);
+                if (serverItem.getRecordAssistPort() > 0) {
+                    mediaServerItem = serverItem;
+                    break;
+                }
+            }
+        }else if (!hasAssist) {
+            for (Object mediaServerObject : mediaServerObjectS) {
+                String mediaServerId = (String)mediaServerObject;
+                MediaServerItem serverItem = getOne(mediaServerId);
+                if (serverItem.getRecordAssistPort() == 0) {
+                    mediaServerItem = serverItem;
+                    break;
+                }
+            }
+        }
 
-        String mediaServerId = (String)mediaServerObjectS.get(0);
-        return getOne(mediaServerId);
+        return mediaServerItem;
     }
 
     /**
@@ -520,6 +522,9 @@
 
         Map<String, Object> param = new HashMap<>();
         param.put("api.secret",mediaServerItem.getSecret()); // -profile:v Baseline
+        if (mediaServerItem.getRtspPort() != 0) {
+            param.put("ffmpeg.snap", "%s -rtsp_transport tcp -i %s -y -f mjpeg -t 0.001 %s");
+        }
         param.put("hook.enable","1");
         param.put("hook.on_flow_report","");
         param.put("hook.on_play",String.format("%s/on_play", hookPrex));
@@ -652,8 +657,7 @@
             }
             // 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();
             RedisUtil.set(key, mediaServerItem);
             clearRTPServer(mediaServerItem);

--
Gitblit v1.8.0