From 6ae33f2a67ac7bfd2145f05068f2e5ecf15d3f2c Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 26 九月 2022 14:01:22 +0800
Subject: [PATCH] 修复空指针

---
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java |  365 +++++++++++++++++++++++++++++----------------------
 1 files changed, 208 insertions(+), 157 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 c0b9e95..30d4277 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
@@ -2,11 +2,17 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.ParseException;
 import java.util.*;
 
+import javax.sip.InvalidArgumentException;
 import javax.sip.ResponseEvent;
+import javax.sip.SipException;
 
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
+import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
+import com.genersoft.iot.vmp.gb28181.bean.*;
+import com.genersoft.iot.vmp.service.IDeviceService;
 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,13 +28,6 @@
 import com.genersoft.iot.vmp.common.StreamInfo;
 import com.genersoft.iot.vmp.conf.DynamicTask;
 import com.genersoft.iot.vmp.conf.UserSetting;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
-import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
-import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback;
-import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo;
-import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
-import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
-import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
@@ -92,6 +91,10 @@
     @Autowired
     private VideoStreamSessionManager streamSession;
 
+
+    @Autowired
+    private IDeviceService deviceService;
+
     @Autowired
     private UserSetting userSetting;
 
@@ -148,6 +151,7 @@
                 }
             });
         });
+
         if (streamInfo != null) {
             String streamId = streamInfo.getStream();
             if (streamId == null) {
@@ -260,14 +264,14 @@
         System.out.println("璁剧疆瓒呮椂浠诲姟锛� " + timeOutTaskKey);
         dynamicTask.startDelay( timeOutTaskKey,()->{
 
-            SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
-            if (dialog != null) {
-                logger.info("[鐐规挱瓒呮椂] 鏀舵祦瓒呮椂 deviceId: {}, channelId: {}锛岀鍙o細{}, SSRC: {}", device.getDeviceId(), channelId, finalSsrcInfo.getPort(), finalSsrcInfo.getSsrc());
-                timeoutCallback.run(1, "鏀舵祦瓒呮椂");
-                // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
-                cmder.streamByeCmd(device.getDeviceId(), channelId, finalSsrcInfo.getStream(), null);
-            }else {
-                logger.info("[鐐规挱瓒呮椂] 娑堟伅鏈搷搴� deviceId: {}, channelId: {}锛岀鍙o細{}, SSRC: {}", device.getDeviceId(), channelId, finalSsrcInfo.getPort(), finalSsrcInfo.getSsrc());
+            logger.info("[鐐规挱瓒呮椂] 鏀舵祦瓒呮椂 deviceId: {}, channelId: {}锛岀鍙o細{}, SSRC: {}", device.getDeviceId(), channelId, finalSsrcInfo.getPort(), finalSsrcInfo.getSsrc());
+            timeoutCallback.run(1, "鏀舵祦瓒呮椂");
+            // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
+            try {
+                cmder.streamByeCmd(device, channelId, finalSsrcInfo.getStream(), null);
+            } catch (InvalidArgumentException | ParseException | SipException e) {
+                logger.error("[鐐规挱瓒呮椂]锛� 鍙戦�丅YE澶辫触 {}", e.getMessage());
+            } catch (SsrcTransactionNotFoundException e) {
                 timeoutCallback.run(0, "鐐规挱瓒呮椂");
                 mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
                 mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
@@ -281,73 +285,87 @@
             logger.info("[鐐规挱绔彛鍒嗛厤寮傚父]锛宒eviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo);
             return;
         }
-        cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
-            logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString());
-            System.out.println("鍋滄瓒呮椂浠诲姟锛� " + timeOutTaskKey);
-            dynamicTask.stop(timeOutTaskKey);
-            // hook鍝嶅簲
-            onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid);
-            hookEvent.response(mediaServerItemInuse, response);
-            logger.info("[鐐规挱鎴愬姛] deviceId: {}, channelId: {}", device.getDeviceId(), channelId);
+        try {
+            cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
+                logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + response.toJSONString());
+                System.out.println("鍋滄瓒呮椂浠诲姟锛� " + timeOutTaskKey);
+                dynamicTask.stop(timeOutTaskKey);
+                // hook鍝嶅簲
+                onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid);
+                hookEvent.response(mediaServerItemInuse, response);
+                logger.info("[鐐规挱鎴愬姛] deviceId: {}, channelId: {}", device.getDeviceId(), channelId);
 
-        }, (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);
-                // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
-                if (ssrc.equals(ssrcInResponse)) {
-                    return;
-                }
-                logger.info("[鐐规挱娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse );
-                if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
-                    logger.info("[鐐规挱娑堟伅] SSRC淇 {}->{}", ssrc, ssrcInResponse);
-
-                    if (!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);
+            }, (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);
+                    // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
+                    if (ssrc.equals(ssrcInResponse)) {
                         return;
                     }
+                    logger.info("[鐐规挱娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse );
+                    if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
+                        logger.info("[鐐规挱娑堟伅] SSRC淇 {}->{}", ssrc, ssrcInResponse);
 
-                    // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚�
-                    if (!mediaServerItem.isRtpEnable()) {
-                        // 娣诲姞璁㈤槄
-                        HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId());
-                        subscribe.removeSubscribe(hookSubscribe);
-                        hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
-                        subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{
-                                    logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString());
-                                    dynamicTask.stop(timeOutTaskKey);
-                                    // hook鍝嶅簲
-                                    onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid);
-                                    hookEvent.response(mediaServerItemInUse, response);
-                                });
+                        if (!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;
+                        }
+
+                        // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚�
+                        if (!mediaServerItem.isRtpEnable()) {
+                            // 娣诲姞璁㈤槄
+                            HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId());
+                            subscribe.removeSubscribe(hookSubscribe);
+                            hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
+                            subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{
+                                        logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString());
+                                        dynamicTask.stop(timeOutTaskKey);
+                                        // hook鍝嶅簲
+                                        onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid);
+                                        hookEvent.response(mediaServerItemInUse, response);
+                                    });
+                        }
+                        // 鍏抽棴rtp server
+                        mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
+                        // 閲嶆柊寮�鍚痵src server
+                        mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort());
+
                     }
