|
|
@@ -54,15 +54,15 @@ public class WebsockServer extends PublishServer {
|
|
|
|
|
|
// 维护 streamId(sim+logic) 与 原始视频 channelId 的映射(注意是jtt1078设备的ChannelId),带有路径前缀
|
|
|
// streamIdToChannelId key=(streamID,prefix), value=channelId
|
|
|
- private final Map<CommUtils.InfoItem,String> streamIdToChannelId = new ConcurrentHashMap<>();
|
|
|
+ private final Map<CommUtils.InfoItem, String> streamIdToChannelId = new ConcurrentHashMap<>();
|
|
|
// channelIdToStreamId key=channelId, value=(streamID,prefix)
|
|
|
private final Map<String, CommUtils.InfoItem> channelIdToStreamId = new ConcurrentHashMap<>();
|
|
|
|
|
|
// 订阅数据结构
|
|
|
- // 按照streamId 为 key,ChannelGroup(包含多个channel) 为 value
|
|
|
- private final Map<String, ChannelGroup> streamGroups = new ConcurrentHashMap<>();
|
|
|
- // 按照channelId 为 key,streamId 为 value
|
|
|
- private final Map<ChannelId, String> channelStreamMap = new ConcurrentHashMap<>();
|
|
|
+ // 按照(streamID,prefix) 为 key,ChannelGroup(包含多个channel) 为 value
|
|
|
+ private final Map<CommUtils.InfoItem, ChannelGroup> streamGroups = new ConcurrentHashMap<>();
|
|
|
+ // 按照channelId 为 key,(streamID,prefix) 为 value
|
|
|
+ private final Map<ChannelId, CommUtils.InfoItem> channelStreamMap = new ConcurrentHashMap<>();
|
|
|
|
|
|
// 按照channel为key,streamRelay为value,方便断开时清理
|
|
|
private final Map<ChannelId, StreamRelay> channelRelayMap = new ConcurrentHashMap<>();
|
|
|
@@ -158,11 +158,11 @@ public class WebsockServer extends PublishServer {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void broadcast(String streamId, byte[] data) {
|
|
|
+ public void broadcast(String streamId, byte[] data, String prefix) {
|
|
|
if (streamId == null || streamId.isEmpty() || data == null || data.length == 0) {
|
|
|
return;
|
|
|
}
|
|
|
- ChannelGroup g = streamGroups.get(streamId);
|
|
|
+ ChannelGroup g = streamGroups.get(new CommUtils.InfoItem(streamId, prefix));
|
|
|
if (g != null && !g.isEmpty()) {
|
|
|
g.writeAndFlush(new BinaryWebSocketFrame(Unpooled.wrappedBuffer(data)));
|
|
|
}
|
|
|
@@ -281,11 +281,12 @@ public class WebsockServer extends PublishServer {
|
|
|
if (streamId == null || streamId.isEmpty() || ch == null) {
|
|
|
return;
|
|
|
}
|
|
|
+ CommUtils.InfoItem infoItem = new CommUtils.InfoItem(streamId, relay.getPrefix());
|
|
|
// 将channel加入对应的ChannelGroup
|
|
|
- ChannelGroup group = streamGroups.computeIfAbsent(streamId,
|
|
|
+ ChannelGroup group = streamGroups.computeIfAbsent(infoItem,
|
|
|
k -> new DefaultChannelGroup(workerGroup.next()));
|
|
|
group.add(ch);
|
|
|
- channelStreamMap.put(ch.id(), streamId);
|
|
|
+ channelStreamMap.put(ch.id(), infoItem);
|
|
|
|
|
|
// 将流转发器与channel关联
|
|
|
channelRelayMap.put(ch.id(), relay);
|
|
|
@@ -296,13 +297,14 @@ public class WebsockServer extends PublishServer {
|
|
|
if (ch == null) {
|
|
|
return;
|
|
|
}
|
|
|
- String sid = channelStreamMap.remove(ch.id());
|
|
|
- if (sid != null) {
|
|
|
- ChannelGroup g = streamGroups.get(sid);
|
|
|
+ CommUtils.InfoItem infoItem = channelStreamMap.remove(ch.id());
|
|
|
+ if (infoItem != null && infoItem.getTitle() != null) {
|
|
|
+ String sid = infoItem.getTitle();
|
|
|
+ ChannelGroup g = streamGroups.get(infoItem);
|
|
|
if (g != null) {
|
|
|
g.remove(ch);
|
|
|
if (g.isEmpty()) {
|
|
|
- streamGroups.remove(sid);
|
|
|
+ streamGroups.remove(infoItem);
|
|
|
// 移除流与通道映射
|
|
|
StreamRelay relay = channelRelayMap.remove(ch.id());
|
|
|
String currPrefix = relay.getPrefix();
|