From a01086fe1c0accccf8ee5f98e601a6b14f0cf152 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 03 八月 2023 15:50:15 +0800
Subject: [PATCH] 修复tcp主动录像回放时ssrc不一致时点播失败的问题

---
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java |   43 +++++++------------------------------------
 src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java             |    3 ++-
 2 files changed, 9 insertions(+), 37 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
index 041d738..f83eaf1 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
@@ -1,5 +1,6 @@
 package com.genersoft.iot.vmp.conf;
 
+import org.apache.commons.lang3.ObjectUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -100,7 +101,7 @@
 
     public boolean stop(String key) {
         boolean result = false;
-        if (futureMap.get(key) != null && !futureMap.get(key).isCancelled() && !futureMap.get(key).isDone()) {
+        if (!ObjectUtils.isEmpty(futureMap.get(key)) && !futureMap.get(key).isCancelled() && !futureMap.get(key).isDone()) {
             result = futureMap.get(key).cancel(false);
             futureMap.remove(key);
             runnableMap.remove(key);
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 2fe72f4..99b7c52 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -422,11 +422,11 @@
                     break;
                 }
             }
-            logger.info("[鐐规挱-TCP涓诲姩杩炴帴瀵规柟] deviceId: {}, channelId: {}, 杩炴帴瀵规柟鐨勫湴鍧�锛歿}:{}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, sdp.getConnection().getAddress(), port, device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
+            logger.info("[TCP涓诲姩杩炴帴瀵规柟] deviceId: {}, channelId: {}, 杩炴帴瀵规柟鐨勫湴鍧�锛歿}:{}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, sdp.getConnection().getAddress(), port, device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
             JSONObject jsonObject = zlmresTfulUtils.connectRtpServer(mediaServerItem, sdp.getConnection().getAddress(), port, ssrcInfo.getStream());
-            logger.info("[鐐规挱-TCP涓诲姩杩炴帴瀵规柟] 缁撴灉锛� {}", jsonObject);
+            logger.info("[TCP涓诲姩杩炴帴瀵规柟] 缁撴灉锛� {}", jsonObject);
         } catch (SdpException e) {
-            logger.error("[鐐规挱-TCP涓诲姩杩炴帴瀵规柟] deviceId: {}, channelId: {}, 瑙f瀽200OK鐨凷DP淇℃伅澶辫触", device.getDeviceId(), channelId, e);
+            logger.error("[TCP涓诲姩杩炴帴瀵规柟] deviceId: {}, channelId: {}, 瑙f瀽200OK鐨凷DP淇℃伅澶辫触", device.getDeviceId(), channelId, e);
             dynamicTask.stop(timeOutTaskKey);
             mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
             // 閲婃斁ssrc
@@ -648,39 +648,7 @@
                             // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
                             if (ssrcInfo.getSsrc().equals(ssrcInResponse)) {
                                 if (device.getStreamMode().equalsIgnoreCase("TCP-ACTIVE")) {
-                                    String substring = contentString.substring(0, contentString.indexOf("y="));
-                                    try {
-                                        SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
-                                        int port = -1;
-                                        Vector mediaDescriptions = sdp.getMediaDescriptions(true);
-                                        for (Object description : mediaDescriptions) {
-                                            MediaDescription mediaDescription = (MediaDescription) description;
-                                            Media media = mediaDescription.getMedia();
-
-                                            Vector mediaFormats = media.getMediaFormats(false);
-                                            if (mediaFormats.contains("96")) {
-                                                port = media.getMediaPort();
-                                                break;
-                                            }
-                                        }
-                                        logger.info("[褰曞儚鍥炴斁-TCP涓诲姩杩炴帴瀵规柟] deviceId: {}, channelId: {}, 杩炴帴瀵规柟鐨勫湴鍧�锛歿}:{}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, sdp.getConnection().getAddress(), port, device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
-                                        JSONObject jsonObject = zlmresTfulUtils.connectRtpServer(mediaServerItem, sdp.getConnection().getAddress(), port, ssrcInfo.getStream());
-                                        logger.info("[褰曞儚鍥炴斁-TCP涓诲姩杩炴帴瀵规柟] 缁撴灉锛� {}", jsonObject);
-                                    } catch (SdpException e) {
-                                        logger.error("[褰曞儚鍥炴斁-TCP涓诲姩杩炴帴瀵规柟] deviceId: {}, channelId: {}, 瑙f瀽200OK鐨凷DP淇℃伅澶辫触", device.getDeviceId(), channelId, e);
-                                        dynamicTask.stop(playBackTimeOutTaskKey);
-                                        mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
-                                        // 閲婃斁ssrc
-                                        mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
-
-                                        streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
-
-                                        callback.run(InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(),
-                                                InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null);
-                                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                                                InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(),
-                                                InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null);
-                                    }
+                                    tcpActiveHandler(device, channelId, contentString, mediaServerItem, playBackTimeOutTaskKey, ssrcInfo, callback);
                                 }
                                 return;
                             }
@@ -734,6 +702,9 @@
                                     ssrcInfo.setSsrc(ssrcInResponse);
                                     inviteInfo.setSsrcInfo(ssrcInfo);
                                     inviteInfo.setStream(ssrcInfo.getStream());
+                                    if (device.getStreamMode().equalsIgnoreCase("TCP-ACTIVE")) {
+                                        tcpActiveHandler(device, channelId, contentString, mediaServerItem, playBackTimeOutTaskKey, ssrcInfo, callback);
+                                    }
                                 }
                             }else {
                                 logger.info("[鐐规挱娑堟伅] 鏀跺埌invite 200, 涓嬬骇鑷畾涔変簡ssrc, 浣嗘槸褰撳墠妯″紡鏃犻渶淇");

--
Gitblit v1.8.0