From 2b0af3be14d3f8ac28a1cb031e21dc3a69146d2b Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期一, 25 三月 2024 17:59:09 +0800 Subject: [PATCH] 支持hook --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 35 ++++------------- src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java | 11 +++++ src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java | 18 +++++++++ src/main/java/com/genersoft/iot/vmp/service/IMediaService.java | 7 +++ 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java index 5b6f0fb..dc0edec 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/AblServerConfig.java @@ -126,6 +126,9 @@ @ConfigKeyId("on_stream_disconnect") private String onStreamDisconnect; + @ConfigKeyId("on_stream_not_found") + private String onStreamNotFound; + @ConfigKeyId("on_record_mp4") private String onRecordMp4; @@ -798,4 +801,12 @@ public void setPictureMaxCount(Integer pictureMaxCount) { this.pictureMaxCount = pictureMaxCount; } + + public String getOnStreamNotFound() { + return onStreamNotFound; + } + + public void setOnStreamNotFound(String onStreamNotFound) { + this.onStreamNotFound = onStreamNotFound; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index a247a78..b8f6f2f 100755 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -139,7 +139,6 @@ * 鏈嶅姟鍣ㄥ畾鏃朵笂鎶ユ椂闂达紝涓婃姤闂撮殧鍙厤缃紝榛樿10s涓婃姤涓�娆� */ @ResponseBody - @PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8") public HookResult onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param) { try { @@ -164,25 +163,11 @@ if (logger.isDebugEnabled()) { logger.debug("[ZLM HOOK] 鎾斁閴存潈锛歿}->{}", param.getMediaServerId(), param); } - String mediaServerId = param.getMediaServerId(); - - taskExecutor.execute(() -> { - JSONObject json = (JSONObject) JSON.toJSON(param); - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_play, json); - if (subscribe != null) { - MediaServer mediaInfo = mediaServerService.getOne(mediaServerId); - if (mediaInfo != null) { - subscribe.response(mediaInfo, param); - } - } - }); - // TODO 姝ゅ閫昏緫閫傚悎杩佺Щ鍒癕ediaService涓� - if (!"rtp".equals(param.getApp())) { - Map<String, String> paramMap = urlParamToMap(param.getParams()); - StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream()); - if (streamAuthorityInfo != null && streamAuthorityInfo.getCallId() != null && !streamAuthorityInfo.getCallId().equals(paramMap.get("callId"))) { - return new HookResult(401, "Unauthorized"); - } + Map<String, String> paramMap = urlParamToMap(param.getParams()); + // 瀵逛簬鎾斁娴佽繘琛岄壌鏉� + boolean authenticateResult = mediaService.authenticatePlay(param.getApp(), param.getStream(), paramMap.get("callId")); + if (!authenticateResult) { + return new HookResult(401, "Unauthorized"); } return HookResult.SUCCESS(); @@ -215,12 +200,14 @@ return result; } if (userSetting.getPushAuthority()) { + // 瀵逛簬鎺ㄦ祦杩涜閴存潈 + Map<String, String> paramMap = urlParamToMap(param.getParams()); // 鎺ㄦ祦閴存潈 if (param.getParams() == null) { logger.info("鎺ㄦ祦閴存潈澶辫触锛� 缂哄皯蹇呰鍙傛暟锛歴ign=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("鎺ㄦ祦閴存潈澶辫触锛� 缂哄皯蹇呰鍙傛暟锛歴ign=md5(user琛ㄧ殑pushKey)"); @@ -648,12 +635,6 @@ } return ret; } - // TODO 鎺ㄦ祦鍏锋湁涓诲姩鎬э紝鏆傛椂涓嶅仛澶勭悊 -// StreamPushItem streamPushItem = streamPushService.getPush(app, streamId); -// if (streamPushItem != null) { -// // TODO 鍙戦�佸仠姝� -// -// } } return ret; } diff --git a/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java b/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java index 338814c..9230b35 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java @@ -41,4 +41,11 @@ * @return */ StreamInfo getStreamInfoByAppAndStream(MediaServer mediaServerItem, String app, String stream, MediaInfo mediaInfo, String addr, String callId, boolean isPlay); + + /** + * 鎾斁閴存潈 + */ + boolean authenticatePlay(String app, String stream, String callId); + + boolean authenticatePublish(String app, String stream, String callId, String sign); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java index 07a28a3..9c54068 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java @@ -4,10 +4,14 @@ import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.media.bean.MediaInfo; import com.genersoft.iot.vmp.media.service.IMediaServerService; +import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener; import com.genersoft.iot.vmp.media.zlm.dto.MediaServer; import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; +import com.genersoft.iot.vmp.media.zlm.dto.hook.HookResultForOnPublish; import com.genersoft.iot.vmp.service.IMediaService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; @@ -16,6 +20,8 @@ @Service public class MediaServiceImpl implements IMediaService { + + private final static Logger logger = LoggerFactory.getLogger(MediaServiceImpl.class); @Autowired private IRedisCatchStorage redisCatchStorage; @@ -85,4 +91,16 @@ streamInfoResult.setMediaInfo(mediaInfo); return streamInfoResult; } + + @Override + public boolean authenticatePlay(String app, String stream, String callId) { + if (app == null || stream == null) { + return false; + } + if ("rtp".equals(app)) { + return true; + } + StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(app, stream); + return (streamAuthorityInfo != null && streamAuthorityInfo.getCallId() != null && !streamAuthorityInfo.getCallId().equals(callId)); + } } -- Gitblit v1.8.0