From f525b5572988326c4b73da9f68e7ee7e292a2e46 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 12 七月 2023 15:13:53 +0800
Subject: [PATCH] 修复发流复盖的为问题

---
 src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java |   71 ++++++++++++-----------------------
 1 files changed, 24 insertions(+), 47 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
index c06c4af..b7a7e15 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
@@ -3,20 +3,17 @@
 import com.alibaba.fastjson2.JSONObject;
 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.VersionInfo;
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
+import com.genersoft.iot.vmp.media.zlm.SendRtpPortManager;
 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
 import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
 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.HookSubscribeForStreamChange;
 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.service.IDeviceChannelService;
-import com.genersoft.iot.vmp.service.IDeviceService;
 import com.genersoft.iot.vmp.service.IMediaServerService;
-import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.utils.redis.RedisUtil;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
 import com.genersoft.iot.vmp.vmanager.bean.OtherRtpSendInfo;
 import io.swagger.v3.oas.annotations.Operation;
@@ -27,15 +24,16 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 
 @SuppressWarnings("rawtypes")
 @Tag(name = "绗笁鏂规湇鍔″鎺�")
@@ -56,19 +54,10 @@
     private IMediaServerService mediaServerService;
 
     @Autowired
-    private VersionInfo versionInfo;
-
-    @Autowired
-    private SipConfig sipConfig;
+    private SendRtpPortManager sendRtpPortManager;
 
     @Autowired
     private UserSetting userSetting;
-
-    @Autowired
-    private IDeviceService deviceService;
-
-    @Autowired
-    private IDeviceChannelService channelService;
 
     @Autowired
     private DynamicTask dynamicTask;
@@ -76,14 +65,6 @@
 
     @Autowired
     private RedisTemplate<Object, Object> redisTemplate;
-
-
-    @Value("${server.port}")
-    private int serverPort;
-
-
-    @Autowired
-    private IRedisCatchStorage redisCatchStorage;
 
 
     @GetMapping(value = "/receive/open")
@@ -119,6 +100,7 @@
             }
 
         }
