From ef742e715b8c0a983d661aa5b5f8980dade8c790 Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期四, 22 四月 2021 15:28:40 +0800
Subject: [PATCH] 优化宕机后点播中设备发送bye
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java | 30 +++++++++++++++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 36 +++++++++++++++++-
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 17 ++++++++
src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java | 17 ++++++++
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java | 1
5 files changed, 98 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
index 6def294..1336d05 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
@@ -21,6 +21,15 @@
private String rtc;
private JSONArray tracks;
+ public static class TransactionInfo{
+ public String callId;
+ public String localTag;
+ public String remoteTag;
+ public String branch;
+ }
+
+ private TransactionInfo transactionInfo;
+
public String getApp() {
return app;
}
@@ -148,4 +157,12 @@
public void setRtc(String rtc) {
this.rtc = rtc;
}
+
+ public TransactionInfo getTransactionInfo() {
+ return transactionInfo;
+ }
+
+ public void setTransactionInfo(TransactionInfo transactionInfo) {
+ this.transactionInfo = transactionInfo;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
index 14dd241..44bfc54 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
@@ -135,6 +135,36 @@
return request;
}
+ public Request createByteRequest(Device device, String channelId, String viaTag, String fromTag, String toTag, String callId) throws ParseException, InvalidArgumentException, PeerUnavailableException {
+ Request request = null;
+ //璇锋眰琛�
+ SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress());
+ // via
+ ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
+ ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag);
+ viaHeaders.add(viaHeader);
+ //from
+ SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getSipId(),sipConfig.getSipDomain());
+ Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);
+ FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); //蹇呴』瑕佹湁鏍囪锛屽惁鍒欐棤娉曞垱寤轰細璇濓紝鏃犳硶鍥炲簲ack
+ //to
+ SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,sipConfig.getSipDomain());
+ Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);
+ ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,toTag);
+
+ //Forwards
+ MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70);
+
+ //ceq
+ CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.BYE);
+ CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(callId);
+ request = sipFactory.createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
+
+ Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort()));
+
+ return request;
+ }
+
public Request createSubscribeRequest(Device device, String content, String viaTag, String fromTag, String toTag, Integer expires, String event, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
Request request = null;
// sipuri
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 188676f..5f31d87 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
@@ -10,11 +10,14 @@
import javax.sip.header.ViaHeader;
import javax.sip.message.Request;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.MediaServerConfig;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
+import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
@@ -74,6 +77,9 @@
@Autowired
private ZLMRTPServerFactory zlmrtpServerFactory;
+
+ @Autowired
+ private ZLMRESTfulUtils zlmresTfulUtils;
@Value("${media.rtp.enable}")
private boolean rtpEnable;
@@ -577,13 +583,39 @@
try {
ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId);
- // 鏈嶅姟閲嶅惎鍚�
+ // 鏈嶅姟閲嶅惎鍚�, 鏃犳硶鐩存帴鍙戦�乥ye锛� 閫氳繃鎵嬪姩鏋勫缓鍙戦��
if (transaction == null) {
+
StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
if (streamInfo != null) {
+ JSONObject mediaList = zlmresTfulUtils.getMediaList(streamInfo.getApp(), streamInfo.getStreamId());
+ if (mediaList != null) { // 浠嶅湪鎺ㄦ祦鎵嶅彂閫�
+ if (mediaList.getInteger("code") == 0) {
+ JSONArray data = mediaList.getJSONArray("data");
+ if (data != null && data.size() > 0) {
+ Device device = storager.queryVideoDevice(deviceId);
+ if (device != null) {
+ StreamInfo.TransactionInfo transactionInfo = streamInfo.getTransactionInfo();
+ try {
+ Request byteRequest = headerProvider.createByteRequest(device, channelId,
+ transactionInfo.branch,
+ transactionInfo.localTag,
+ transactionInfo.remoteTag,
+ transactionInfo.callId);
+ transmitRequest(device, byteRequest);
+ } catch (InvalidArgumentException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
redisCatchStorage.stopPlay(streamInfo);
}
- okEvent.response(null);
+
+ if (okEvent != null) {
+ okEvent.response(null);
+ }
return;
}
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 b4076d0..6022724 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
@@ -7,6 +7,7 @@
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
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;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
@@ -17,6 +18,7 @@
import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;
import com.genersoft.iot.vmp.service.IMediaService;
import com.genersoft.iot.vmp.service.IPlayService;
+import gov.nist.javax.sip.stack.SIPDialog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +26,9 @@
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.async.DeferredResult;
+import javax.sip.ClientTransaction;
+import javax.sip.Dialog;
+import javax.sip.header.CallIdHeader;
import javax.sip.message.Response;
import java.util.UUID;
@@ -49,6 +54,9 @@
@Autowired
private IMediaService mediaService;
+
+ @Autowired
+ private VideoStreamSessionManager streamSession;
@Override
@@ -141,7 +149,14 @@
deviceChannel.setStreamId(streamInfo.getStreamId());
storager.startPlay(deviceId, channelId, streamInfo.getStreamId());
}
-
+ ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId);
+ SIPDialog dialog = (SIPDialog)transaction.getDialog();
+ StreamInfo.TransactionInfo transactionInfo = new StreamInfo.TransactionInfo();
+ transactionInfo.callId = dialog.getCallId().getCallId();
+ transactionInfo.localTag = dialog.getLocalTag();
+ transactionInfo.remoteTag = dialog.getRemoteTag();
+ transactionInfo.branch = dialog.getFirstTransactionInt().getBranchId();
+ streamInfo.setTransactionInfo(transactionInfo);
redisCatchStorage.startPlay(streamInfo);
msg.setData(JSON.toJSONString(streamInfo));
resultHolder.invokeResult(msg);
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
index 3d4c64c..0685fb7 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -102,6 +102,7 @@
msg.setId(DeferredResultHolder.CALLBACK_CMD_STOP + uuid);
msg.setData("鐐规挱鏈壘鍒�");
resultHolder.invokeResult(msg);
+ storager.stopPlay(deviceId, channelId);
}else {
redisCatchStorage.stopPlay(streamInfo);
storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
--
Gitblit v1.8.0