From e14cef80624602d873b1062aed93022b8ad13182 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 05 一月 2023 16:38:33 +0800
Subject: [PATCH] 优化语音对讲
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java | 9 +---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 7 +++
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 64 +++++++-------------------------
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 6 +++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java | 7 +++
src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java | 16 ++++----
6 files changed, 42 insertions(+), 67 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java
index 8099600..224721d 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java
@@ -9,14 +9,15 @@
private String toTag;
private String viaBranch;
- private boolean fromServer;
+ // 鑷繁鏄惁濯掍綋娴佸彂閫佽��
+ private boolean asSender;
- public SipTransactionInfo(SIPResponse response, boolean fromServer) {
+ public SipTransactionInfo(SIPResponse response, boolean asSender) {
this.callId = response.getCallIdHeader().getCallId();
this.fromTag = response.getFromTag();
this.toTag = response.getToTag();
this.viaBranch = response.getTopmostViaHeader().getBranch();
- this.fromServer = fromServer;
+ this.asSender = asSender;
}
public SipTransactionInfo(SIPResponse response) {
@@ -24,7 +25,6 @@
this.fromTag = response.getFromTag();
this.toTag = response.getToTag();
this.viaBranch = response.getTopmostViaHeader().getBranch();
- this.fromServer = true;
}
public SipTransactionInfo() {
@@ -62,11 +62,11 @@
this.viaBranch = viaBranch;
}
- public boolean isFromServer() {
- return fromServer;
+ public boolean isAsSender() {
+ return asSender;
}
- public void setFromServer(boolean fromServer) {
- this.fromServer = fromServer;
+ public void setAsSender(boolean asSender) {
+ this.asSender = asSender;
}
}
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 7cdc027..fc4ff85 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
@@ -170,11 +170,11 @@
//from
SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());
Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
- FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.isFromServer()?transactionInfo.getFromTag():transactionInfo.getToTag());
+ FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.isAsSender()? transactionInfo.getFromTag():transactionInfo.getToTag());
//to
SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId,device.getHostAddress());
Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
- ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress,transactionInfo.isFromServer()?transactionInfo.getToTag():transactionInfo.getFromTag());
+ ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress, transactionInfo.isAsSender()?transactionInfo.getToTag():transactionInfo.getFromTag());
//Forwards
MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
@@ -183,11 +183,6 @@
CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE);
CallIdHeader callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());
request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
-
- request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
-
- Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
- request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
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 29f2bec..3181ee2 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
@@ -655,7 +655,12 @@
*/
@Override
public void streamByeCmd(Device device, String channelId, String stream, String callId, SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException, SsrcTransactionNotFoundException {
- SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, callId, stream);
+ SsrcTransaction ssrcTransaction;
+ if (callId != null) {
+ ssrcTransaction = streamSession.getSsrcTransaction(null, null, callId, null);
+ }else {
+ ssrcTransaction = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, null, stream);
+ }
if (ssrcTransaction == null) {
throw new SsrcTransactionNotFoundException(device.getDeviceId(), channelId, callId, stream);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java
index 6e5c42e..cf5c34b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java
@@ -62,7 +62,12 @@
return;
}
String result = getText(rootElement, "Result");
- logger.info("[璇煶骞挎挱]鍥炲锛歿}, {}/{}", result, device.getDeviceId(), channelId );
+ Element infoElement = rootElement.element("Info");
+ String reason = null;
+ if (infoElement != null) {
+ reason = getText(infoElement, "Reason");
+ }
+ logger.info("[璇煶骞挎挱]鍥炲锛歿}, {}/{}", reason == null? result : result + ": " + reason, device.getDeviceId(), channelId );
// 鍥炲200 OK
responseAck(request, Response.OK);
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index 6f40ef8..20946ea 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -344,70 +344,34 @@
}
}else if ("broadcast".equals(param.getApp())){
// 璇煶瀵硅鎺ㄦ祦 stream闇�瑕佹弧瓒虫牸寮廳eviceId_channelId
- if (param.isRegist() && param.getStream().indexOf("_") > 0) {
+ if (param.getStream().indexOf("_") > 0) {
String[] streamArray = param.getStream().split("_");
if (streamArray.length == 2) {
String deviceId = streamArray[0];
String channelId = streamArray[1];
Device device = deviceService.getDevice(deviceId);
if (device != null) {
- DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
- if (deviceChannel != null) {
+ if (param.isRegist()) {
if (audioBroadcastManager.exit(deviceId, channelId)) {
- // 鐩存帴鎺ㄦ祦
- SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, null, param.getStream(), null);
- if (sendRtpItem == null) {
- // TODO 鍙兘鏁版嵁閿欒锛岄噸鏂板紑鍚闊抽�氶亾
- }else {
- String is_Udp = sendRtpItem.isTcp() ? "0" : "1";
- MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
- logger.info("rtp/{}寮�濮嬪悜涓婄骇鎺ㄦ祦, 鐩爣={}:{}锛孲SRC={}", sendRtpItem.getStreamId(), sendRtpItem.getIp(), sendRtpItem.getPort(), sendRtpItem.getSsrc());
- Map<String, Object> sendParam = new HashMap<>(12);
- sendParam.put("vhost","__defaultVhost__");
- sendParam.put("app",sendRtpItem.getApp());
- sendParam.put("stream",sendRtpItem.getStreamId());
- sendParam.put("ssrc", sendRtpItem.getSsrc());
- sendParam.put("src_port", sendRtpItem.getLocalPort());
- sendParam.put("pt", sendRtpItem.getPt());
- sendParam.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
- sendParam.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0");
-
- JSONObject jsonObject;
- if (sendRtpItem.isTcpActive()) {
- jsonObject = zlmrtpServerFactory.startSendRtpPassive(mediaInfo, sendParam);
- } else {
- sendParam.put("is_udp", is_Udp);
- sendParam.put("dst_url", sendRtpItem.getIp());
- sendParam.put("dst_port", sendRtpItem.getPort());
- jsonObject = zlmrtpServerFactory.startSendRtpStream(mediaInfo, sendParam);
- }
- if (jsonObject != null && jsonObject.getInteger("code") == 0) {
- logger.info("[璇煶瀵硅] 鑷姩鎺ㄦ祦鎴愬姛, device: {}, channel: {}", deviceId, channelId);
- }else {
- logger.info("[璇煶瀵硅] 鎺ㄦ祦澶辫触, 缁撴灉锛� {}", jsonObject);
- }
-
- }
- }else {
- // 寮�鍚闊冲璁查�氶亾
- try {
- playService.audioBroadcastCmd(device, channelId, 60, (msg)->{
- logger.info("[璇煶瀵硅] 閫氶亾寤虹珛鎴愬姛, device: {}, channel: {}", deviceId, channelId);
- });
- } catch (InvalidArgumentException | ParseException | SipException e) {
- logger.error("[鍛戒护鍙戦�佸け璐 璇煶瀵硅: {}", e.getMessage());
- }
+ playService.stopAudioBroadcast(deviceId, channelId);
}
-
+ // 寮�鍚闊冲璁查�氶亾
+ try {
+ playService.audioBroadcastCmd(device, channelId, 60, (msg)->{
+ logger.info("[璇煶瀵硅] 閫氶亾寤虹珛鎴愬姛, device: {}, channel: {}", deviceId, channelId);
+ });
+ } catch (InvalidArgumentException | ParseException | SipException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 璇煶瀵硅: {}", e.getMessage());
+ }
}else {
- logger.info("[璇煶瀵硅] 鏈壘鍒伴�氶亾锛歿}", channelId);
+ // 娴佹敞閿�
+ playService.stopAudioBroadcast(deviceId, channelId);
}
- }else{
+ } else{
logger.info("[璇煶瀵硅] 鏈壘鍒拌澶囷細{}", deviceId);
}
}
}
-
}else if ("talk".equals(param.getApp())){
// 璇煶瀵硅鎺ㄦ祦 stream闇�瑕佹弧瓒虫牸寮廳eviceId_channelId
if (param.isRegist() && param.getStream().indexOf("_") > 0) {
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 870b6a3..616aaad 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
@@ -1085,6 +1085,12 @@
param.put("app", sendRtpItem.getApp());
param.put("stream", sendRtpItem.getStreamId());
zlmresTfulUtils.stopSendRtp(mediaInfo, param);
+ try {
+ cmder.streamByeCmd(device, sendRtpItem.getChannelId(), audioBroadcastCatch.getSipTransactionInfo(), null);
+ } catch (InvalidArgumentException | ParseException | SipException |
+ SsrcTransactionNotFoundException e) {
+ logger.error("[娑堟伅鍙戦�佸け璐 鍙戦�佽闊冲枈璇滲YE澶辫触");
+ }
}
audioBroadcastManager.del(deviceId, channelId);
--
Gitblit v1.8.0