+        String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + "_" + callId + "_"  + stream;
         int localPort = zlmServerFactory.createRTPServer(mediaServerItem, stream, ssrcInt, null, false, tcpMode);
         // 娉ㄥ唽鍥炶皟濡傛灉rtp鏀舵祦瓒呮椂鍒欓�氳繃鍥炶皟鍙戦�侀�氱煡
         if (callBack != null) {
@@ -128,6 +110,8 @@
                     (mediaServerItemInUse, response)->{
                         if (stream.equals(response.getString("stream_id"))) {
                             logger.info("[绗笁鏂规湇鍔″鎺�->寮�鍚敹娴佸拰鑾峰彇鍙戞祦淇℃伅] 绛夊緟鏀舵祦瓒呮椂 callId->{}, 鍙戦�佸洖璋�", callId);
+                            // 灏嗕俊鎭啓鍏edis涓紝浠ュ鍚庣敤
+                            redisTemplate.delete(receiveKey);
                             OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
                             OkHttpClient client = httpClientBuilder.build();
                             String url = callBack + "?callId="  + callId;
@@ -145,24 +129,15 @@
         otherRtpSendInfo.setReceivePort(localPort);
         otherRtpSendInfo.setCallId(callId);
         otherRtpSendInfo.setStream(stream);
-        String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + stream;
+
         // 灏嗕俊鎭啓鍏edis涓紝浠ュ鍚庣敤
         redisTemplate.opsForValue().set(receiveKey, otherRtpSendInfo);
         if (isSend != null && isSend) {
-            String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + callId;
+            String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + "_"  + callId;
             // 棰勫垱寤哄彂娴佷俊鎭�
-            int port = zlmServerFactory.keepPort(mediaServerItem, callId, 0, ssrc1 -> {
-                return redisTemplate.opsForValue().get(key) != null;
-            });
-
+            int port = sendRtpPortManager.getNextPort(mediaServerItem.getId());
             // 灏嗕俊鎭啓鍏edis涓紝浠ュ鍚庣敤
-            redisTemplate.opsForValue().set(key, otherRtpSendInfo);
-            // 璁剧疆瓒呮椂浠诲姟锛岃秴鏃舵湭浣跨敤锛屽垯鑷姩绉婚櫎锛屽苟鍏抽棴绔彛淇濇寔, 榛樿浜斿垎閽�
-            dynamicTask.startDelay(key, ()->{
-                logger.info("[绗笁鏂规湇鍔″鎺�->寮�鍚敹娴佸拰鑾峰彇鍙戞祦淇℃伅] 绔彛淇濇寔瓒呮椂 callId->{}", callId);
-                redisTemplate.delete(key);
-                zlmServerFactory.releasePort(mediaServerItem, callId);
-            }, 15000);
+            redisTemplate.opsForValue().set(key, otherRtpSendInfo, 300, TimeUnit.SECONDS);
             otherRtpSendInfo.setIp(mediaServerItem.getSdpIp());
             otherRtpSendInfo.setPort(port);
             logger.info("[绗笁鏂规湇鍔″鎺�->寮�鍚敹娴佸拰鑾峰彇鍙戞祦淇℃伅] 缁撴灉锛宑allId->{}锛� {}", callId, otherRtpSendInfo);
@@ -178,9 +153,14 @@
         logger.info("[绗笁鏂规湇鍔″鎺�->鍏抽棴鏀舵祦] stream->{}", stream);
         MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer();
         zlmServerFactory.closeRtpServer(mediaServerItem,stream);
-        String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + stream;
-        // 灏嗕俊鎭啓鍏edis涓紝浠ュ鍚庣敤
-        redisTemplate.delete(receiveKey);
+        String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + "_*_"  + stream;
+        List<Object> scan = RedisUtil.scan(redisTemplate, receiveKey);
+        if (scan.size() > 0) {
+            for (Object key : scan) {
+                // 灏嗕俊鎭啓鍏edis涓紝浠ュ鍚庣敤
+                redisTemplate.delete(key);
+            }
+        }
     }
 
     @GetMapping(value = "/send/start")
@@ -203,11 +183,9 @@
             streamType = 1;
         }
         MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer();
-        String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + callId;
+        String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + "_"  + callId;
         OtherRtpSendInfo sendInfo = (OtherRtpSendInfo)redisTemplate.opsForValue().get(key);
-        if (sendInfo != null) {
-            zlmServerFactory.releasePort(mediaServerItem, callId);
-        }else {
+        if (sendInfo == null) {
             sendInfo = new OtherRtpSendInfo();
         }
         sendInfo.setPushApp(app);
@@ -229,7 +207,6 @@
         param.put("only_audio", onlyAudio ? "1" : "0");
         param.put("pt", pt);
 
-        dynamicTask.stop(key);
         Boolean streamReady = zlmServerFactory.isStreamReady(mediaServerItem, app, stream);
         if (streamReady) {
             logger.info("[绗笁鏂规湇鍔″鎺�->鍙戦�佹祦] 娴佸瓨鍦紝寮�濮嬪彂娴侊紝callId->{}", callId);
@@ -257,7 +234,7 @@
             hookSubscribe.addSubscribe(hookSubscribeForStreamChange,
                     (mediaServerItemInUse, response)->{
                         dynamicTask.stop(uuid);
-                        logger.info("[绗笁鏂规湇鍔″鎺�->鍙戦�佹祦] 娴佷笂绾匡紝寮�濮嬪彂娴� callId->{}", callId);
+                        logger.info("[绗笁鏂规湇鍔″鎺�->鍙戦�佹祦] 娴佷笂绾匡紝寮�濮嬪彂娴� callId->{}锛宲aram->{}", callId, JSONObject.toJSONString(param));
                         JSONObject jsonObject = zlmServerFactory.startSendRtpStream(mediaServerItem, param);
                         System.out.println("========鍙戞祦缁撴灉==========");
                         System.out.println(jsonObject);
@@ -279,7 +256,7 @@
     @Parameter(name = "callId", description = "鏁翠釜杩囩▼鐨勫敮涓�鏍囪瘑锛屼笉浼犲垯浣跨敤闅忔満绔彛鍙戞祦", required = true)
     public void closeSendRTP(String callId) {
         logger.info("[绗笁鏂规湇鍔″鎺�->鍏抽棴鍙戦�佹祦] callId->{}", callId);
-        String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + callId;
+        String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + "_"  + callId;
         OtherRtpSendInfo sendInfo = (OtherRtpSendInfo)redisTemplate.opsForValue().get(key);
         if (sendInfo == null){
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏈紑鍚彂娴�");

--
Gitblit v1.8.0