-                    // 鍏抽棴rtp server
-                    mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
-                    // 閲嶆柊寮�鍚痵src server
-                    mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort());
-
                 }
-            }
-        }, (event) -> {
+            }, (event) -> {
+                dynamicTask.stop(timeOutTaskKey);
+                mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
+                // 閲婃斁ssrc
+                mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
+
+                streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
+                errorEvent.response(event);
+            });
+        } catch (InvalidArgumentException | SipException | ParseException e) {
+
+            logger.error("[鍛戒护鍙戦�佸け璐 鐐规挱娑堟伅: {}", e.getMessage());
             dynamicTask.stop(timeOutTaskKey);
             mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
             // 閲婃斁ssrc
             mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
 
             streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
-            errorEvent.response(event);
-        });
+            SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null));
+            eventResult.msg = "鍛戒护鍙戦�佸け璐�";
+            errorEvent.response(eventResult);
+        }
     }
 
     @Override
@@ -438,17 +456,18 @@
             playBackResult.setCode(ErrorCode.ERROR100.getCode());
             playBackResult.setMsg("鍥炴斁瓒呮椂");
             playBackResult.setData(requestMessage);
-            SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
-            // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
-            if (dialog != null) {
+
+            try {
+                cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null);
+            } catch (InvalidArgumentException | ParseException | SipException e) {
+                logger.error("[褰曞儚娴乚鍥炴斁瓒呮椂 鍙戦�丅YE澶辫触 {}", e.getMessage());
+            } catch (SsrcTransactionNotFoundException e) {
                 // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
-                cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
-            }else {
                 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
                 mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
                 streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
             }
-            cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
+
             // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰
             playBackCallback.call(playBackResult);
             result.setResult(WVPResult.fail(ErrorCode.ERROR100.getCode(), "鍥炴斁瓒呮椂"));
@@ -488,59 +507,67 @@
             playBackCallback.call(playBackResult);
         };
 
