From c5f2aba9b20089f184ce175b58a33a881ea9e0b1 Mon Sep 17 00:00:00 2001 From: panlinlin <648540858@qq.com> Date: 星期五, 16 四月 2021 18:23:13 +0800 Subject: [PATCH] 修复 流已经关闭后,再次调用关闭流的接口,返回超时 --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 70 +++++++++++++++++++--------------- 1 files changed, 39 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 27402ba..4263a78 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -23,7 +23,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -// import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.DependsOn; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -333,17 +332,17 @@ /** * 璇锋眰棰勮瑙嗛娴� - * @param device 瑙嗛璁惧 - * @param channelId 棰勮閫氶亾 - * @param event hook璁㈤槄 - * @param errorEvent sip閿欒璁㈤槄 - */ + * @param device 瑙嗛璁惧 + * @param channelId 棰勮閫氶亾 + * @param event hook璁㈤槄 + * @param errorEvent sip閿欒璁㈤槄 + */ @Override public void playStreamCmd(Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent) { + String streamId = null; try { if (device == null) return; String ssrc = streamSession.createPlaySsrc(); - String streamId = null; if (rtpEnable) { streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId); }else { @@ -366,9 +365,14 @@ // 娣诲姞璁㈤槄 JSONObject subscribeKey = new JSONObject(); subscribeKey.put("app", "rtp"); - subscribeKey.put("id", streamId); + subscribeKey.put("stream", streamId); + subscribeKey.put("regist", true); - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, subscribeKey, event); + subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, json->{ + if (json.getJSONArray("tracks") == null) return; + event.response(json); + subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); + }); // StringBuffer content = new StringBuffer(200); content.append("v=0\r\n"); @@ -440,9 +444,12 @@ Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "FromInvt" + tm, null, ssrc, callIdHeader); - ClientTransaction transaction = transmitRequest(device, request, errorEvent); - streamSession.put(streamId,ssrc, transaction); - + ClientTransaction transaction = transmitRequest(device, request, (e -> { + streamSession.remove(device.getDeviceId(), channelId); + errorEvent.response(e); + })); + streamSession.put(device.getDeviceId(), channelId ,ssrc,streamId, transaction); + } catch ( SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); } @@ -466,9 +473,14 @@ // 娣诲姞璁㈤槄 JSONObject subscribeKey = new JSONObject(); subscribeKey.put("app", "rtp"); - subscribeKey.put("id", streamId); + subscribeKey.put("stream", streamId); + subscribeKey.put("regist", true); - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, subscribeKey, event); + subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, json->{ + if (json.getJSONArray("tracks") == null) return; + event.response(json); + subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); + }); StringBuffer content = new StringBuffer(200); content.append("v=0\r\n"); @@ -543,7 +555,7 @@ Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader); ClientTransaction transaction = transmitRequest(device, request, errorEvent); - streamSession.put(streamId, ssrc, transaction); + streamSession.put(device.getDeviceId(), channelId, ssrc, streamId, transaction); } catch ( SipException | ParseException | InvalidArgumentException e) { e.printStackTrace(); @@ -557,20 +569,21 @@ * */ @Override - public void streamByeCmd(String ssrc) { - streamByeCmd(ssrc, null); + public void streamByeCmd(String deviceId, String channelId) { + streamByeCmd(deviceId, channelId, null); } @Override - public void streamByeCmd(String streamId, SipSubscribe.Event okEvent) { + public void streamByeCmd(String deviceId, String channelId, SipSubscribe.Event okEvent) { try { - ClientTransaction transaction = streamSession.get(streamId); + ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId); // 鏈嶅姟閲嶅惎鍚� if (transaction == null) { - StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId); + StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId); if (streamInfo != null) { - + redisCatchStorage.stopPlay(streamInfo); } + okEvent.response(null); return; } @@ -604,14 +617,9 @@ } dialog.sendRequest(clientTransaction); - - streamSession.remove(streamId); - zlmrtpServerFactory.closeRTPServer(streamId); - } catch (TransactionDoesNotExistException e) { - e.printStackTrace(); - } catch (SipException e) { - e.printStackTrace(); - } catch (ParseException e) { + zlmrtpServerFactory.closeRTPServer(streamSession.getStreamId(deviceId, channelId)); + streamSession.remove(deviceId, channelId); + } catch (SipException | ParseException e) { e.printStackTrace(); } } @@ -632,7 +640,6 @@ * 璇煶骞挎挱 * * @param device 瑙嗛璁惧 - * @param channelId 棰勮閫氶亾 */ @Override public boolean audioBroadcastCmd(Device device) { @@ -1131,7 +1138,7 @@ * @param device 瑙嗛璁惧 * @param startPriority 鎶ヨ璧峰绾у埆锛堝彲閫夛級 * @param endPriority 鎶ヨ缁堟绾у埆锛堝彲閫夛級 - * @param alarmMethods 鎶ヨ鏂瑰紡鏉′欢锛堝彲閫夛級 + * @param alarmMethod 鎶ヨ鏂瑰紡鏉′欢锛堝彲閫夛級 * @param alarmType 鎶ヨ绫诲瀷 * @param startTime 鎶ヨ鍙戠敓璧峰鏃堕棿锛堝彲閫夛級 * @param endTime 鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級 @@ -1419,5 +1426,6 @@ String streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId); zlmrtpServerFactory.closeRTPServer(streamId); } + streamSession.remove(device.getDeviceId(), channelId); } } -- Gitblit v1.8.0