From 4604aaea99925415db8d9efe1d7e68d6f59e93c8 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期日, 02 七月 2023 13:53:45 +0800 Subject: [PATCH] 优化语音对讲支持根据设备设置释放收到ACK后开始发流 --- src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java | 85 ++++++++++++++++++++++++++++++++++-------- 1 files changed, 68 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java index 8b8c839..f412816 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java @@ -6,7 +6,7 @@ import com.genersoft.iot.vmp.common.InviteSessionType; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.service.IInviteStreamService; -import com.genersoft.iot.vmp.service.bean.InviteErrorCallback; +import com.genersoft.iot.vmp.service.bean.ErrorCallback; import com.genersoft.iot.vmp.utils.redis.RedisUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,7 +24,7 @@ private final Logger logger = LoggerFactory.getLogger(InviteStreamServiceImpl.class); - private final Map<String, List<InviteErrorCallback<Object>>> inviteErrorCallbackMap = new ConcurrentHashMap<>(); + private final Map<String, List<ErrorCallback<Object>>> inviteErrorCallbackMap = new ConcurrentHashMap<>(); @Autowired private RedisTemplate<Object, Object> redisTemplate; @@ -85,6 +85,24 @@ } @Override + public InviteInfo updateInviteInfoForStream(InviteInfo inviteInfo, String stream) { + + InviteInfo inviteInfoInDb = getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream()); + if (inviteInfoInDb == null) { + return null; + } + removeInviteInfo(inviteInfoInDb); + String key = VideoManagerConstants.INVITE_PREFIX + + "_" + inviteInfo.getType() + + "_" + inviteInfo.getDeviceId() + + "_" + inviteInfo.getChannelId() + + "_" + stream; + inviteInfoInDb.setStream(stream); + redisTemplate.opsForValue().set(key, inviteInfoInDb); + return inviteInfoInDb; + } + + @Override public InviteInfo getInviteInfo(InviteSessionType type, String deviceId, String channelId, String stream) { String key = VideoManagerConstants.INVITE_PREFIX + "_" + (type != null ? type : "*") + @@ -141,28 +159,15 @@ } @Override - public void once(InviteSessionType type, String deviceId, String channelId, String stream, InviteErrorCallback<Object> callback) { + public void once(InviteSessionType type, String deviceId, String channelId, String stream, ErrorCallback<Object> callback) { String key = buildKey(type, deviceId, channelId, stream); - List<InviteErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key); + List<ErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key); if (callbacks == null) { callbacks = new CopyOnWriteArrayList<>(); inviteErrorCallbackMap.put(key, callbacks); } callbacks.add(callback); - } - - @Override - public void call(InviteSessionType type, String deviceId, String channelId, String stream, int code, String msg, Object data) { - String key = buildKey(type, deviceId, channelId, stream); - List<InviteErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key); - if (callbacks == null) { - return; - } - for (InviteErrorCallback<Object> callback : callbacks) { - callback.run(code, msg, data); - } - inviteErrorCallbackMap.remove(key); } private String buildKey(InviteSessionType type, String deviceId, String channelId, String stream) { @@ -175,4 +180,50 @@ } + @Override + public void clearInviteInfo(String deviceId) { + removeInviteInfo(null, deviceId, null, null); + } + + @Override + public int getStreamInfoCount(String mediaServerId) { + int count = 0; + String key = VideoManagerConstants.INVITE_PREFIX + "_*_*_*_*"; + List<Object> scanResult = RedisUtil.scan(redisTemplate, key); + if (scanResult.size() == 0) { + return 0; + }else { + for (Object keyObj : scanResult) { + String keyStr = (String) keyObj; + InviteInfo inviteInfo = (InviteInfo) redisTemplate.opsForValue().get(keyStr); + if (inviteInfo != null && inviteInfo.getStreamInfo() != null && inviteInfo.getStreamInfo().getMediaServerId().equals(mediaServerId)) { + count++; + } + } + } + return count; + } + + @Override + public void call(InviteSessionType type, String deviceId, String channelId, String stream, int code, String msg, Object data) { + String key = buildSubStreamKey(type, deviceId, channelId, stream); + List<ErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key); + if (callbacks == null) { + return; + } + for (ErrorCallback<Object> callback : callbacks) { + callback.run(code, msg, data); + } + inviteErrorCallbackMap.remove(key); + } + + + private String buildSubStreamKey(InviteSessionType type, String deviceId, String channelId, String stream) { + String key = type + "_" + "_" + deviceId + "_" + channelId; + // 濡傛灉ssrc涓簄ull閭d箞鍙互瀹炵幇涓�涓�氶亾鍙兘涓�娆℃搷浣滐紝ssrc涓嶄负null鍒欏彲浠ユ敮鎸佷竴涓�氶亾澶氭invite + if (stream != null) { + key += ("_" + stream); + } + return key; + } } -- Gitblit v1.8.0