From 613399cc6d14cfe5b8a245d462629ecee5deb2db Mon Sep 17 00:00:00 2001
From: xiaoQQya <xiaoQQya@126.com>
Date: 星期二, 17 十月 2023 17:49:31 +0800
Subject: [PATCH] fix(play): 修复单端口推流下级自定义 ssrc 时, 流注册后接口仍然超时的问题
---
src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java | 45 +++++++++++++++++++++++++++++++++++++++++----
1 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java b/src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java
old mode 100644
new mode 100755
index 451c589..73cb9ea
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java
@@ -5,19 +5,26 @@
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
+import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.IDeviceService;
import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.service.IPlatformService;
+import com.genersoft.iot.vmp.service.impl.PlatformServiceImpl;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
+import javax.sip.InvalidArgumentException;
+import javax.sip.SipException;
+import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -28,7 +35,7 @@
* @author lin
*/
@Component
-@Order(value=4)
+@Order(value=14)
public class SipRunner implements CommandLineRunner {
@Autowired
@@ -36,6 +43,9 @@
@Autowired
private IRedisCatchStorage redisCatchStorage;
+
+ @Autowired
+ private SSRCFactory ssrcFactory;
@Autowired
private UserSetting userSetting;
@@ -55,20 +65,42 @@
@Autowired
private ISIPCommanderForPlatform commanderForPlatform;
+ private final static Logger logger = LoggerFactory.getLogger(PlatformServiceImpl.class);
+
@Override
public void run(String... args) throws Exception {
List<Device> deviceList = deviceService.getAllOnlineDevice();
for (Device device : deviceList) {
if (deviceService.expire(device)){
- deviceService.offline(device.getDeviceId());
+ deviceService.offline(device.getDeviceId(), "娉ㄥ唽宸茶繃鏈�");
}else {
- deviceService.online(device);
+ deviceService.online(device, null);
}
}
// 閲嶇疆cseq璁℃暟
redisCatchStorage.resetAllCSEQ();
// 娓呯悊redis
+ // 娓呯悊鏁版嵁搴撲笉瀛樺湪浣嗘槸redis涓瓨鍦ㄧ殑鏁版嵁
+ List<Device> devicesInDb = deviceService.getAll();
+ if (devicesInDb.size() == 0) {
+ redisCatchStorage.removeAllDevice();
+ }else {
+ List<Device> devicesInRedis = redisCatchStorage.getAllDevices();
+ if (devicesInRedis.size() > 0) {
+ Map<String, Device> deviceMapInDb = new HashMap<>();
+ devicesInDb.parallelStream().forEach(device -> {
+ deviceMapInDb.put(device.getDeviceId(), device);
+ });
+ devicesInRedis.parallelStream().forEach(device -> {
+ if (deviceMapInDb.get(device.getDeviceId()) == null) {
+ redisCatchStorage.removeDevice(device.getDeviceId());
+ }
+ });
+ }
+ }
+
+
// 鏌ユ壘鍥芥爣鎺ㄦ祦
List<SendRtpItem> sendRtpItems = redisCatchStorage.queryAllSendRTPServer();
if (sendRtpItems.size() > 0) {
@@ -76,6 +108,7 @@
MediaServerItem mediaServerItem = mediaServerService.getOne(sendRtpItem.getMediaServerId());
redisCatchStorage.deleteSendRTPServer(sendRtpItem.getPlatformId(),sendRtpItem.getChannelId(), sendRtpItem.getCallId(),sendRtpItem.getStreamId());
if (mediaServerItem != null) {
+ ssrcFactory.releaseSsrc(sendRtpItem.getMediaServerId(), sendRtpItem.getSsrc());
Map<String, Object> param = new HashMap<>();
param.put("vhost","__defaultVhost__");
param.put("app",sendRtpItem.getApp());
@@ -85,7 +118,11 @@
if (jsonObject != null && jsonObject.getInteger("code") == 0) {
ParentPlatform platform = platformService.queryPlatformByServerGBId(sendRtpItem.getPlatformId());
if (platform != null) {
- commanderForPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
+ try {
+ commanderForPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
+ } catch (InvalidArgumentException | ParseException | SipException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage());
+ }
}
}
}
--
Gitblit v1.8.0