-        cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack,
-                hookEvent, eventResult -> {
-                    if (eventResult.type == SipSubscribe.EventResultType.response) {
-                        ResponseEvent responseEvent = (ResponseEvent)eventResult.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);
-                            // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
-                            if (ssrcInfo.getSsrc().equals(ssrcInResponse)) {
-                                return;
-                            }
-                            logger.info("[鍥炴斁娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse );
-                            if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
-                                logger.info("[鍥炴斁娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
-
-                                if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
-                                    // ssrc 涓嶅彲鐢�
-                                    // 閲婃斁ssrc
-                                    mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
-                                    streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
-                                    eventResult.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�";
-                                    eventResult.statusCode = 400;
-                                    errorEvent.response(eventResult);
+        try {
+            cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack,
+                    hookEvent, eventResult -> {
+                        if (eventResult.type == SipSubscribe.EventResultType.response) {
+                            ResponseEvent responseEvent = (ResponseEvent)eventResult.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);
+                                // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
+                                if (ssrcInfo.getSsrc().equals(ssrcInResponse)) {
                                     return;
                                 }
+                                logger.info("[鍥炴斁娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse );
+                                if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
+                                    logger.info("[鍥炴斁娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
 
-                                // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚�
-                                if (!mediaServerItem.isRtpEnable()) {
-                                    // 娣诲姞璁㈤槄
-                                    HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
-                                    subscribe.removeSubscribe(hookSubscribe);
-                                    hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
-                                    subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{
-                                        logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString());
-                                        dynamicTask.stop(playBackTimeOutTaskKey);
-                                        // hook鍝嶅簲
-                                        onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid);
-                                        hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream()));
-                                    });
+                                    if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
+                                        // ssrc 涓嶅彲鐢�
+                                        // 閲婃斁ssrc
+                                        mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
+                                        streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
+                                        eventResult.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�";
+                                        eventResult.statusCode = 400;
+                                        errorEvent.response(eventResult);
+                                        return;
+                                    }
+
+                                    // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚�
+                                    if (!mediaServerItem.isRtpEnable()) {
+                                        // 娣诲姞璁㈤槄
+                                        HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
+                                        subscribe.removeSubscribe(hookSubscribe);
+                                        hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
+                                        subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response)->{
+                                            logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString());
+                                            dynamicTask.stop(playBackTimeOutTaskKey);
+                                            // hook鍝嶅簲
+                                            onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid);
+                                            hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream()));
+                                        });
+                                    }
+                                    // 鍏抽棴rtp server
+                                    mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
+                                    // 閲嶆柊寮�鍚痵src server
+                                    mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort());
                                 }
-                                // 鍏抽棴rtp server
-                                mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
-                                // 閲嶆柊寮�鍚痵src server
-                                mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort());
                             }
                         }
-                    }
 
-                }, errorEvent);
+                    }, errorEvent);
+        } catch (InvalidArgumentException | SipException | ParseException e) {
+            logger.error("[鍛戒护鍙戦�佸け璐 鍥炴斁: {}", e.getMessage());
+
+            SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null));
+            eventResult.msg = "鍛戒护鍙戦�佸け璐�";
+            errorEvent.response(eventResult);
+        }
         return result;
     }
 
@@ -586,46 +613,57 @@
             downloadResult.setCode(ErrorCode.ERROR100.getCode());
             downloadResult.setMsg("褰曞儚涓嬭浇璇锋眰瓒呮椂");
             hookCallBack.call(downloadResult);
-            SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
+
             // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
-            if (dialog != null) {
-                // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
-                cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
-            }else {
+            try {
+                cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null);
+            } catch (InvalidArgumentException | ParseException | SipException e) {
+                logger.error("[褰曞儚娴乚褰曞儚涓嬭浇璇锋眰瓒呮椂锛� 鍙戦�丅YE澶辫触 {}", e.getMessage());
+            } catch (SsrcTransactionNotFoundException e) {
                 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
                 mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
                 streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
             }
-            cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
             // 鍥炲涔嬪墠鎵�鏈夌殑鐐规挱璇锋眰
             hookCallBack.call(downloadResult);
         }, userSetting.getPlayTimeout());
