648540858
2023-06-01 dbdb9ca06d3a6a357abe52b393bb398f4e1e8a4a
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -191,13 +191,13 @@
            if (userSetting.getPushAuthority()) {
                // 推流鉴权
                if (param.getParams() == null) {
                    logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)");
                    logger.info("推流鉴权失败: 缺少必要参数:sign=md5(user表的pushKey)");
                    return new HookResultForOnPublish(401, "Unauthorized");
                }
                Map<String, String> paramMap = urlParamToMap(param.getParams());
                String sign = paramMap.get("sign");
                if (sign == null) {
                    logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)");
                    logger.info("推流鉴权失败: 缺少必要参数:sign=md5(user表的pushKey)");
                    return new HookResultForOnPublish(401, "Unauthorized");
                }
                // 推流自定义播放鉴权码
@@ -438,7 +438,7 @@
    @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8")
    public JSONObject onStreamNoneReader(@RequestBody OnStreamNoneReaderHookParam param) {
        logger.info("[ZLM HOOK]流无人观看:{]->{}->{}/{}" + param.getMediaServerId(), param.getSchema(),
        logger.info("[ZLM HOOK]流无人观看:{}->{}->{}/{}",  param.getMediaServerId(), param.getSchema(),
                param.getApp(), param.getStream());
        JSONObject ret = new JSONObject();
        ret.put("code", 0);
@@ -451,6 +451,11 @@
            InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, param.getStream());
            // 点播
            if (inviteInfo != null) {
                // 录像下载
                if (inviteInfo.getType() == InviteSessionType.DOWNLOAD) {
                    ret.put("close", false);
                    return ret;
                }
                // 收到无人观看说明流也没有在往上级推送
                if (redisCatchStorage.isChannelSendingRTP(inviteInfo.getChannelId())) {
                    List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByChnnelId(
@@ -486,48 +491,18 @@
                storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId());
                return ret;
            }
            // 录像回放
            StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null,
                    param.getStream(), null);
            if (streamInfoForPlayBackCatch != null) {
                if (streamInfoForPlayBackCatch.isPause()) {
                    ret.put("close", false);
                } else {
                    Device device = deviceService.getDevice(streamInfoForPlayBackCatch.getDeviceID());
                    if (device != null) {
                        try {
                            cmder.streamByeCmd(device, streamInfoForPlayBackCatch.getChannelId(),
                                    streamInfoForPlayBackCatch.getStream(), null);
                        } catch (InvalidArgumentException | ParseException | SipException |
                                 SsrcTransactionNotFoundException e) {
                            logger.error("[无人观看]回放, 发送BYE失败 {}", e.getMessage());
                        }
                    }
                    redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch.getDeviceID(),
                            streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null);
                }
                return ret;
            }
            // 录像下载
            StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null,
                    param.getStream(), null);
            // 进行录像下载时无人观看不断流
            if (streamInfoForDownload != null) {
                ret.put("close", false);
                return ret;
            }
        } else {
            // 非国标流 推流/拉流代理
            // 拉流代理
            StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(param.getApp(), param.getStream());
            if (streamProxyItem != null) {
                if (streamProxyItem.isEnable_remove_none_reader()) {
                if (streamProxyItem.isEnableRemoveNoneReader()) {
                    // 无人观看自动移除
                    ret.put("close", true);
                    streamProxyService.del(param.getApp(), param.getStream());
                    String url = streamProxyItem.getUrl() != null ? streamProxyItem.getUrl() : streamProxyItem.getSrc_url();
                    String url = streamProxyItem.getUrl() != null ? streamProxyItem.getUrl() : streamProxyItem.getSrcUrl();
                    logger.info("[{}/{}]<-[{}] 拉流代理无人观看已经移除", param.getApp(), param.getStream(), url);
                } else if (streamProxyItem.isEnable_disable_none_reader()) {
                } else if (streamProxyItem.isEnableDisableNoneReader()) {
                    // 无人观看停用
                    ret.put("close", true);
                    // 修改数据
@@ -612,7 +587,7 @@
        } else {
            // 拉流代理
            StreamProxyItem streamProxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(param.getApp(), param.getStream());
            if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnable_disable_none_reader()) {
            if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnableDisableNoneReader()) {
                streamProxyService.start(param.getApp(), param.getStream());
            }
            DeferredResult<HookResult> result = new DeferredResult<>();