From 86a701ce885871d2468ec31eb13be5595673a01b Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 28 三月 2024 10:24:13 +0800
Subject: [PATCH] Merge branch 'master' into dev/abl支持
---
src/main/java/com/genersoft/iot/vmp/gb28181/session/AudioBroadcastManager.java | 105 +++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 98 insertions(+), 7 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/AudioBroadcastManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/AudioBroadcastManager.java
index d3ddf52..bc5f022 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/AudioBroadcastManager.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/AudioBroadcastManager.java
@@ -1,10 +1,26 @@
package com.genersoft.iot.vmp.gb28181.session;
import com.genersoft.iot.vmp.conf.SipConfig;
+import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
import com.genersoft.iot.vmp.gb28181.bean.AudioBroadcastCatch;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
+import com.genersoft.iot.vmp.gb28181.bean.InviteStreamType;
+import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
+import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
+import com.genersoft.iot.vmp.media.event.MediaDepartureEvent;
+import com.genersoft.iot.vmp.service.IDeviceService;
+import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
+import javax.sip.InvalidArgumentException;
+import javax.sip.SipException;
+import java.text.ParseException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
@@ -17,21 +33,72 @@
@Component
public class AudioBroadcastManager {
+ private final static Logger logger = LoggerFactory.getLogger(AudioBroadcastManager.class);
+
@Autowired
private SipConfig config;
+ @Autowired
+ private SIPCommander cmder;
+
+ @Autowired
+ private IRedisCatchStorage redisCatchStorage;
+
+ @Autowired
+ private IDeviceService deviceService;
+
public static Map<String, AudioBroadcastCatch> data = new ConcurrentHashMap<>();
- public void add(AudioBroadcastCatch audioBroadcastCatch) {
- this.update(audioBroadcastCatch);
+ /**
+ * 娴佺寮�鐨勫鐞�
+ */
+ @Async("taskExecutor")
+ @EventListener
+ public void onApplicationEvent(MediaDepartureEvent event) {
+ List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(event.getStream());
+ if (!sendRtpItems.isEmpty()) {
+ for (SendRtpItem sendRtpItem : sendRtpItems) {
+ if (sendRtpItem != null && sendRtpItem.getApp().equals(event.getApp())) {
+ String platformId = sendRtpItem.getPlatformId();
+ Device device = deviceService.getDevice(platformId);
+ try {
+ if (device != null) {
+ cmder.streamByeCmd(device, sendRtpItem.getChannelId(), event.getStream(), sendRtpItem.getCallId());
+ if (sendRtpItem.getPlayType().equals(InviteStreamType.BROADCAST)
+ || sendRtpItem.getPlayType().equals(InviteStreamType.TALK)) {
+ AudioBroadcastCatch audioBroadcastCatch = get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
+ if (audioBroadcastCatch != null) {
+ // 鏉ヨ嚜涓婄骇骞冲彴鐨勫仠姝㈠璁�
+ logger.info("[鍋滄瀵硅] 鏉ヨ嚜涓婄骇锛屽钩鍙帮細{}, 閫氶亾锛歿}", sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
+ del(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
+ }
+ }
+ }
+ } catch (SipException | InvalidArgumentException | ParseException |
+ SsrcTransactionNotFoundException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 鍙戦�丅YE: {}", e.getMessage());
+ }
+ }
+ }
+ }
}
public void update(AudioBroadcastCatch audioBroadcastCatch) {
- data.put(audioBroadcastCatch.getDeviceId() + audioBroadcastCatch.getChannelId(), audioBroadcastCatch);
+ if (SipUtils.isFrontEnd(audioBroadcastCatch.getDeviceId())) {
+ audioBroadcastCatch.setChannelId(audioBroadcastCatch.getDeviceId());
+ data.put(audioBroadcastCatch.getDeviceId(), audioBroadcastCatch);
+ }else {
+ data.put(audioBroadcastCatch.getDeviceId() + audioBroadcastCatch.getChannelId(), audioBroadcastCatch);
+ }
}
public void del(String deviceId, String channelId) {
- data.remove(deviceId + channelId);
+ if (SipUtils.isFrontEnd(deviceId)) {
+ data.remove(deviceId);
+ }else {
+ data.remove(deviceId + channelId);
+ }
+
}
public void delByDeviceId(String deviceId) {
@@ -50,15 +117,22 @@
public boolean exit(String deviceId, String channelId) {
for (String key : data.keySet()) {
- if (key.equals(deviceId + channelId)) {
- return true;
+ if (SipUtils.isFrontEnd(deviceId)) {
+ return key.equals(deviceId);
+ }else {
+ return key.equals(deviceId + channelId);
}
}
return false;
}
public AudioBroadcastCatch get(String deviceId, String channelId) {
- AudioBroadcastCatch audioBroadcastCatch = data.get(deviceId + channelId);
+ AudioBroadcastCatch audioBroadcastCatch;
+ if (SipUtils.isFrontEnd(deviceId)) {
+ audioBroadcastCatch = data.get(deviceId);
+ }else {
+ audioBroadcastCatch = data.get(deviceId + channelId);
+ }
if (audioBroadcastCatch == null) {
Stream<AudioBroadcastCatch> allAudioBroadcastCatchStreamForDevice = data.values().stream().filter(
audioBroadcastCatchItem -> Objects.equals(audioBroadcastCatchItem.getDeviceId(), deviceId));
@@ -70,4 +144,21 @@
return audioBroadcastCatch;
}
+
+ public List<AudioBroadcastCatch> get(String deviceId) {
+ List<AudioBroadcastCatch> audioBroadcastCatchList= new ArrayList<>();
+ if (SipUtils.isFrontEnd(deviceId)) {
+ if (data.get(deviceId) != null) {
+ audioBroadcastCatchList.add(data.get(deviceId));
+ }
+ }else {
+ for (String key : data.keySet()) {
+ if (key.startsWith(deviceId)) {
+ audioBroadcastCatchList.add(data.get(key));
+ }
+ }
+ }
+
+ return audioBroadcastCatchList;
+ }
}
--
Gitblit v1.8.0