Jtt1078AudioBroadcastManager.java
2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.genersoft.iot.vmp.jtt1078.websocket;
import com.genersoft.iot.vmp.jtt1078.util.AudioCodecUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.Session;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
@Component
public class Jtt1078AudioBroadcastManager {
private static final Logger logger = LoggerFactory.getLogger(Jtt1078AudioBroadcastManager.class);
private static final ConcurrentHashMap<String, Set<Session>> sessionMap = new ConcurrentHashMap<>();
public static void addSession(String sim, int channel, Session session) {
String key = sim + "_" + channel;
sessionMap.computeIfAbsent(key, k -> new CopyOnWriteArraySet<>()).add(session);
logger.info("Frontend joined audio stream: {}", key);
}
public static void removeSession(String sim, int channel, Session session) {
String key = sim + "_" + channel;
Set<Session> sessions = sessionMap.get(key);
if (sessions != null) {
sessions.remove(session);
if (sessions.isEmpty()) {
sessionMap.remove(key);
}
}
}
public static void broadcastAudio(String sim, int channel, byte[] g711Data) {
String key = sim + "_" + channel;
Set<Session> sessions = sessionMap.get(key);
if (sessions != null && !sessions.isEmpty()) {
// 转码: G.711A -> PCM (浏览器友好)
byte[] pcmData = AudioCodecUtil.g711aToPcm(g711Data);
ByteBuffer buffer = ByteBuffer.wrap(pcmData);
for (Session session : sessions) {
if (session.isOpen()) {
try {
synchronized (session) {
session.getBasicRemote().sendBinary(buffer.duplicate());
}
} catch (IOException e) {
logger.error("WebSocket send error", e);
}
}
}
}
}
}