diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZkMediaHookController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZkMediaHookController.java new file mode 100644 index 0000000..c88a72e --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/zkmedia/ZkMediaHookController.java @@ -0,0 +1,80 @@ +package org.dromara.sis.controller.zkmedia; + +import com.alibaba.fastjson2.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.sdk.zkmedia.MediaServerUtils; +import org.dromara.sis.sdk.zkmedia.model.*; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("/index/hook") +public class ZkMediaHookController { + + /** + * 服务器定时上报时间,上报间隔可配置,默认10s上报一次 + */ + @ResponseBody + @PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8") + public HookResult onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param) { + log.debug("ZLM心跳上报,params: {}", param); + return HookResult.SUCCESS(); + } + + /** + * rtsp/rtmp/rtp 推流鉴权事件。 + */ + @ResponseBody + @PostMapping(value = "/on_publish", produces = "application/json;charset=UTF-8") + public HookResult onPublish(@RequestBody OnPushParam param) { + log.info("rtsp/rtmp/rtp 推流鉴权,params: {}", param); + return HookResult.SUCCESS(); + } + + + /** + * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件。 + */ + @ResponseBody + @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8") + public HookResult onPlay(@RequestBody OnPlayHookParam param) { + Map paramMap = MediaServerUtils.urlParamToMap(param.getParams()); + // 对于播放流进行鉴权 + log.info("播放器鉴权事件,params={}", JSONObject.toJSONString(param)); + return HookResult.SUCCESS(); + } + + /** + * rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。 + */ + @ResponseBody + @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8") + public HookResult onStreamChanged(@RequestBody OnStreamChangedHookParam param) { + log.info("[ZLM HOOK] 流注销, {}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); + return HookResult.SUCCESS(); + } + + /** + * 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。 + */ + @ResponseBody + @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8") + public HookResult onStreamNoneReader(@RequestBody OnStreamNoneReaderHookParam param) { + log.info("[ZLM HOOK]流无人观看:{}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); + // TODO 关闭无人观看的流 + return HookResult.SUCCESS().setClose(true); + } + + /** + * 流未找到事件,用户可以在此事件触发时,立即去拉流,这样可以实现按需拉流;此事件对回复不敏感。 + */ + @ResponseBody + @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8") + public HookResult onStreamNotFound(@RequestBody OnStreamNotFoundHookParam param) { + log.info("[ZLM HOOK] 流未找到:{}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); + return HookResult.SUCCESS(); + } + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java index ba51923..5f3632b 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java @@ -14,8 +14,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +/** + * ZLMediaKit流媒体服务 + * + * @author lxj + */ @Slf4j -@Service("com.parkclouds.media.service.ZLMediaKitServiceImpl") +@Service public class ZLMediaKitServiceImpl implements ZLMediaKitService { @Resource @@ -141,7 +146,7 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService { commonParams.put("force", 1); R result = HttpClientUtil.get(getRequestUrl("close_streams"), commonParams, AddStreamProxyResp.class); if (result != null) { - String s =null; + String s = null; if (result.getCode() == 0) { s = "关闭流成功"; } @@ -149,7 +154,7 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService { if (result.getCode() == -1) { s = "关闭流失败"; } - log.info("{},关闭流数量:{}",s,result.getData()); + log.info("{},关闭流数量:{}", s, result.getData()); return s; } return null;