-        cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack,
-                inviteStreamInfo -> {
-                    logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + inviteStreamInfo.getResponse().toJSONString());
-                    dynamicTask.stop(downLoadTimeOutTaskKey);
-                    StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
-                    streamInfo.setStartTime(startTime);
-                    streamInfo.setEndTime(endTime);
-                    redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId());
-                    wvpResult.setCode(ErrorCode.SUCCESS.getCode());
-                    wvpResult.setMsg(ErrorCode.SUCCESS.getMsg());
-                    wvpResult.setData(streamInfo);
-                    downloadResult.setCode(ErrorCode.SUCCESS.getCode());
-                    downloadResult.setMsg(ErrorCode.SUCCESS.getMsg());
-                    downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem());
-                    downloadResult.setResponse(inviteStreamInfo.getResponse());
-                    hookCallBack.call(downloadResult);
-                }, event -> {
-                    dynamicTask.stop(downLoadTimeOutTaskKey);
-                    downloadResult.setCode(ErrorCode.ERROR100.getCode());
-                    downloadResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg));
-                    wvpResult.setCode(ErrorCode.ERROR100.getCode());
-                    wvpResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg));
-                    downloadResult.setEvent(event);
-                    hookCallBack.call(downloadResult);
-                    streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
-                });
+
+        SipSubscribe.Event errorEvent = event -> {
+            dynamicTask.stop(downLoadTimeOutTaskKey);
+            downloadResult.setCode(ErrorCode.ERROR100.getCode());
+            downloadResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg));
+            wvpResult.setCode(ErrorCode.ERROR100.getCode());
+            wvpResult.setMsg(String.format("褰曞儚涓嬭浇澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg));
+            downloadResult.setEvent(event);
+            hookCallBack.call(downloadResult);
+            streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
+        };
+
+        try {
+            cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack,
+                    inviteStreamInfo -> {
+                        logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + inviteStreamInfo.getResponse().toJSONString());
+                        dynamicTask.stop(downLoadTimeOutTaskKey);
+                        StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
+                        streamInfo.setStartTime(startTime);
+                        streamInfo.setEndTime(endTime);
+                        redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId());
+                        wvpResult.setCode(ErrorCode.SUCCESS.getCode());
+                        wvpResult.setMsg(ErrorCode.SUCCESS.getMsg());
+                        wvpResult.setData(streamInfo);
+                        downloadResult.setCode(ErrorCode.SUCCESS.getCode());
+                        downloadResult.setMsg(ErrorCode.SUCCESS.getMsg());
+                        downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem());
+                        downloadResult.setResponse(inviteStreamInfo.getResponse());
+                        hookCallBack.call(downloadResult);
+                    }, errorEvent);
+        } catch (InvalidArgumentException | SipException | ParseException e) {
+            logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚涓嬭浇: {}", e.getMessage());
+
+            SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null));
+            eventResult.msg = "鍛戒护鍙戦�佸け璐�";
+            errorEvent.response(eventResult);
+        }
         return result;
     }
 
@@ -704,7 +742,11 @@
             for (SendRtpItem sendRtpItem : sendRtpItems) {
                 if (sendRtpItem.getMediaServerId().equals(mediaServerId)) {
                     ParentPlatform platform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId());
-                    sipCommanderFroPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
+                    try {
+                        sipCommanderFroPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
+                    } catch (SipException | InvalidArgumentException | ParseException e) {
+                        logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage());
+                    }
                 }
             }
         }
@@ -713,8 +755,17 @@
         if (allSsrc.size() > 0) {
             for (SsrcTransaction ssrcTransaction : allSsrc) {
                 if(ssrcTransaction.getMediaServerId().equals(mediaServerId)) {
-                    cmder.streamByeCmd(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(),
-                            ssrcTransaction.getStream(), null);
+                    Device device = deviceService.queryDevice(ssrcTransaction.getDeviceId());
+                    if (device == null) {
+                        continue;
+                    }
+                    try {
+                        cmder.streamByeCmd(device, ssrcTransaction.getChannelId(),
+                                ssrcTransaction.getStream(), null);
+                    } catch (InvalidArgumentException | ParseException | SipException |
+                             SsrcTransactionNotFoundException e) {
+                        logger.error("[zlm绂荤嚎]涓烘鍦ㄤ娇鐢ㄦzlm鐨勮澶囷紝 鍙戦�丅YE澶辫触 {}", e.getMessage());
+                    }
                 }
             }
         }

--
Gitblit v1.8.0