| | |
| | | @Resource |
| | | private IMediaService mediaService; |
| | | |
| | | //存储盒子的拉流地址 |
| | | private static final ConcurrentMap<String, String> BOX_STREAM_PULL_CACHE = new ConcurrentHashMap<>(); |
| | | //存储盒子的拉流用户集合 |
| | | //盒子拉流地址缓存 |
| | | private static final ConcurrentMap<String, String> BOX_STREAM_PULL_MAP = new ConcurrentHashMap<>(); |
| | | //盒子拉流用户集合缓存 |
| | | private static final ConcurrentMap<String, Set<String>> STREAM_USER_MAP = new ConcurrentHashMap<>(); |
| | | |
| | | @Override |
| | |
| | | } |
| | | } |
| | | |
| | | log.info("【stream】Received message: " + payload); |
| | | log.info("【stream】size: " + WebSocketUtil.STREAM_ONLINE_USER_SESSIONS.size()); |
| | | log.info("【stream】Received message: {}", payload); |
| | | log.info("【stream】size: {}", WebSocketUtil.STREAM_ONLINE_USER_SESSIONS.size()); |
| | | } |
| | | |
| | | //开始拉流 |
| | | private void startPullStream(String boxSn, String userId) { |
| | | //BOX_STREAM_USER_COUNT.merge(boxSn, 1, Integer::sum); |
| | | STREAM_USER_MAP.computeIfAbsent(boxSn, k -> ConcurrentHashMap.newKeySet()).add(userId); |
| | | String messageReply; |
| | | if (BOX_STREAM_PULL_CACHE.containsKey(boxSn)) { |
| | | String webrtcUrl = BOX_STREAM_PULL_CACHE.get(boxSn); |
| | | if (BOX_STREAM_PULL_MAP.containsKey(boxSn)) { |
| | | String webrtcUrl = BOX_STREAM_PULL_MAP.get(boxSn); |
| | | messageReply = webrtcUrl; |
| | | log.warn("【stream】Already pulled stream: " + webrtcUrl); |
| | | log.warn("【stream】Already pulled stream: {}", webrtcUrl); |
| | | } else { |
| | | BoxStreamUrlReceiver boxLiveUrl = tyService.getBoxLiveUrl(boxSn); |
| | | if (boxLiveUrl != null) { |
| | | ArdVtdu vtdu = ArdVtdu.builder().name(boxSn).mode(0).isCode(0).rtspSource(boxLiveUrl.getRtmp()).build(); |
| | | ArdVtdu vtdu = ArdVtdu.builder().name(boxSn).mode(0).isCode(0).rtspSource(boxLiveUrl.getRtsp()).build(); |
| | | ArdVtdu ardVtdu = mediaService.addPath(vtdu); |
| | | BOX_STREAM_PULL_CACHE.put(boxSn, ardVtdu.getWebrtcUrl()); |
| | | BOX_STREAM_PULL_MAP.put(boxSn, ardVtdu.getWebrtcUrl()); |
| | | messageReply = ardVtdu.getWebrtcUrl(); |
| | | log.warn("【stream】First pulled stream: " + ardVtdu.getWebrtcUrl()); |
| | | log.warn("【stream】First pulled stream: {}", ardVtdu.getWebrtcUrl()); |
| | | } else { |
| | | log.warn("【stream】Box stream not found: " + boxSn); |
| | | log.warn("【stream】Box stream not found: {}", boxSn); |
| | | messageReply = "【stream】Box stream not found: " + boxSn; |
| | | } |
| | | } |
| | |
| | | //关闭拉流 |
| | | private void closeStream(String boxSn) { |
| | | mediaService.removePath(boxSn); |
| | | BOX_STREAM_PULL_CACHE.remove(boxSn); |
| | | BOX_STREAM_PULL_MAP.remove(boxSn); |
| | | STREAM_USER_MAP.remove(boxSn); |
| | | log.warn("【stream】Stream closed due to no active users: " + boxSn); |
| | | log.warn("【stream】Stream closed due to no active users: {}", boxSn); |
| | | } |
| | | |
| | | @Override |
| | | public void afterConnectionEstablished(WebSocketSession session) { |
| | | String userId = (String) session.getAttributes().get("userId"); |
| | | WebSocketUtil.STREAM_ONLINE_USER_SESSIONS.put(userId, session); |
| | | log.info("【stream】Connected: " + session.getId()); |
| | | log.info("【stream】size: " + WebSocketUtil.STREAM_ONLINE_USER_SESSIONS.size()); |
| | | log.info("【stream】Connected: {}", session.getId()); |
| | | log.info("【stream】size: {}", WebSocketUtil.STREAM_ONLINE_USER_SESSIONS.size()); |
| | | } |
| | | |
| | | @Override |
| | |
| | | String userId = (String) session.getAttributes().get("userId"); |
| | | WebSocketUtil.STREAM_ONLINE_USER_SESSIONS.remove(userId); |
| | | STREAM_USER_MAP.forEach((boxSn, users) -> stopPullStream(boxSn, userId)); |
| | | log.info("【stream】Disconnected: " + session.getId()); |
| | | log.info("【stream】size: " + WebSocketUtil.STREAM_ONLINE_USER_SESSIONS.size()); |
| | | log.info("【stream】Disconnected: {}", session.getId()); |
| | | log.info("【stream】size: {}", WebSocketUtil.STREAM_ONLINE_USER_SESSIONS.size()); |
| | | } |
| | | } |