From d679a9fcf8355e56f7be79a535e81f8300c70cb5 Mon Sep 17 00:00:00 2001
From: 648540858 <456panlinlin>
Date: 星期四, 28 四月 2022 17:28:51 +0800
Subject: [PATCH] 添加对点播时设备自定义ssrc的支持

---
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java |   31 ++++++++++++++++++++++++++++++-
 1 files changed, 30 insertions(+), 1 deletions(-)

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 518b9d4..00daf10 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
@@ -39,6 +39,7 @@
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.context.request.async.DeferredResult;
 
+import javax.sip.ResponseEvent;
 import java.io.FileNotFoundException;
 import java.math.BigDecimal;
 import java.util.*;
@@ -256,7 +257,7 @@
                 }
             }
         }, userSetting.getPlayTimeout());
-
+        final String ssrc = ssrcInfo.getSsrc();
         cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
             logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString());
             timer.cancel();
@@ -264,10 +265,38 @@
             onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid);
             hookEvent.response(mediaServerItemInuse, response);
         }, (event) -> {
+            ResponseEvent responseEvent = (ResponseEvent)event.event;
+            String contentString = new String(responseEvent.getResponse().getRawContent());
+            // 鑾峰彇ssrc
+            int ssrcIndex = contentString.indexOf("y=");
+            // 妫�鏌ユ槸鍚︽湁y瀛楁
+            if (ssrcIndex >= 0) {
+                //ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈� TODO 鍚庣画瀵逛笉瑙勮寖鐨勯潪10浣峴src鍏煎
+                String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12);
+                if (!ssrc.equals(ssrcInResponse) && device.isSsrcCheck()) { // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
+                    // 鏌ヨ ssrcInResponse 鏄惁鍙敤
+                    if (mediaServerItem.isRtpEnable() && !mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
+                        // ssrc 涓嶅彲鐢�
+                        // 閲婃斁ssrc
+                        mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
+                        streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
+                        event.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�";
+                        event.statusCode = 400;
+                        errorEvent.response(event);
+                        return;
+                    }
+                    // 鍏抽棴rtp server
+                    mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
+                    // 閲嶆柊寮�鍚痵src server
+                    mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false);
+                }
+            }
+        }, (event) -> {
             timer.cancel();
             mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
             // 閲婃斁ssrc
             mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
+
             streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
             errorEvent.response(event);
         });

--
Gitblit v1.8.0