Commit 96bb3814f65edb36327eb02f2ea1beed30f06dfc
Merge branch 'wvp-28181-2.0' into wvp-28181-2.0-multi-network
# Conflicts: # src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java # src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java # src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java # web_src/src/components/dialog/devicePlayer.vue # web_src/src/components/live.vue
Showing
91 changed files
with
737 additions
and
628 deletions
doc/_content/qa/play_error.md
pom.xml
| @@ -153,13 +153,17 @@ | @@ -153,13 +153,17 @@ | ||
| 153 | <version>2.1.3</version> | 153 | <version>2.1.3</version> |
| 154 | </dependency> | 154 | </dependency> |
| 155 | 155 | ||
| 156 | - <!-- json解析库fastjson --> | 156 | + <!-- json解析库fastjson2 --> |
| 157 | <dependency> | 157 | <dependency> |
| 158 | - <groupId>com.alibaba</groupId> | ||
| 159 | - <artifactId>fastjson</artifactId> | ||
| 160 | - <version>1.2.83</version> | 158 | + <groupId>com.alibaba.fastjson2</groupId> |
| 159 | + <artifactId>fastjson2</artifactId> | ||
| 160 | + <version>2.0.17</version> | ||
| 161 | + </dependency> | ||
| 162 | + <dependency> | ||
| 163 | + <groupId>com.alibaba.fastjson2</groupId> | ||
| 164 | + <artifactId>fastjson2-extension</artifactId> | ||
| 165 | + <version>2.0.17</version> | ||
| 161 | </dependency> | 166 | </dependency> |
| 162 | - | ||
| 163 | 167 | ||
| 164 | <!-- okhttp --> | 168 | <!-- okhttp --> |
| 165 | <dependency> | 169 | <dependency> |
src/main/java/com/genersoft/iot/vmp/common/VersionPo.java
src/main/java/com/genersoft/iot/vmp/conf/GlobalResponseAdvice.java
| 1 | package com.genersoft.iot.vmp.conf; | 1 | package com.genersoft.iot.vmp.conf; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter; | ||
| 5 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; | 5 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| 6 | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; | 6 | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
| 7 | import org.jetbrains.annotations.NotNull; | 7 | import org.jetbrains.annotations.NotNull; |
src/main/java/com/genersoft/iot/vmp/conf/MediaStatusTimerTask.java
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
| @@ -37,6 +37,8 @@ public class UserSetting { | @@ -37,6 +37,8 @@ public class UserSetting { | ||
| 37 | 37 | ||
| 38 | private Boolean streamOnDemand = Boolean.TRUE; | 38 | private Boolean streamOnDemand = Boolean.TRUE; |
| 39 | 39 | ||
| 40 | + private Boolean pushAuthority = Boolean.TRUE; | ||
| 41 | + | ||
| 40 | private String serverId = "000000"; | 42 | private String serverId = "000000"; |
| 41 | 43 | ||
| 42 | private String thirdPartyGBIdReg = "[\\s\\S]*"; | 44 | private String thirdPartyGBIdReg = "[\\s\\S]*"; |
| @@ -166,4 +168,12 @@ public class UserSetting { | @@ -166,4 +168,12 @@ public class UserSetting { | ||
| 166 | public void setUseSourceIpAsStreamIp(Boolean useSourceIpAsStreamIp) { | 168 | public void setUseSourceIpAsStreamIp(Boolean useSourceIpAsStreamIp) { |
| 167 | this.useSourceIpAsStreamIp = useSourceIpAsStreamIp; | 169 | this.useSourceIpAsStreamIp = useSourceIpAsStreamIp; |
| 168 | } | 170 | } |
| 171 | + | ||
| 172 | + public Boolean getPushAuthority() { | ||
| 173 | + return pushAuthority; | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + public void setPushAuthority(Boolean pushAuthority) { | ||
| 177 | + this.pushAuthority = pushAuthority; | ||
| 178 | + } | ||
| 169 | } | 179 | } |
src/main/java/com/genersoft/iot/vmp/conf/WVPTimerTask.java
| 1 | package com.genersoft.iot.vmp.conf; | 1 | package com.genersoft.iot.vmp.conf; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.service.IMediaServerService; | 4 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| 5 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 5 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 6 | import org.springframework.beans.factory.annotation.Autowired; | 6 | import org.springframework.beans.factory.annotation.Autowired; |
src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java
| 1 | package com.genersoft.iot.vmp.conf.redis; | 1 | package com.genersoft.iot.vmp.conf.redis; |
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | -import com.alibaba.fastjson.parser.ParserConfig; | ||
| 5 | import com.genersoft.iot.vmp.common.VideoManagerConstants; | 4 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 6 | import com.genersoft.iot.vmp.service.redisMsg.*; | 5 | import com.genersoft.iot.vmp.service.redisMsg.*; |
| 7 | import org.springframework.beans.factory.annotation.Autowired; | 6 | import org.springframework.beans.factory.annotation.Autowired; |
| @@ -55,8 +54,7 @@ public class RedisConfig extends CachingConfigurerSupport { | @@ -55,8 +54,7 @@ public class RedisConfig extends CachingConfigurerSupport { | ||
| 55 | // value值的序列化采用fastJsonRedisSerializer | 54 | // value值的序列化采用fastJsonRedisSerializer |
| 56 | redisTemplate.setValueSerializer(fastJsonRedisSerializer); | 55 | redisTemplate.setValueSerializer(fastJsonRedisSerializer); |
| 57 | redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); | 56 | redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); |
| 58 | - // 全局开启AutoType,不建议使用 | ||
| 59 | - ParserConfig.getGlobalInstance().setAutoTypeSupport(true); | 57 | + |
| 60 | // key的序列化采用StringRedisSerializer | 58 | // key的序列化采用StringRedisSerializer |
| 61 | redisTemplate.setKeySerializer(new StringRedisSerializer()); | 59 | redisTemplate.setKeySerializer(new StringRedisSerializer()); |
| 62 | redisTemplate.setHashKeySerializer(new StringRedisSerializer()); | 60 | redisTemplate.setHashKeySerializer(new StringRedisSerializer()); |
src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java
| 1 | package com.genersoft.iot.vmp.conf.security; | 1 | package com.genersoft.iot.vmp.conf.security; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; | 4 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| 5 | import org.apache.poi.hssf.eventmodel.ERFListener; | 5 | import org.apache.poi.hssf.eventmodel.ERFListener; |
| 6 | import org.slf4j.Logger; | 6 | import org.slf4j.Logger; |
src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamInfo.java
| 1 | package com.genersoft.iot.vmp.gb28181.bean; | 1 | package com.genersoft.iot.vmp.gb28181.bean; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 4 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 5 | 5 | ||
| 6 | public class InviteStreamInfo { | 6 | public class InviteStreamInfo { |
src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
| @@ -42,7 +42,7 @@ public class CatalogDataCatch { | @@ -42,7 +42,7 @@ public class CatalogDataCatch { | ||
| 42 | catalogData.setSn(sn); | 42 | catalogData.setSn(sn); |
| 43 | catalogData.setTotal(total); | 43 | catalogData.setTotal(total); |
| 44 | catalogData.setDevice(device); | 44 | catalogData.setDevice(device); |
| 45 | - catalogData.setChannelList(Collections.synchronizedList(new ArrayList<>())); | 45 | + catalogData.setChannelList(deviceChannelList); |
| 46 | catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); | 46 | catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); |
| 47 | catalogData.setLastTime(Instant.now()); | 47 | catalogData.setLastTime(Instant.now()); |
| 48 | data.put(deviceId, catalogData); | 48 | data.put(deviceId, catalogData); |
src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java
| 1 | package com.genersoft.iot.vmp.gb28181.task; | 1 | package com.genersoft.iot.vmp.gb28181.task; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.conf.UserSetting; | 4 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 6 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.common.StreamInfo; | 4 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 5 | import com.genersoft.iot.vmp.conf.DynamicTask; | 5 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 6 | import com.genersoft.iot.vmp.conf.SipConfig; | 6 | import com.genersoft.iot.vmp.conf.SipConfig; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | ||
| 4 | -import com.genersoft.iot.vmp.gb28181.SipLayer; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.gb28181.bean.*; | 5 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 6 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; | 6 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| 7 | import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; | 7 | import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; |
| @@ -347,7 +347,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { | @@ -347,7 +347,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { | ||
| 347 | return; | 347 | return; |
| 348 | } | 348 | } |
| 349 | logger.info("[发送报警通知] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), | 349 | logger.info("[发送报警通知] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), |
| 350 | - deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSONObject.toJSON(deviceAlarm)); | 350 | + deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSON.toJSONString(deviceAlarm)); |
| 351 | String characterSet = parentPlatform.getCharacterSet(); | 351 | String characterSet = parentPlatform.getCharacterSet(); |
| 352 | StringBuffer deviceStatusXml = new StringBuffer(600); | 352 | StringBuffer deviceStatusXml = new StringBuffer(600); |
| 353 | deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); | 353 | deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 4 | import com.genersoft.iot.vmp.conf.DynamicTask; | 5 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 6 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; | 7 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; |
| @@ -141,7 +142,7 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In | @@ -141,7 +142,7 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In | ||
| 141 | logger.info("调用ZLM推流接口, 结果: {}", jsonObject); | 142 | logger.info("调用ZLM推流接口, 结果: {}", jsonObject); |
| 142 | logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port")); | 143 | logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port")); |
| 143 | } else { | 144 | } else { |
| 144 | - logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param)); | 145 | + logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"), JSON.toJSONString(param)); |
| 145 | if (sendRtpItem.isOnlyAudio()) { | 146 | if (sendRtpItem.isOnlyAudio()) { |
| 146 | // TODO 可能是语音对讲 | 147 | // TODO 可能是语音对讲 |
| 147 | }else { | 148 | }else { |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.conf.DynamicTask; | 4 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 5 | import com.genersoft.iot.vmp.conf.UserSetting; | 5 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.*; | 6 | import com.genersoft.iot.vmp.gb28181.bean.*; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.conf.SipConfig; | 4 | import com.genersoft.iot.vmp.conf.SipConfig; |
| 5 | import com.genersoft.iot.vmp.conf.UserSetting; | 5 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.*; | 6 | import com.genersoft.iot.vmp.gb28181.bean.*; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 4 | import com.genersoft.iot.vmp.conf.SipConfig; | 5 | import com.genersoft.iot.vmp.conf.SipConfig; |
| 5 | import com.genersoft.iot.vmp.conf.UserSetting; | 6 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.*; | 7 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| @@ -184,7 +185,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme | @@ -184,7 +185,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme | ||
| 184 | deviceAlarm.setAlarmType(getText(sipMsgInfo.getRootElement().element("Info"), "AlarmType")); | 185 | deviceAlarm.setAlarmType(getText(sipMsgInfo.getRootElement().element("Info"), "AlarmType")); |
| 185 | } | 186 | } |
| 186 | } | 187 | } |
| 187 | - logger.info("[收到报警通知]内容:{}", JSONObject.toJSON(deviceAlarm)); | 188 | + logger.info("[收到报警通知]内容:{}", JSON.toJSONString(deviceAlarm)); |
| 188 | if ("7".equals(deviceAlarm.getAlarmMethod()) ) { | 189 | if ("7".equals(deviceAlarm.getAlarmMethod()) ) { |
| 189 | // 发送给平台的报警信息。 发送redis通知 | 190 | // 发送给平台的报警信息。 发送redis通知 |
| 190 | AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage(); | 191 | AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage(); |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.conf.UserSetting; | 4 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.*; | 5 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/AlarmResponseMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/ConfigDownloadResponseMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| 6 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | 6 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceConfigResponseMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceControlResponseMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 5 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/DeviceStatusResponseMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.common.VideoManagerConstants; | 4 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 6 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java
| 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; | 1 | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.conf.UserSetting; | 4 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.*; | 5 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; |
src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
| 1 | package com.genersoft.iot.vmp.gb28181.utils; | 1 | package com.genersoft.iot.vmp.gb28181.utils; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONArray; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONArray; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | 6 | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
| 7 | import com.genersoft.iot.vmp.gb28181.bean.TreeType; | 7 | import com.genersoft.iot.vmp.gb28181.bean.TreeType; |
src/main/java/com/genersoft/iot/vmp/media/zlm/AssistRESTfulUtils.java
| 1 | package com.genersoft.iot.vmp.media.zlm; | 1 | package com.genersoft.iot.vmp.media.zlm; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 6 | import okhttp3.*; | 6 | import okhttp3.*; |
| 7 | import okhttp3.logging.HttpLoggingInterceptor; | 7 | import okhttp3.logging.HttpLoggingInterceptor; |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
| @@ -5,7 +5,7 @@ import java.util.HashMap; | @@ -5,7 +5,7 @@ import java.util.HashMap; | ||
| 5 | import java.util.List; | 5 | import java.util.List; |
| 6 | import java.util.Map; | 6 | import java.util.Map; |
| 7 | 7 | ||
| 8 | -import com.alibaba.fastjson.JSON; | 8 | +import com.alibaba.fastjson2.JSON; |
| 9 | import com.genersoft.iot.vmp.common.StreamInfo; | 9 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 10 | import com.genersoft.iot.vmp.conf.UserSetting; | 10 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 11 | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; | 11 | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 14 | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; | 14 | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| 15 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; | 15 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; |
| 16 | import com.genersoft.iot.vmp.media.zlm.dto.*; | 16 | import com.genersoft.iot.vmp.media.zlm.dto.*; |
| 17 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.*; | ||
| 17 | import com.genersoft.iot.vmp.service.*; | 18 | import com.genersoft.iot.vmp.service.*; |
| 18 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 19 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 19 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; | 20 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| @@ -29,7 +30,7 @@ import org.springframework.web.bind.annotation.RequestMapping; | @@ -29,7 +30,7 @@ import org.springframework.web.bind.annotation.RequestMapping; | ||
| 29 | import org.springframework.web.bind.annotation.ResponseBody; | 30 | import org.springframework.web.bind.annotation.ResponseBody; |
| 30 | import org.springframework.web.bind.annotation.RestController; | 31 | import org.springframework.web.bind.annotation.RestController; |
| 31 | 32 | ||
| 32 | -import com.alibaba.fastjson.JSONObject; | 33 | +import com.alibaba.fastjson2.JSONObject; |
| 33 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | 34 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| 34 | 35 | ||
| 35 | import javax.servlet.http.HttpServletRequest; | 36 | import javax.servlet.http.HttpServletRequest; |
| @@ -108,17 +109,20 @@ public class ZLMHttpHookListener { | @@ -108,17 +109,20 @@ public class ZLMHttpHookListener { | ||
| 108 | */ | 109 | */ |
| 109 | @ResponseBody | 110 | @ResponseBody |
| 110 | @PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8") | 111 | @PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8") |
| 111 | - public JSONObject onServerKeepalive(@RequestBody JSONObject json){ | 112 | + public JSONObject onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param){ |
| 112 | 113 | ||
| 113 | - logger.info("[ ZLM HOOK ]on_server_keepalive API调用,参数:" + json.toString()); | ||
| 114 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 115 | - List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_keepalive); | ||
| 116 | - if (subscribes != null && subscribes.size() > 0) { | ||
| 117 | - for (ZlmHttpHookSubscribe.Event subscribe : subscribes) { | ||
| 118 | - subscribe.response(null, json); | 114 | + logger.info("[ZLM HOOK] 收到zlm心跳:" + param.getMediaServerId()); |
| 115 | + | ||
| 116 | + taskExecutor.execute(()->{ | ||
| 117 | + List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_keepalive); | ||
| 118 | + JSONObject json = (JSONObject) JSON.toJSON(param); | ||
| 119 | + if (subscribes != null && subscribes.size() > 0) { | ||
| 120 | + for (ZlmHttpHookSubscribe.Event subscribe : subscribes) { | ||
| 121 | + subscribe.response(null, json); | ||
| 122 | + } | ||
| 119 | } | 123 | } |
| 120 | - } | ||
| 121 | - mediaServerService.updateMediaServerKeepalive(mediaServerId, json.getJSONObject("data")); | 124 | + }); |
| 125 | + mediaServerService.updateMediaServerKeepalive(param.getMediaServerId(), param.getData()); | ||
| 122 | 126 | ||
| 123 | JSONObject ret = new JSONObject(); | 127 | JSONObject ret = new JSONObject(); |
| 124 | ret.put("code", 0); | 128 | ret.put("code", 0); |
| @@ -126,43 +130,6 @@ public class ZLMHttpHookListener { | @@ -126,43 +130,6 @@ public class ZLMHttpHookListener { | ||
| 126 | 130 | ||
| 127 | return ret; | 131 | return ret; |
| 128 | } | 132 | } |
| 129 | - | ||
| 130 | - /** | ||
| 131 | - * 流量统计事件,播放器或推流器断开时并且耗用流量超过特定阈值时会触发此事件,阈值通过配置文件general.flowThreshold配置;此事件对回复不敏感。 | ||
| 132 | - * | ||
| 133 | - */ | ||
| 134 | - @ResponseBody | ||
| 135 | - @PostMapping(value = "/on_flow_report", produces = "application/json;charset=UTF-8") | ||
| 136 | - public JSONObject onFlowReport(@RequestBody JSONObject json){ | ||
| 137 | - | ||
| 138 | - if (logger.isDebugEnabled()) { | ||
| 139 | - logger.debug("[ ZLM HOOK ]on_flow_report API调用,参数:" + json.toString()); | ||
| 140 | - } | ||
| 141 | - JSONObject ret = new JSONObject(); | ||
| 142 | - ret.put("code", 0); | ||
| 143 | - ret.put("msg", "success"); | ||
| 144 | - return ret; | ||
| 145 | - } | ||
| 146 | - | ||
| 147 | - /** | ||
| 148 | - * 访问http文件服务器上hls之外的文件时触发。 | ||
| 149 | - * | ||
| 150 | - */ | ||
| 151 | - @ResponseBody | ||
| 152 | - @PostMapping(value = "/on_http_access", produces = "application/json;charset=UTF-8") | ||
| 153 | - public JSONObject onHttpAccess(@RequestBody JSONObject json){ | ||
| 154 | - | ||
| 155 | - if (logger.isDebugEnabled()) { | ||
| 156 | - logger.debug("[ ZLM HOOK ]on_http_access API 调用,参数:" + json.toString()); | ||
| 157 | - } | ||
| 158 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 159 | - JSONObject ret = new JSONObject(); | ||
| 160 | - ret.put("code", 0); | ||
| 161 | - ret.put("err", ""); | ||
| 162 | - ret.put("path", ""); | ||
| 163 | - ret.put("second", 600); | ||
| 164 | - return ret; | ||
| 165 | - } | ||
| 166 | 133 | ||
| 167 | /** | 134 | /** |
| 168 | * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件。 | 135 | * 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件。 |
| @@ -171,20 +138,21 @@ public class ZLMHttpHookListener { | @@ -171,20 +138,21 @@ public class ZLMHttpHookListener { | ||
| 171 | @ResponseBody | 138 | @ResponseBody |
| 172 | @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8") | 139 | @PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8") |
| 173 | public JSONObject onPlay(@RequestBody OnPlayHookParam param){ | 140 | public JSONObject onPlay(@RequestBody OnPlayHookParam param){ |
| 174 | - | ||
| 175 | - JSONObject json = (JSONObject)JSON.toJSON(param); | ||
| 176 | - | ||
| 177 | if (logger.isDebugEnabled()) { | 141 | if (logger.isDebugEnabled()) { |
| 178 | - logger.debug("[ ZLM HOOK ]on_play API调用,参数:" + JSON.toJSONString(param)); | 142 | + logger.debug("[ZLM HOOK] 播放鉴权:{}->{}" + param.getMediaServerId(), param); |
| 179 | } | 143 | } |
| 180 | String mediaServerId = param.getMediaServerId(); | 144 | String mediaServerId = param.getMediaServerId(); |
| 181 | - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_play, json); | ||
| 182 | - if (subscribe != null ) { | ||
| 183 | - MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); | ||
| 184 | - if (mediaInfo != null) { | ||
| 185 | - subscribe.response(mediaInfo, json); | 145 | + |
| 146 | + taskExecutor.execute(()->{ | ||
| 147 | + JSONObject json = (JSONObject) JSON.toJSON(param); | ||
| 148 | + ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_play, json); | ||
| 149 | + if (subscribe != null ) { | ||
| 150 | + MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); | ||
| 151 | + if (mediaInfo != null) { | ||
| 152 | + subscribe.response(mediaInfo, json); | ||
| 153 | + } | ||
| 186 | } | 154 | } |
| 187 | - } | 155 | + }); |
| 188 | JSONObject ret = new JSONObject(); | 156 | JSONObject ret = new JSONObject(); |
| 189 | if (!"rtp".equals(param.getApp())) { | 157 | if (!"rtp".equals(param.getApp())) { |
| 190 | Map<String, String> paramMap = urlParamToMap(param.getParams()); | 158 | Map<String, String> paramMap = urlParamToMap(param.getParams()); |
| @@ -211,46 +179,49 @@ public class ZLMHttpHookListener { | @@ -211,46 +179,49 @@ public class ZLMHttpHookListener { | ||
| 211 | 179 | ||
| 212 | JSONObject json = (JSONObject) JSON.toJSON(param); | 180 | JSONObject json = (JSONObject) JSON.toJSON(param); |
| 213 | 181 | ||
| 214 | - logger.info("[ ZLM HOOK ]on_publish API调用,参数:" + json.toString()); | 182 | + logger.info("[ZLM HOOK]推流鉴权:{}->{}", param.getMediaServerId(), param); |
| 215 | JSONObject ret = new JSONObject(); | 183 | JSONObject ret = new JSONObject(); |
| 216 | String mediaServerId = json.getString("mediaServerId"); | 184 | String mediaServerId = json.getString("mediaServerId"); |
| 217 | MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); | 185 | MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); |
| 186 | + | ||
| 218 | if (!"rtp".equals(param.getApp())) { | 187 | if (!"rtp".equals(param.getApp())) { |
| 219 | - // 推流鉴权 | ||
| 220 | - if (param.getParams() == null) { | ||
| 221 | - logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)"); | ||
| 222 | - ret.put("code", 401); | ||
| 223 | - ret.put("msg", "Unauthorized"); | ||
| 224 | - return ret; | ||
| 225 | - } | ||
| 226 | - Map<String, String> paramMap = urlParamToMap(param.getParams()); | ||
| 227 | - String sign = paramMap.get("sign"); | ||
| 228 | - if (sign == null) { | ||
| 229 | - logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)"); | ||
| 230 | - ret.put("code", 401); | ||
| 231 | - ret.put("msg", "Unauthorized"); | ||
| 232 | - return ret; | ||
| 233 | - } | ||
| 234 | - // 推流自定义播放鉴权码 | ||
| 235 | - String callId = paramMap.get("callId"); | ||
| 236 | - // 鉴权配置 | ||
| 237 | - boolean hasAuthority = userService.checkPushAuthority(callId, sign); | ||
| 238 | - if (!hasAuthority) { | ||
| 239 | - logger.info("推流鉴权失败: sign 无权限: callId={}. sign={}", callId, sign); | ||
| 240 | - ret.put("code", 401); | ||
| 241 | - ret.put("msg", "Unauthorized"); | ||
| 242 | - return ret; | ||
| 243 | - } | ||
| 244 | - StreamAuthorityInfo streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(param); | ||
| 245 | - streamAuthorityInfo.setCallId(callId); | ||
| 246 | - streamAuthorityInfo.setSign(sign); | ||
| 247 | - // 鉴权通过 | ||
| 248 | - redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo); | ||
| 249 | - // 通知assist新的callId | ||
| 250 | - if (mediaInfo != null && mediaInfo.getRecordAssistPort() > 0) { | ||
| 251 | - taskExecutor.execute(()->{ | ||
| 252 | - assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null); | ||
| 253 | - }); | 188 | + if (userSetting.getPushAuthority()) { |
| 189 | +// 推流鉴权 | ||
| 190 | + if (param.getParams() == null) { | ||
| 191 | + logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)"); | ||
| 192 | + ret.put("code", 401); | ||
| 193 | + ret.put("msg", "Unauthorized"); | ||
| 194 | + return ret; | ||
| 195 | + } | ||
| 196 | + Map<String, String> paramMap = urlParamToMap(param.getParams()); | ||
| 197 | + String sign = paramMap.get("sign"); | ||
| 198 | + if (sign == null) { | ||
| 199 | + logger.info("推流鉴权失败: 缺少不要参数:sign=md5(user表的pushKey)"); | ||
| 200 | + ret.put("code", 401); | ||
| 201 | + ret.put("msg", "Unauthorized"); | ||
| 202 | + return ret; | ||
| 203 | + } | ||
| 204 | + // 推流自定义播放鉴权码 | ||
| 205 | + String callId = paramMap.get("callId"); | ||
| 206 | + // 鉴权配置 | ||
| 207 | + boolean hasAuthority = userService.checkPushAuthority(callId, sign); | ||
| 208 | + if (!hasAuthority) { | ||
| 209 | + logger.info("推流鉴权失败: sign 无权限: callId={}. sign={}", callId, sign); | ||
| 210 | + ret.put("code", 401); | ||
| 211 | + ret.put("msg", "Unauthorized"); | ||
| 212 | + return ret; | ||
| 213 | + } | ||
| 214 | + StreamAuthorityInfo streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(param); | ||
| 215 | + streamAuthorityInfo.setCallId(callId); | ||
| 216 | + streamAuthorityInfo.setSign(sign); | ||
| 217 | + // 鉴权通过 | ||
| 218 | + redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo); | ||
| 219 | + // 通知assist新的callId | ||
| 220 | + if (mediaInfo != null && mediaInfo.getRecordAssistPort() > 0) { | ||
| 221 | + taskExecutor.execute(()->{ | ||
| 222 | + assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null); | ||
| 223 | + }); | ||
| 224 | + } | ||
| 254 | } | 225 | } |
| 255 | }else { | 226 | }else { |
| 256 | zlmMediaListManager.sendStreamEvent(param.getApp(),param.getStream(), param.getMediaServerId()); | 227 | zlmMediaListManager.sendStreamEvent(param.getApp(),param.getStream(), param.getMediaServerId()); |
| @@ -258,21 +229,22 @@ public class ZLMHttpHookListener { | @@ -258,21 +229,22 @@ public class ZLMHttpHookListener { | ||
| 258 | 229 | ||
| 259 | ret.put("code", 0); | 230 | ret.put("code", 0); |
| 260 | ret.put("msg", "success"); | 231 | ret.put("msg", "success"); |
| 261 | - ret.put("enable_hls", true); | 232 | + |
| 262 | if (!"rtp".equals(param.getApp())) { | 233 | if (!"rtp".equals(param.getApp())) { |
| 263 | ret.put("enable_audio", true); | 234 | ret.put("enable_audio", true); |
| 264 | } | 235 | } |
| 265 | 236 | ||
| 266 | - | ||
| 267 | - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_publish, json); | ||
| 268 | - if (subscribe != null) { | ||
| 269 | - if (mediaInfo != null) { | ||
| 270 | - subscribe.response(mediaInfo, json); | ||
| 271 | - }else { | ||
| 272 | - ret.put("code", 1); | ||
| 273 | - ret.put("msg", "zlm not register"); | 237 | + taskExecutor.execute(()->{ |
| 238 | + ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_publish, json); | ||
| 239 | + if (subscribe != null) { | ||
| 240 | + if (mediaInfo != null) { | ||
| 241 | + subscribe.response(mediaInfo, json); | ||
| 242 | + }else { | ||
| 243 | + ret.put("code", 1); | ||
| 244 | + ret.put("msg", "zlm not register"); | ||
| 245 | + } | ||
| 274 | } | 246 | } |
| 275 | - } | 247 | + }); |
| 276 | 248 | ||
| 277 | if ("rtp".equals(param.getApp())) { | 249 | if ("rtp".equals(param.getApp())) { |
| 278 | ret.put("enable_mp4", userSetting.getRecordSip()); | 250 | ret.put("enable_mp4", userSetting.getRecordSip()); |
| @@ -292,111 +264,8 @@ public class ZLMHttpHookListener { | @@ -292,111 +264,8 @@ public class ZLMHttpHookListener { | ||
| 292 | ret.put("mp4_max_second", 10); | 264 | ret.put("mp4_max_second", 10); |
| 293 | ret.put("enable_mp4", true); | 265 | ret.put("enable_mp4", true); |
| 294 | ret.put("enable_audio", true); | 266 | ret.put("enable_audio", true); |
| 295 | - | ||
| 296 | - } | ||
| 297 | - } | ||
| 298 | - return ret; | ||
| 299 | - } | ||
| 300 | - | ||
| 301 | - | ||
| 302 | - | ||
| 303 | - /** | ||
| 304 | - * 录制mp4完成后通知事件;此事件对回复不敏感。 | ||
| 305 | - * | ||
| 306 | - */ | ||
| 307 | - @ResponseBody | ||
| 308 | - @PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8") | ||
| 309 | - public JSONObject onRecordMp4(@RequestBody JSONObject json){ | ||
| 310 | - | ||
| 311 | - if (logger.isDebugEnabled()) { | ||
| 312 | - logger.debug("[ ZLM HOOK ]on_record_mp4 API调用,参数:" + json.toString()); | ||
| 313 | - } | ||
| 314 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 315 | - JSONObject ret = new JSONObject(); | ||
| 316 | - ret.put("code", 0); | ||
| 317 | - ret.put("msg", "success"); | ||
| 318 | - return ret; | ||
| 319 | - } | ||
| 320 | - /** | ||
| 321 | - * 录制hls完成后通知事件;此事件对回复不敏感。 | ||
| 322 | - * | ||
| 323 | - */ | ||
| 324 | - @ResponseBody | ||
| 325 | - @PostMapping(value = "/on_record_ts", produces = "application/json;charset=UTF-8") | ||
| 326 | - public JSONObject onRecordTs(@RequestBody JSONObject json){ | ||
| 327 | - | ||
| 328 | - if (logger.isDebugEnabled()) { | ||
| 329 | - logger.debug("[ ZLM HOOK ]on_record_ts API调用,参数:" + json.toString()); | ||
| 330 | - } | ||
| 331 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 332 | - JSONObject ret = new JSONObject(); | ||
| 333 | - ret.put("code", 0); | ||
| 334 | - ret.put("msg", "success"); | ||
| 335 | - return ret; | ||
| 336 | - } | ||
| 337 | - | ||
| 338 | - /** | ||
| 339 | - * rtsp专用的鉴权事件,先触发on_rtsp_realm事件然后才会触发on_rtsp_auth事件。 | ||
| 340 | - * | ||
| 341 | - */ | ||
| 342 | - @ResponseBody | ||
| 343 | - @PostMapping(value = "/on_rtsp_realm", produces = "application/json;charset=UTF-8") | ||
| 344 | - public JSONObject onRtspRealm(@RequestBody JSONObject json){ | ||
| 345 | - | ||
| 346 | - if (logger.isDebugEnabled()) { | ||
| 347 | - logger.debug("[ ZLM HOOK ]on_rtsp_realm API调用,参数:" + json.toString()); | ||
| 348 | - } | ||
| 349 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 350 | - JSONObject ret = new JSONObject(); | ||
| 351 | - ret.put("code", 0); | ||
| 352 | - ret.put("realm", ""); | ||
| 353 | - return ret; | ||
| 354 | - } | ||
| 355 | - | ||
| 356 | - | ||
| 357 | - /** | ||
| 358 | - * 该rtsp流是否开启rtsp专用方式的鉴权事件,开启后才会触发on_rtsp_auth事件。需要指出的是rtsp也支持url参数鉴权,它支持两种方式鉴权。 | ||
| 359 | - * | ||
| 360 | - */ | ||
| 361 | - @ResponseBody | ||
| 362 | - @PostMapping(value = "/on_rtsp_auth", produces = "application/json;charset=UTF-8") | ||
| 363 | - public JSONObject onRtspAuth(@RequestBody JSONObject json){ | ||
| 364 | - | ||
| 365 | - if (logger.isDebugEnabled()) { | ||
| 366 | - logger.debug("[ ZLM HOOK ]on_rtsp_auth API调用,参数:" + json.toString()); | ||
| 367 | - } | ||
| 368 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 369 | - JSONObject ret = new JSONObject(); | ||
| 370 | - ret.put("code", 0); | ||
| 371 | - ret.put("encrypted", false); | ||
| 372 | - ret.put("passwd", "test"); | ||
| 373 | - return ret; | ||
| 374 | - } | ||
| 375 | - | ||
| 376 | - /** | ||
| 377 | - * shell登录鉴权,ZLMediaKit提供简单的telnet调试方式,使用telnet 127.0.0.1 9000能进入MediaServer进程的shell界面。 | ||
| 378 | - * | ||
| 379 | - */ | ||
| 380 | - @ResponseBody | ||
| 381 | - @PostMapping(value = "/on_shell_login", produces = "application/json;charset=UTF-8") | ||
| 382 | - public JSONObject onShellLogin(@RequestBody JSONObject json){ | ||
| 383 | - | ||
| 384 | - if (logger.isDebugEnabled()) { | ||
| 385 | - logger.debug("[ ZLM HOOK ]on_shell_login API调用,参数:" + json.toString()); | ||
| 386 | - } | ||
| 387 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 388 | - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_shell_login, json); | ||
| 389 | - if (subscribe != null ) { | ||
| 390 | - MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); | ||
| 391 | - if (mediaInfo != null) { | ||
| 392 | - subscribe.response(mediaInfo, json); | ||
| 393 | } | 267 | } |
| 394 | - | ||
| 395 | } | 268 | } |
| 396 | - | ||
| 397 | - JSONObject ret = new JSONObject(); | ||
| 398 | - ret.put("code", 0); | ||
| 399 | - ret.put("msg", "success"); | ||
| 400 | return ret; | 269 | return ret; |
| 401 | } | 270 | } |
| 402 | 271 | ||
| @@ -406,137 +275,139 @@ public class ZLMHttpHookListener { | @@ -406,137 +275,139 @@ public class ZLMHttpHookListener { | ||
| 406 | */ | 275 | */ |
| 407 | @ResponseBody | 276 | @ResponseBody |
| 408 | @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8") | 277 | @PostMapping(value = "/on_stream_changed", produces = "application/json;charset=UTF-8") |
| 409 | - public JSONObject onStreamChanged(@RequestBody MediaItem item){ | ||
| 410 | - | ||
| 411 | - logger.info("[ ZLM HOOK ]on_stream_changed API调用,参数:" + JSONObject.toJSONString(item)); | ||
| 412 | - String mediaServerId = item.getMediaServerId(); | ||
| 413 | - JSONObject json = (JSONObject) JSON.toJSON(item); | ||
| 414 | - ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_stream_changed, json); | ||
| 415 | - if (subscribe != null ) { | ||
| 416 | - MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); | ||
| 417 | - if (mediaInfo != null) { | ||
| 418 | - subscribe.response(mediaInfo, json); | ||
| 419 | - } | ||
| 420 | - } | ||
| 421 | - // 流消失移除redis play | ||
| 422 | - String app = item.getApp(); | ||
| 423 | - String stream = item.getStream(); | ||
| 424 | - String schema = item.getSchema(); | ||
| 425 | - List<MediaItem.MediaTrack> tracks = item.getTracks(); | ||
| 426 | - boolean regist = item.isRegist(); | ||
| 427 | - if (regist) { | ||
| 428 | - if (item.getOriginType() == OriginType.RTMP_PUSH.ordinal() | ||
| 429 | - || item.getOriginType() == OriginType.RTSP_PUSH.ordinal() | ||
| 430 | - || item.getOriginType() == OriginType.RTC_PUSH.ordinal()) { | ||
| 431 | - | ||
| 432 | - StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(app, stream); | ||
| 433 | - if (streamAuthorityInfo == null) { | ||
| 434 | - streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(item); | ||
| 435 | - }else { | ||
| 436 | - streamAuthorityInfo.setOriginType(item.getOriginType()); | ||
| 437 | - streamAuthorityInfo.setOriginTypeStr(item.getOriginTypeStr()); | ||
| 438 | - } | ||
| 439 | - redisCatchStorage.updateStreamAuthorityInfo(app, stream, streamAuthorityInfo); | ||
| 440 | - } | 278 | + public JSONObject onStreamChanged(@RequestBody OnStreamChangedHookParam param){ |
| 279 | + | ||
| 280 | + if (param.isRegist()) { | ||
| 281 | + logger.info("[ZLM HOOK] 流注册, {}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); | ||
| 441 | }else { | 282 | }else { |
| 442 | - redisCatchStorage.removeStreamAuthorityInfo(app, stream); | 283 | + logger.info("[ZLM HOOK] 流注销, {}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); |
| 443 | } | 284 | } |
| 444 | 285 | ||
| 445 | - if ("rtsp".equals(schema)){ | ||
| 446 | - logger.info("on_stream_changed:注册->{}, app->{}, stream->{}", regist, app, stream); | ||
| 447 | - if (regist) { | ||
| 448 | - mediaServerService.addCount(mediaServerId); | ||
| 449 | - }else { | ||
| 450 | - mediaServerService.removeCount(mediaServerId); | ||
| 451 | - } | ||
| 452 | - if (item.getOriginType() == OriginType.PULL.ordinal() | ||
| 453 | - || item.getOriginType() == OriginType.FFMPEG_PULL.ordinal()) { | ||
| 454 | - // 设置拉流代理上线/离线 | ||
| 455 | - streamProxyService.updateStatus(regist, app, stream); | 286 | + |
| 287 | + JSONObject json = (JSONObject) JSON.toJSON(param); | ||
| 288 | + taskExecutor.execute(()->{ | ||
| 289 | + ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_stream_changed, json); | ||
| 290 | + if (subscribe != null ) { | ||
| 291 | + MediaServerItem mediaInfo = mediaServerService.getOne(param.getMediaServerId()); | ||
| 292 | + if (mediaInfo != null) { | ||
| 293 | + subscribe.response(mediaInfo, json); | ||
| 294 | + } | ||
| 456 | } | 295 | } |
| 457 | - if ("rtp".equals(app) && !regist ) { | ||
| 458 | - StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(stream); | ||
| 459 | - if (streamInfo!=null){ | ||
| 460 | - redisCatchStorage.stopPlay(streamInfo); | ||
| 461 | - storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); | ||
| 462 | - }else{ | ||
| 463 | - streamInfo = redisCatchStorage.queryPlayback(null, null, stream, null); | ||
| 464 | - if (streamInfo != null) { | ||
| 465 | - redisCatchStorage.stopPlayback(streamInfo.getDeviceID(), streamInfo.getChannelId(), | ||
| 466 | - streamInfo.getStream(), null); | 296 | + // 流消失移除redis play |
| 297 | + List<OnStreamChangedHookParam.MediaTrack> tracks = param.getTracks(); | ||
| 298 | + if (param.isRegist()) { | ||
| 299 | + if (param.getOriginType() == OriginType.RTMP_PUSH.ordinal() | ||
| 300 | + || param.getOriginType() == OriginType.RTSP_PUSH.ordinal() | ||
| 301 | + || param.getOriginType() == OriginType.RTC_PUSH.ordinal()) { | ||
| 302 | + | ||
| 303 | + StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream()); | ||
| 304 | + if (streamAuthorityInfo == null) { | ||
| 305 | + streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(param); | ||
| 306 | + }else { | ||
| 307 | + streamAuthorityInfo.setOriginType(param.getOriginType()); | ||
| 308 | + streamAuthorityInfo.setOriginTypeStr(param.getOriginTypeStr()); | ||
| 467 | } | 309 | } |
| 310 | + redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo); | ||
| 468 | } | 311 | } |
| 469 | }else { | 312 | }else { |
| 470 | - if (!"rtp".equals(app)){ | ||
| 471 | - String type = OriginType.values()[item.getOriginType()].getType(); | ||
| 472 | - MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); | ||
| 473 | - | ||
| 474 | - if (mediaServerItem != null){ | ||
| 475 | - if (regist) { | ||
| 476 | - StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(app, stream); | ||
| 477 | - String callId = null; | ||
| 478 | - if (streamAuthorityInfo != null) { | ||
| 479 | - callId = streamAuthorityInfo.getCallId(); | ||
| 480 | - } | ||
| 481 | - StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem, | ||
| 482 | - app, stream, tracks, callId); | ||
| 483 | - item.setStreamInfo(streamInfoByAppAndStream); | ||
| 484 | - redisCatchStorage.addStream(mediaServerItem, type, app, stream, item); | ||
| 485 | - if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal() | ||
| 486 | - || item.getOriginType() == OriginType.RTMP_PUSH.ordinal() | ||
| 487 | - || item.getOriginType() == OriginType.RTC_PUSH.ordinal() ) { | ||
| 488 | - item.setSeverId(userSetting.getServerId()); | ||
| 489 | - zlmMediaListManager.addPush(item); | ||
| 490 | - } | ||
| 491 | - }else { | ||
| 492 | - // 兼容流注销时类型从redis记录获取 | ||
| 493 | - MediaItem mediaItem = redisCatchStorage.getStreamInfo(app, stream, mediaServerId); | ||
| 494 | - if (mediaItem != null) { | ||
| 495 | - type = OriginType.values()[mediaItem.getOriginType()].getType(); | ||
| 496 | - redisCatchStorage.removeStream(mediaServerItem.getId(), type, app, stream); | ||
| 497 | - } | ||
| 498 | - GbStream gbStream = storager.getGbStream(app, stream); | ||
| 499 | - if (gbStream != null) { | 313 | + redisCatchStorage.removeStreamAuthorityInfo(param.getApp(), param.getStream()); |
| 314 | + } | ||
| 315 | + | ||
| 316 | + if ("rtsp".equals(param.getSchema())){ | ||
| 317 | + if (param.isRegist()) { | ||
| 318 | + mediaServerService.addCount(param.getMediaServerId()); | ||
| 319 | + }else { | ||
| 320 | + mediaServerService.removeCount(param.getMediaServerId()); | ||
| 321 | + } | ||
| 322 | + if (param.getOriginType() == OriginType.PULL.ordinal() | ||
| 323 | + || param.getOriginType() == OriginType.FFMPEG_PULL.ordinal()) { | ||
| 324 | + // 设置拉流代理上线/离线 | ||
| 325 | + streamProxyService.updateStatus(param.isRegist(), param.getApp(), param.getStream()); | ||
| 326 | + } | ||
| 327 | + if ("rtp".equals(param.getApp()) && !param.isRegist() ) { | ||
| 328 | + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(param.getStream()); | ||
| 329 | + if (streamInfo!=null){ | ||
| 330 | + redisCatchStorage.stopPlay(streamInfo); | ||
| 331 | + storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); | ||
| 332 | + }else{ | ||
| 333 | + streamInfo = redisCatchStorage.queryPlayback(null, null, param.getStream(), null); | ||
| 334 | + if (streamInfo != null) { | ||
| 335 | + redisCatchStorage.stopPlayback(streamInfo.getDeviceID(), streamInfo.getChannelId(), | ||
| 336 | + streamInfo.getStream(), null); | ||
| 337 | + } | ||
| 338 | + } | ||
| 339 | + }else { | ||
| 340 | + if (!"rtp".equals(param.getApp())){ | ||
| 341 | + String type = OriginType.values()[param.getOriginType()].getType(); | ||
| 342 | + MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); | ||
| 343 | + | ||
| 344 | + if (mediaServerItem != null){ | ||
| 345 | + if (param.isRegist()) { | ||
| 346 | + StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream()); | ||
| 347 | + String callId = null; | ||
| 348 | + if (streamAuthorityInfo != null) { | ||
| 349 | + callId = streamAuthorityInfo.getCallId(); | ||
| 350 | + } | ||
| 351 | + StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem, | ||
| 352 | + param.getApp(), param.getStream(), tracks, callId); | ||
| 353 | + param.setStreamInfo(streamInfoByAppAndStream); | ||
| 354 | + redisCatchStorage.addStream(mediaServerItem, type, param.getApp(), param.getStream(), param); | ||
| 355 | + if (param.getOriginType() == OriginType.RTSP_PUSH.ordinal() | ||
| 356 | + || param.getOriginType() == OriginType.RTMP_PUSH.ordinal() | ||
| 357 | + || param.getOriginType() == OriginType.RTC_PUSH.ordinal() ) { | ||
| 358 | + param.setSeverId(userSetting.getServerId()); | ||
| 359 | + zlmMediaListManager.addPush(param); | ||
| 360 | + } | ||
| 361 | + }else { | ||
| 362 | + // 兼容流注销时类型从redis记录获取 | ||
| 363 | + OnStreamChangedHookParam onStreamChangedHookParam = redisCatchStorage.getStreamInfo(param.getApp(), param.getStream(), param.getMediaServerId()); | ||
| 364 | + if (onStreamChangedHookParam != null) { | ||
| 365 | + type = OriginType.values()[onStreamChangedHookParam.getOriginType()].getType(); | ||
| 366 | + redisCatchStorage.removeStream(mediaServerItem.getId(), type, param.getApp(), param.getStream()); | ||
| 367 | + } | ||
| 368 | + GbStream gbStream = storager.getGbStream(param.getApp(), param.getStream()); | ||
| 369 | + if (gbStream != null) { | ||
| 500 | // eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF); | 370 | // eventPublisher.catalogEventPublishForStream(null, gbStream, CatalogEvent.OFF); |
| 371 | + } | ||
| 372 | + zlmMediaListManager.removeMedia(param.getApp(), param.getStream()); | ||
| 373 | + } | ||
| 374 | + if (type != null) { | ||
| 375 | + // 发送流变化redis消息 | ||
| 376 | + JSONObject jsonObject = new JSONObject(); | ||
| 377 | + jsonObject.put("serverId", userSetting.getServerId()); | ||
| 378 | + jsonObject.put("app", param.getApp()); | ||
| 379 | + jsonObject.put("stream", param.getStream()); | ||
| 380 | + jsonObject.put("register", param.isRegist()); | ||
| 381 | + jsonObject.put("mediaServerId", param.getMediaServerId()); | ||
| 382 | + redisCatchStorage.sendStreamChangeMsg(type, jsonObject); | ||
| 501 | } | 383 | } |
| 502 | - zlmMediaListManager.removeMedia(app, stream); | ||
| 503 | - } | ||
| 504 | - if (type != null) { | ||
| 505 | - // 发送流变化redis消息 | ||
| 506 | - JSONObject jsonObject = new JSONObject(); | ||
| 507 | - jsonObject.put("serverId", userSetting.getServerId()); | ||
| 508 | - jsonObject.put("app", app); | ||
| 509 | - jsonObject.put("stream", stream); | ||
| 510 | - jsonObject.put("register", regist); | ||
| 511 | - jsonObject.put("mediaServerId", mediaServerId); | ||
| 512 | - redisCatchStorage.sendStreamChangeMsg(type, jsonObject); | ||
| 513 | } | 384 | } |
| 514 | } | 385 | } |
| 515 | } | 386 | } |
| 516 | - } | ||
| 517 | - if (!regist) { | ||
| 518 | - List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(stream); | ||
| 519 | - if (sendRtpItems.size() > 0) { | ||
| 520 | - for (SendRtpItem sendRtpItem : sendRtpItems) { | ||
| 521 | - if (sendRtpItem.getApp().equals(app)) { | ||
| 522 | - String platformId = sendRtpItem.getPlatformId(); | ||
| 523 | - ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); | ||
| 524 | - Device device = deviceService.getDevice(platformId); | ||
| 525 | - | ||
| 526 | - try { | ||
| 527 | - if (platform != null) { | ||
| 528 | - commanderFroPlatform.streamByeCmd(platform, sendRtpItem); | ||
| 529 | - }else { | ||
| 530 | - cmder.streamByeCmd(device, sendRtpItem.getChannelId(), stream, sendRtpItem.getCallId()); | 387 | + if (!param.isRegist()) { |
| 388 | + List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(param.getStream()); | ||
| 389 | + if (sendRtpItems.size() > 0) { | ||
| 390 | + for (SendRtpItem sendRtpItem : sendRtpItems) { | ||
| 391 | + if (sendRtpItem.getApp().equals(param.getApp())) { | ||
| 392 | + String platformId = sendRtpItem.getPlatformId(); | ||
| 393 | + ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId); | ||
| 394 | + Device device = deviceService.getDevice(platformId); | ||
| 395 | + | ||
| 396 | + try { | ||
| 397 | + if (platform != null) { | ||
| 398 | + commanderFroPlatform.streamByeCmd(platform, sendRtpItem); | ||
| 399 | + }else { | ||
| 400 | + cmder.streamByeCmd(device, sendRtpItem.getChannelId(), param.getStream(), sendRtpItem.getCallId()); | ||
| 401 | + } | ||
| 402 | + } catch (SipException | InvalidArgumentException | ParseException | SsrcTransactionNotFoundException e) { | ||
| 403 | + logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage()); | ||
| 531 | } | 404 | } |
| 532 | - } catch (SipException | InvalidArgumentException | ParseException | SsrcTransactionNotFoundException e) { | ||
| 533 | - logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage()); | ||
| 534 | } | 405 | } |
| 535 | } | 406 | } |
| 536 | } | 407 | } |
| 537 | } | 408 | } |
| 538 | } | 409 | } |
| 539 | - } | 410 | + }); |
| 540 | 411 | ||
| 541 | JSONObject ret = new JSONObject(); | 412 | JSONObject ret = new JSONObject(); |
| 542 | ret.put("code", 0); | 413 | ret.put("code", 0); |
| @@ -550,19 +421,16 @@ public class ZLMHttpHookListener { | @@ -550,19 +421,16 @@ public class ZLMHttpHookListener { | ||
| 550 | */ | 421 | */ |
| 551 | @ResponseBody | 422 | @ResponseBody |
| 552 | @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8") | 423 | @PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8") |
| 553 | - public JSONObject onStreamNoneReader(@RequestBody JSONObject json){ | 424 | + public JSONObject onStreamNoneReader(@RequestBody OnStreamNoneReaderHookParam param){ |
| 554 | 425 | ||
| 555 | - logger.info("[ ZLM HOOK ]on_stream_none_reader API调用,参数:" + json.toString()); | ||
| 556 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 557 | - String streamId = json.getString("stream"); | ||
| 558 | - String app = json.getString("app"); | 426 | + logger.info("[ZLM HOOK]流无人观看:{]->{}->{}/{}" + param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); |
| 559 | JSONObject ret = new JSONObject(); | 427 | JSONObject ret = new JSONObject(); |
| 560 | ret.put("code", 0); | 428 | ret.put("code", 0); |
| 561 | // 录像下载 | 429 | // 录像下载 |
| 562 | - ret.put("close", userSetting.getStreamOnDemand()); | ||
| 563 | - if ("rtp".equals(app)){ | 430 | + if ("rtp".equals(param.getApp())){ |
| 431 | + ret.put("close", userSetting.getStreamOnDemand()); | ||
| 564 | // 国标流, 点播/录像回放/录像下载 | 432 | // 国标流, 点播/录像回放/录像下载 |
| 565 | - StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId); | 433 | + StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(param.getStream()); |
| 566 | // 点播 | 434 | // 点播 |
| 567 | if (streamInfoForPlayCatch != null) { | 435 | if (streamInfoForPlayCatch != null) { |
| 568 | // 收到无人观看说明流也没有在往上级推送 | 436 | // 收到无人观看说明流也没有在往上级推送 |
| @@ -596,7 +464,7 @@ public class ZLMHttpHookListener { | @@ -596,7 +464,7 @@ public class ZLMHttpHookListener { | ||
| 596 | return ret; | 464 | return ret; |
| 597 | } | 465 | } |
| 598 | // 录像回放 | 466 | // 录像回放 |
| 599 | - StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null); | 467 | + StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, param.getStream(), null); |
| 600 | if (streamInfoForPlayBackCatch != null ) { | 468 | if (streamInfoForPlayBackCatch != null ) { |
| 601 | if (streamInfoForPlayBackCatch.isPause()) { | 469 | if (streamInfoForPlayBackCatch.isPause()) { |
| 602 | ret.put("close", false); | 470 | ret.put("close", false); |
| @@ -617,7 +485,7 @@ public class ZLMHttpHookListener { | @@ -617,7 +485,7 @@ public class ZLMHttpHookListener { | ||
| 617 | return ret; | 485 | return ret; |
| 618 | } | 486 | } |
| 619 | // 录像下载 | 487 | // 录像下载 |
| 620 | - StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, streamId, null); | 488 | + StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, param.getStream(), null); |
| 621 | // 进行录像下载时无人观看不断流 | 489 | // 进行录像下载时无人观看不断流 |
| 622 | if (streamInfoForDownload != null) { | 490 | if (streamInfoForDownload != null) { |
| 623 | ret.put("close", false); | 491 | ret.put("close", false); |
| @@ -626,19 +494,19 @@ public class ZLMHttpHookListener { | @@ -626,19 +494,19 @@ public class ZLMHttpHookListener { | ||
| 626 | }else { | 494 | }else { |
| 627 | // 非国标流 推流/拉流代理 | 495 | // 非国标流 推流/拉流代理 |
| 628 | // 拉流代理 | 496 | // 拉流代理 |
| 629 | - StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(app, streamId); | 497 | + StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(param.getApp(), param.getStream()); |
| 630 | if (streamProxyItem != null ) { | 498 | if (streamProxyItem != null ) { |
| 631 | if (streamProxyItem.isEnable_remove_none_reader()) { | 499 | if (streamProxyItem.isEnable_remove_none_reader()) { |
| 632 | // 无人观看自动移除 | 500 | // 无人观看自动移除 |
| 633 | ret.put("close", true); | 501 | ret.put("close", true); |
| 634 | - streamProxyService.del(app, streamId); | 502 | + streamProxyService.del(param.getApp(), param.getStream()); |
| 635 | String url = streamProxyItem.getUrl() != null?streamProxyItem.getUrl():streamProxyItem.getSrc_url(); | 503 | String url = streamProxyItem.getUrl() != null?streamProxyItem.getUrl():streamProxyItem.getSrc_url(); |
| 636 | - logger.info("[{}/{}]<-[{}] 拉流代理无人观看已经移除", app, streamId, url); | 504 | + logger.info("[{}/{}]<-[{}] 拉流代理无人观看已经移除", param.getApp(), param.getStream(), url); |
| 637 | }else if (streamProxyItem.isEnable_disable_none_reader()) { | 505 | }else if (streamProxyItem.isEnable_disable_none_reader()) { |
| 638 | // 无人观看停用 | 506 | // 无人观看停用 |
| 639 | ret.put("close", true); | 507 | ret.put("close", true); |
| 640 | // 修改数据 | 508 | // 修改数据 |
| 641 | - streamProxyService.stop(app, streamId); | 509 | + streamProxyService.stop(param.getApp(), param.getStream()); |
| 642 | }else { | 510 | }else { |
| 643 | ret.put("close", false); | 511 | ret.put("close", false); |
| 644 | } | 512 | } |
| @@ -660,35 +528,33 @@ public class ZLMHttpHookListener { | @@ -660,35 +528,33 @@ public class ZLMHttpHookListener { | ||
| 660 | */ | 528 | */ |
| 661 | @ResponseBody | 529 | @ResponseBody |
| 662 | @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8") | 530 | @PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8") |
| 663 | - public JSONObject onStreamNotFound(@RequestBody JSONObject json){ | ||
| 664 | - if (logger.isDebugEnabled()) { | ||
| 665 | - logger.debug("[ ZLM HOOK ]on_stream_not_found API调用,参数:" + json.toString()); | ||
| 666 | - } | ||
| 667 | - String mediaServerId = json.getString("mediaServerId"); | ||
| 668 | - MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); | ||
| 669 | - if (userSetting.isAutoApplyPlay() && mediaInfo != null) { | ||
| 670 | - String app = json.getString("app"); | ||
| 671 | - String streamId = json.getString("stream"); | ||
| 672 | - if ("rtp".equals(app)) { | ||
| 673 | - if (mediaInfo.isRtpEnable()) { | ||
| 674 | - String[] s = streamId.split("_"); | ||
| 675 | - if (s.length == 2) { | ||
| 676 | - String deviceId = s[0]; | ||
| 677 | - String channelId = s[1]; | ||
| 678 | - Device device = redisCatchStorage.getDevice(deviceId); | ||
| 679 | - if (device != null) { | ||
| 680 | - playService.play(mediaInfo,deviceId, channelId, null, null, null); | 531 | + public JSONObject onStreamNotFound(@RequestBody OnStreamNotFoundHookParam param){ |
| 532 | + logger.info("[ZLM HOOK] 流未找到:{}->{}->{}/{}" + param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); | ||
| 533 | + taskExecutor.execute(()->{ | ||
| 534 | + MediaServerItem mediaInfo = mediaServerService.getOne(param.getMediaServerId()); | ||
| 535 | + if (userSetting.isAutoApplyPlay() && mediaInfo != null) { | ||
| 536 | + if ("rtp".equals(param.getApp())) { | ||
| 537 | + if (mediaInfo.isRtpEnable()) { | ||
| 538 | + String[] s = param.getStream().split("_"); | ||
| 539 | + if (s.length == 2) { | ||
| 540 | + String deviceId = s[0]; | ||
| 541 | + String channelId = s[1]; | ||
| 542 | + Device device = redisCatchStorage.getDevice(deviceId); | ||
| 543 | + if (device != null) { | ||
| 544 | + playService.play(mediaInfo,deviceId, channelId, null, null, null); | ||
| 545 | + } | ||
| 681 | } | 546 | } |
| 682 | } | 547 | } |
| 683 | - } | ||
| 684 | - }else { | ||
| 685 | - // 拉流代理 | ||
| 686 | - StreamProxyItem streamProxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(app, streamId); | ||
| 687 | - if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnable_disable_none_reader()) { | ||
| 688 | - streamProxyService.start(app, streamId); | 548 | + }else { |
| 549 | + // 拉流代理 | ||
| 550 | + StreamProxyItem streamProxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(param.getApp(), param.getStream()); | ||
| 551 | + if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnable_disable_none_reader()) { | ||
| 552 | + streamProxyService.start(param.getApp(), param.getStream()); | ||
| 553 | + } | ||
| 689 | } | 554 | } |
| 690 | } | 555 | } |
| 691 | - } | 556 | + }); |
| 557 | + | ||
| 692 | 558 | ||
| 693 | JSONObject ret = new JSONObject(); | 559 | JSONObject ret = new JSONObject(); |
| 694 | ret.put("code", 0); | 560 | ret.put("code", 0); |
| @@ -704,22 +570,20 @@ public class ZLMHttpHookListener { | @@ -704,22 +570,20 @@ public class ZLMHttpHookListener { | ||
| 704 | @PostMapping(value = "/on_server_started", produces = "application/json;charset=UTF-8") | 570 | @PostMapping(value = "/on_server_started", produces = "application/json;charset=UTF-8") |
| 705 | public JSONObject onServerStarted(HttpServletRequest request, @RequestBody JSONObject jsonObject){ | 571 | public JSONObject onServerStarted(HttpServletRequest request, @RequestBody JSONObject jsonObject){ |
| 706 | 572 | ||
| 707 | - if (logger.isDebugEnabled()) { | ||
| 708 | - logger.debug("[ ZLM HOOK ]on_server_started API调用,参数:" + jsonObject.toString()); | ||
| 709 | - } | ||
| 710 | - String remoteAddr = request.getRemoteAddr(); | ||
| 711 | - jsonObject.put("ip", remoteAddr); | ||
| 712 | - List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_started); | ||
| 713 | - if (subscribes != null && subscribes.size() > 0) { | ||
| 714 | - for (ZlmHttpHookSubscribe.Event subscribe : subscribes) { | ||
| 715 | - subscribe.response(null, jsonObject); | 573 | + jsonObject.put("ip", request.getRemoteAddr()); |
| 574 | + ZLMServerConfig zlmServerConfig = JSON.to(ZLMServerConfig.class, jsonObject); | ||
| 575 | + zlmServerConfig.setIp(request.getRemoteAddr()); | ||
| 576 | + logger.info("[ZLM HOOK] zlm 启动 " + zlmServerConfig.getGeneralMediaServerId()); | ||
| 577 | + taskExecutor.execute(()->{ | ||
| 578 | + List<ZlmHttpHookSubscribe.Event> subscribes = this.subscribe.getSubscribes(HookType.on_server_started); | ||
| 579 | + if (subscribes != null && subscribes.size() > 0) { | ||
| 580 | + for (ZlmHttpHookSubscribe.Event subscribe : subscribes) { | ||
| 581 | + subscribe.response(null, jsonObject); | ||
| 582 | + } | ||
| 716 | } | 583 | } |
| 717 | - } | ||
| 718 | - | ||
| 719 | - ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(jsonObject, ZLMServerConfig.class); | ||
| 720 | - if (zlmServerConfig !=null ) { | ||
| 721 | mediaServerService.zlmServerOnline(zlmServerConfig); | 584 | mediaServerService.zlmServerOnline(zlmServerConfig); |
| 722 | - } | 585 | + }); |
| 586 | + | ||
| 723 | JSONObject ret = new JSONObject(); | 587 | JSONObject ret = new JSONObject(); |
| 724 | ret.put("code", 0); | 588 | ret.put("code", 0); |
| 725 | ret.put("msg", "success"); | 589 | ret.put("msg", "success"); |
| @@ -731,33 +595,33 @@ public class ZLMHttpHookListener { | @@ -731,33 +595,33 @@ public class ZLMHttpHookListener { | ||
| 731 | */ | 595 | */ |
| 732 | @ResponseBody | 596 | @ResponseBody |
| 733 | @PostMapping(value = "/on_send_rtp_stopped", produces = "application/json;charset=UTF-8") | 597 | @PostMapping(value = "/on_send_rtp_stopped", produces = "application/json;charset=UTF-8") |
| 734 | - public JSONObject onSendRtpStopped(HttpServletRequest request, @RequestBody JSONObject jsonObject){ | 598 | + public JSONObject onSendRtpStopped(HttpServletRequest request, @RequestBody OnSendRtpStoppedHookParam param){ |
| 735 | 599 | ||
| 736 | - logger.info("[ ZLM HOOK ]on_send_rtp_stopped API调用,参数:" + jsonObject); | 600 | + logger.info("[ZLM HOOK] 发送rtp被动关闭:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream()); |
| 737 | 601 | ||
| 738 | JSONObject ret = new JSONObject(); | 602 | JSONObject ret = new JSONObject(); |
| 739 | ret.put("code", 0); | 603 | ret.put("code", 0); |
| 740 | ret.put("msg", "success"); | 604 | ret.put("msg", "success"); |
| 741 | 605 | ||
| 742 | // 查找对应的上级推流,发送停止 | 606 | // 查找对应的上级推流,发送停止 |
| 743 | - String app = jsonObject.getString("app"); | ||
| 744 | - if (!"rtp".equals(app)) { | 607 | + if (!"rtp".equals(param.getApp())) { |
| 745 | return ret; | 608 | return ret; |
| 746 | } | 609 | } |
| 747 | - String stream = jsonObject.getString("stream"); | ||
| 748 | - List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(stream); | ||
| 749 | - if (sendRtpItems.size() > 0) { | ||
| 750 | - for (SendRtpItem sendRtpItem : sendRtpItems) { | ||
| 751 | - ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId()); | ||
| 752 | - try { | ||
| 753 | - commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId()); | ||
| 754 | - } catch (SipException | InvalidArgumentException | ParseException e) { | ||
| 755 | - logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage()); | 610 | + taskExecutor.execute(()->{ |
| 611 | + List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByStream(param.getStream()); | ||
| 612 | + if (sendRtpItems.size() > 0) { | ||
| 613 | + for (SendRtpItem sendRtpItem : sendRtpItems) { | ||
| 614 | + ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId()); | ||
| 615 | + try { | ||
| 616 | + commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId()); | ||
| 617 | + } catch (SipException | InvalidArgumentException | ParseException e) { | ||
| 618 | + logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage()); | ||
| 619 | + } | ||
| 620 | + redisCatchStorage.deleteSendRTPServer(parentPlatform.getServerGBId(), sendRtpItem.getChannelId(), | ||
| 621 | + sendRtpItem.getCallId(), sendRtpItem.getStreamId()); | ||
| 756 | } | 622 | } |
| 757 | - redisCatchStorage.deleteSendRTPServer(parentPlatform.getServerGBId(), sendRtpItem.getChannelId(), | ||
| 758 | - sendRtpItem.getCallId(), sendRtpItem.getStreamId()); | ||
| 759 | } | 623 | } |
| 760 | - } | 624 | + }); |
| 761 | 625 | ||
| 762 | 626 | ||
| 763 | return ret; | 627 | return ret; |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
| @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm; | @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm; | ||
| 3 | import com.genersoft.iot.vmp.conf.UserSetting; | 3 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; | 4 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; |
| 5 | import com.genersoft.iot.vmp.media.zlm.dto.*; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.*; |
| 6 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; | ||
| 6 | import com.genersoft.iot.vmp.service.IMediaServerService; | 7 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| 7 | import com.genersoft.iot.vmp.service.IStreamProxyService; | 8 | import com.genersoft.iot.vmp.service.IStreamProxyService; |
| 8 | import com.genersoft.iot.vmp.service.IStreamPushService; | 9 | import com.genersoft.iot.vmp.service.IStreamPushService; |
| @@ -67,19 +68,19 @@ public class ZLMMediaListManager { | @@ -67,19 +68,19 @@ public class ZLMMediaListManager { | ||
| 67 | 68 | ||
| 68 | private Map<String, ChannelOnlineEvent> channelOnPublishEvents = new ConcurrentHashMap<>(); | 69 | private Map<String, ChannelOnlineEvent> channelOnPublishEvents = new ConcurrentHashMap<>(); |
| 69 | 70 | ||
| 70 | - public StreamPushItem addPush(MediaItem mediaItem) { | ||
| 71 | - StreamPushItem transform = streamPushService.transform(mediaItem); | ||
| 72 | - StreamPushItem pushInDb = streamPushService.getPush(mediaItem.getApp(), mediaItem.getStream()); | ||
| 73 | - transform.setPushIng(mediaItem.isRegist()); | 71 | + public StreamPushItem addPush(OnStreamChangedHookParam onStreamChangedHookParam) { |
| 72 | + StreamPushItem transform = streamPushService.transform(onStreamChangedHookParam); | ||
| 73 | + StreamPushItem pushInDb = streamPushService.getPush(onStreamChangedHookParam.getApp(), onStreamChangedHookParam.getStream()); | ||
| 74 | + transform.setPushIng(onStreamChangedHookParam.isRegist()); | ||
| 74 | transform.setUpdateTime(DateUtil.getNow()); | 75 | transform.setUpdateTime(DateUtil.getNow()); |
| 75 | transform.setPushTime(DateUtil.getNow()); | 76 | transform.setPushTime(DateUtil.getNow()); |
| 76 | - transform.setSelf(userSetting.getServerId().equals(mediaItem.getSeverId())); | 77 | + transform.setSelf(userSetting.getServerId().equals(onStreamChangedHookParam.getSeverId())); |
| 77 | if (pushInDb == null) { | 78 | if (pushInDb == null) { |
| 78 | transform.setCreateTime(DateUtil.getNow()); | 79 | transform.setCreateTime(DateUtil.getNow()); |
| 79 | streamPushMapper.add(transform); | 80 | streamPushMapper.add(transform); |
| 80 | }else { | 81 | }else { |
| 81 | streamPushMapper.update(transform); | 82 | streamPushMapper.update(transform); |
| 82 | - gbStreamMapper.updateMediaServer(mediaItem.getApp(), mediaItem.getStream(), mediaItem.getMediaServerId()); | 83 | + gbStreamMapper.updateMediaServer(onStreamChangedHookParam.getApp(), onStreamChangedHookParam.getStream(), onStreamChangedHookParam.getMediaServerId()); |
| 83 | } | 84 | } |
| 84 | ChannelOnlineEvent channelOnlineEventLister = getChannelOnlineEventLister(transform.getApp(), transform.getStream()); | 85 | ChannelOnlineEvent channelOnlineEventLister = getChannelOnlineEventLister(transform.getApp(), transform.getStream()); |
| 85 | if ( channelOnlineEventLister != null) { | 86 | if ( channelOnlineEventLister != null) { |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
| 1 | package com.genersoft.iot.vmp.media.zlm; | 1 | package com.genersoft.iot.vmp.media.zlm; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 6 | import okhttp3.*; | 6 | import okhttp3.*; |
| 7 | import okhttp3.logging.HttpLoggingInterceptor; | 7 | import okhttp3.logging.HttpLoggingInterceptor; |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
| 1 | package com.genersoft.iot.vmp.media.zlm; | 1 | package com.genersoft.iot.vmp.media.zlm; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONArray; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONArray; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.conf.UserSetting; | 5 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; | 6 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; |
| 7 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 7 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| @@ -333,7 +333,7 @@ public class ZLMRTPServerFactory { | @@ -333,7 +333,7 @@ public class ZLMRTPServerFactory { | ||
| 333 | result= true; | 333 | result= true; |
| 334 | logger.info("[停止RTP推流] 成功"); | 334 | logger.info("[停止RTP推流] 成功"); |
| 335 | } else { | 335 | } else { |
| 336 | - logger.error("[停止RTP推流] 失败: {}, 参数:{}->\r\n{}",jsonObject.getString("msg"),JSONObject.toJSON(param), jsonObject); | 336 | + logger.error("[停止RTP推流] 失败: {}, 参数:{}->\r\n{}",jsonObject.getString("msg"),jsonObject.toJSONString(param)); |
| 337 | } | 337 | } |
| 338 | return result; | 338 | return result; |
| 339 | } | 339 | } |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
| 1 | package com.genersoft.iot.vmp.media.zlm; | 1 | package com.genersoft.iot.vmp.media.zlm; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONArray; | ||
| 5 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONArray; | ||
| 5 | +import com.alibaba.fastjson2.JSONObject; | ||
| 6 | import com.genersoft.iot.vmp.conf.DynamicTask; | 6 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 7 | import com.genersoft.iot.vmp.conf.MediaConfig; | 7 | import com.genersoft.iot.vmp.conf.MediaConfig; |
| 8 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | 8 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
| @@ -62,7 +62,7 @@ public class ZLMRunner implements CommandLineRunner { | @@ -62,7 +62,7 @@ public class ZLMRunner implements CommandLineRunner { | ||
| 62 | // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 | 62 | // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 |
| 63 | hookSubscribe.addSubscribe(hookSubscribeForServerStarted, | 63 | hookSubscribe.addSubscribe(hookSubscribeForServerStarted, |
| 64 | (MediaServerItem mediaServerItem, JSONObject response)->{ | 64 | (MediaServerItem mediaServerItem, JSONObject response)->{ |
| 65 | - ZLMServerConfig zlmServerConfig = JSONObject.toJavaObject(response, ZLMServerConfig.class); | 65 | + ZLMServerConfig zlmServerConfig = response.to(ZLMServerConfig.class); |
| 66 | if (zlmServerConfig !=null ) { | 66 | if (zlmServerConfig !=null ) { |
| 67 | if (startGetMedia != null) { | 67 | if (startGetMedia != null) { |
| 68 | startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId()); | 68 | startGetMedia.remove(zlmServerConfig.getGeneralMediaServerId()); |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java
src/main/java/com/genersoft/iot/vmp/media/zlm/ZlmHttpHookSubscribe.java
| 1 | package com.genersoft.iot.vmp.media.zlm; | 1 | package com.genersoft.iot.vmp.media.zlm; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.media.zlm.dto.HookType; | 4 | import com.genersoft.iot.vmp.media.zlm.dto.HookType; |
| 5 | import com.genersoft.iot.vmp.media.zlm.dto.IHookSubscribe; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.IHookSubscribe; |
| 6 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 6 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeFactory.java
| 1 | package com.genersoft.iot.vmp.media.zlm.dto; | 1 | package com.genersoft.iot.vmp.media.zlm.dto; |
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 4 | +import com.alibaba.fastjson2.JSONObject; |
| 5 | 5 | ||
| 6 | /** | 6 | /** |
| 7 | * hook 订阅工厂 | 7 | * hook 订阅工厂 |
| @@ -11,7 +11,7 @@ public class HookSubscribeFactory { | @@ -11,7 +11,7 @@ public class HookSubscribeFactory { | ||
| 11 | 11 | ||
| 12 | public static HookSubscribeForStreamChange on_stream_changed(String app, String stream, boolean regist, String scheam, String mediaServerId) { | 12 | public static HookSubscribeForStreamChange on_stream_changed(String app, String stream, boolean regist, String scheam, String mediaServerId) { |
| 13 | HookSubscribeForStreamChange hookSubscribe = new HookSubscribeForStreamChange(); | 13 | HookSubscribeForStreamChange hookSubscribe = new HookSubscribeForStreamChange(); |
| 14 | - JSONObject subscribeKey = new com.alibaba.fastjson.JSONObject(); | 14 | + JSONObject subscribeKey = new com.alibaba.fastjson2.JSONObject(); |
| 15 | subscribeKey.put("app", app); | 15 | subscribeKey.put("app", app); |
| 16 | subscribeKey.put("stream", stream); | 16 | subscribeKey.put("stream", stream); |
| 17 | subscribeKey.put("regist", regist); | 17 | subscribeKey.put("regist", regist); |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeForServerStarted.java
| 1 | package com.genersoft.iot.vmp.media.zlm.dto; | 1 | package com.genersoft.iot.vmp.media.zlm.dto; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | ||
| 4 | -import com.alibaba.fastjson.annotation.JSONField; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | +import com.alibaba.fastjson2.annotation.JSONField; | ||
| 5 | 5 | ||
| 6 | import java.time.Instant; | 6 | import java.time.Instant; |
| 7 | 7 |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeForStreamChange.java
| 1 | package com.genersoft.iot.vmp.media.zlm.dto; | 1 | package com.genersoft.iot.vmp.media.zlm.dto; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | ||
| 4 | -import com.alibaba.fastjson.annotation.JSONField; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | +import com.alibaba.fastjson2.annotation.JSONField; | ||
| 5 | 5 | ||
| 6 | import java.time.Instant; | 6 | import java.time.Instant; |
| 7 | 7 |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/IHookSubscribe.java
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/ServerKeepaliveData.java
0 → 100644
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamAuthorityInfo.java
| 1 | package com.genersoft.iot.vmp.media.zlm.dto; | 1 | package com.genersoft.iot.vmp.media.zlm.dto; |
| 2 | 2 | ||
| 3 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnPublishHookParam; | ||
| 4 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; | ||
| 5 | + | ||
| 3 | /** | 6 | /** |
| 4 | * 流的鉴权信息 | 7 | * 流的鉴权信息 |
| 5 | * @author lin | 8 | * @author lin |
| @@ -102,13 +105,13 @@ public class StreamAuthorityInfo { | @@ -102,13 +105,13 @@ public class StreamAuthorityInfo { | ||
| 102 | return streamAuthorityInfo; | 105 | return streamAuthorityInfo; |
| 103 | } | 106 | } |
| 104 | 107 | ||
| 105 | - public static StreamAuthorityInfo getInstanceByHook(MediaItem mediaItem) { | 108 | + public static StreamAuthorityInfo getInstanceByHook(OnStreamChangedHookParam onStreamChangedHookParam) { |
| 106 | StreamAuthorityInfo streamAuthorityInfo = new StreamAuthorityInfo(); | 109 | StreamAuthorityInfo streamAuthorityInfo = new StreamAuthorityInfo(); |
| 107 | - streamAuthorityInfo.setApp(mediaItem.getApp()); | ||
| 108 | - streamAuthorityInfo.setStream(mediaItem.getStream()); | ||
| 109 | - streamAuthorityInfo.setId(mediaItem.getMediaServerId()); | ||
| 110 | - streamAuthorityInfo.setOriginType(mediaItem.getOriginType()); | ||
| 111 | - streamAuthorityInfo.setOriginTypeStr(mediaItem.getOriginTypeStr()); | 110 | + streamAuthorityInfo.setApp(onStreamChangedHookParam.getApp()); |
| 111 | + streamAuthorityInfo.setStream(onStreamChangedHookParam.getStream()); | ||
| 112 | + streamAuthorityInfo.setId(onStreamChangedHookParam.getMediaServerId()); | ||
| 113 | + streamAuthorityInfo.setOriginType(onStreamChangedHookParam.getOriginType()); | ||
| 114 | + streamAuthorityInfo.setOriginTypeStr(onStreamChangedHookParam.getOriginTypeStr()); | ||
| 112 | return streamAuthorityInfo; | 115 | return streamAuthorityInfo; |
| 113 | } | 116 | } |
| 114 | } | 117 | } |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamPushItem.java
| 1 | package com.genersoft.iot.vmp.media.zlm.dto; | 1 | package com.genersoft.iot.vmp.media.zlm.dto; |
| 2 | 2 | ||
| 3 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; | 3 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; |
| 4 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; | ||
| 4 | import com.genersoft.iot.vmp.utils.DateUtil; | 5 | import com.genersoft.iot.vmp.utils.DateUtil; |
| 5 | import io.swagger.v3.oas.annotations.media.Schema; | 6 | import io.swagger.v3.oas.annotations.media.Schema; |
| 6 | import org.jetbrains.annotations.NotNull; | 7 | import org.jetbrains.annotations.NotNull; |
| 7 | -import org.springframework.util.unit.DataUnit; | ||
| 8 | 8 | ||
| 9 | import java.util.List; | 9 | import java.util.List; |
| 10 | 10 | ||
| @@ -59,7 +59,7 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte | @@ -59,7 +59,7 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte | ||
| 59 | * 客户端和服务器网络信息,可能为null类型 | 59 | * 客户端和服务器网络信息,可能为null类型 |
| 60 | */ | 60 | */ |
| 61 | @Schema(description = "客户端和服务器网络信息,可能为null类型") | 61 | @Schema(description = "客户端和服务器网络信息,可能为null类型") |
| 62 | - private MediaItem.OriginSock originSock; | 62 | + private OnStreamChangedHookParam.OriginSock originSock; |
| 63 | 63 | ||
| 64 | /** | 64 | /** |
| 65 | * 产生源类型的字符串描述 | 65 | * 产生源类型的字符串描述 |
| @@ -83,7 +83,7 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte | @@ -83,7 +83,7 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte | ||
| 83 | * 音视频轨道 | 83 | * 音视频轨道 |
| 84 | */ | 84 | */ |
| 85 | @Schema(description = "音视频轨道") | 85 | @Schema(description = "音视频轨道") |
| 86 | - private List<MediaItem.MediaTrack> tracks; | 86 | + private List<OnStreamChangedHookParam.MediaTrack> tracks; |
| 87 | 87 | ||
| 88 | /** | 88 | /** |
| 89 | * 音视频轨道 | 89 | * 音视频轨道 |
| @@ -223,11 +223,11 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte | @@ -223,11 +223,11 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte | ||
| 223 | this.originType = originType; | 223 | this.originType = originType; |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | - public MediaItem.OriginSock getOriginSock() { | 226 | + public OnStreamChangedHookParam.OriginSock getOriginSock() { |
| 227 | return originSock; | 227 | return originSock; |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | - public void setOriginSock(MediaItem.OriginSock originSock) { | 230 | + public void setOriginSock(OnStreamChangedHookParam.OriginSock originSock) { |
| 231 | this.originSock = originSock; | 231 | this.originSock = originSock; |
| 232 | } | 232 | } |
| 233 | 233 | ||
| @@ -256,11 +256,11 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte | @@ -256,11 +256,11 @@ public class StreamPushItem extends GbStream implements Comparable<StreamPushIte | ||
| 256 | this.aliveSecond = aliveSecond; | 256 | this.aliveSecond = aliveSecond; |
| 257 | } | 257 | } |
| 258 | 258 | ||
| 259 | - public List<MediaItem.MediaTrack> getTracks() { | 259 | + public List<OnStreamChangedHookParam.MediaTrack> getTracks() { |
| 260 | return tracks; | 260 | return tracks; |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | - public void setTracks(List<MediaItem.MediaTrack> tracks) { | 263 | + public void setTracks(List<OnStreamChangedHookParam.MediaTrack> tracks) { |
| 264 | this.tracks = tracks; | 264 | this.tracks = tracks; |
| 265 | } | 265 | } |
| 266 | 266 |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookParam.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookParam.java
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/OnPlayHookParam.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnPlayHookParam.java
| 1 | -package com.genersoft.iot.vmp.media.zlm.dto; | 1 | +package com.genersoft.iot.vmp.media.zlm.dto.hook; |
| 2 | 2 | ||
| 3 | /** | 3 | /** |
| 4 | * zlm hook事件中的on_play事件的参数 | 4 | * zlm hook事件中的on_play事件的参数 |
| @@ -79,4 +79,8 @@ public class OnPlayHookParam extends HookParam{ | @@ -79,4 +79,8 @@ public class OnPlayHookParam extends HookParam{ | ||
| 79 | this.vhost = vhost; | 79 | this.vhost = vhost; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | + @Override | ||
| 83 | + public String toString() { | ||
| 84 | + return String.format("%s://%s:%s/%s/%s?%s", schema, ip, port, app, stream, params); | ||
| 85 | + } | ||
| 82 | } | 86 | } |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/OnPublishHookParam.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnPublishHookParam.java
| 1 | -package com.genersoft.iot.vmp.media.zlm.dto; | 1 | +package com.genersoft.iot.vmp.media.zlm.dto.hook; |
| 2 | 2 | ||
| 3 | /** | 3 | /** |
| 4 | * zlm hook事件中的on_publish事件的参数 | 4 | * zlm hook事件中的on_publish事件的参数 |
| @@ -79,4 +79,8 @@ public class OnPublishHookParam extends HookParam{ | @@ -79,4 +79,8 @@ public class OnPublishHookParam extends HookParam{ | ||
| 79 | this.vhost = vhost; | 79 | this.vhost = vhost; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | + @Override | ||
| 83 | + public String toString() { | ||
| 84 | + return String.format("%s://%s:%s/%s/%s?%s", schema, ip, port, app, stream, params); | ||
| 85 | + } | ||
| 82 | } | 86 | } |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnSendRtpStoppedHookParam.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.media.zlm.dto.hook; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * zlm hook事件中的on_send_rtp_stopped事件的参数 | ||
| 5 | + * @author lin | ||
| 6 | + */ | ||
| 7 | +public class OnSendRtpStoppedHookParam extends HookParam{ | ||
| 8 | + private String app; | ||
| 9 | + private String stream; | ||
| 10 | + | ||
| 11 | + | ||
| 12 | + public String getApp() { | ||
| 13 | + return app; | ||
| 14 | + } | ||
| 15 | + | ||
| 16 | + public void setApp(String app) { | ||
| 17 | + this.app = app; | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + public String getStream() { | ||
| 21 | + return stream; | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + public void setStream(String stream) { | ||
| 25 | + this.stream = stream; | ||
| 26 | + } | ||
| 27 | +} |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnServerKeepaliveHookParam.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.media.zlm.dto.hook; | ||
| 2 | + | ||
| 3 | +import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData; | ||
| 4 | + | ||
| 5 | +/** | ||
| 6 | + * zlm hook事件中的on_play事件的参数 | ||
| 7 | + * @author lin | ||
| 8 | + */ | ||
| 9 | +public class OnServerKeepaliveHookParam extends HookParam{ | ||
| 10 | + | ||
| 11 | + private ServerKeepaliveData data; | ||
| 12 | + | ||
| 13 | + public ServerKeepaliveData getData() { | ||
| 14 | + return data; | ||
| 15 | + } | ||
| 16 | + | ||
| 17 | + public void setData(ServerKeepaliveData data) { | ||
| 18 | + this.data = data; | ||
| 19 | + } | ||
| 20 | +} |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnStreamChangedHookParam.java
| 1 | -package com.genersoft.iot.vmp.media.zlm.dto; | 1 | +package com.genersoft.iot.vmp.media.zlm.dto.hook; |
| 2 | 2 | ||
| 3 | import com.genersoft.iot.vmp.common.StreamInfo; | 3 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 4 | 4 | ||
| @@ -7,7 +7,7 @@ import java.util.List; | @@ -7,7 +7,7 @@ import java.util.List; | ||
| 7 | /** | 7 | /** |
| 8 | * @author lin | 8 | * @author lin |
| 9 | */ | 9 | */ |
| 10 | -public class MediaItem { | 10 | +public class OnStreamChangedHookParam extends HookParam{ |
| 11 | 11 | ||
| 12 | /** | 12 | /** |
| 13 | * 注册/注销 | 13 | * 注册/注销 |
| @@ -69,11 +69,6 @@ public class MediaItem { | @@ -69,11 +69,6 @@ public class MediaItem { | ||
| 69 | private String originUrl; | 69 | private String originUrl; |
| 70 | 70 | ||
| 71 | /** | 71 | /** |
| 72 | - * 流媒体服务器id | ||
| 73 | - */ | ||
| 74 | - private String mediaServerId; | ||
| 75 | - | ||
| 76 | - /** | ||
| 77 | * 服务器id | 72 | * 服务器id |
| 78 | */ | 73 | */ |
| 79 | private String severId; | 74 | private String severId; |
| @@ -412,14 +407,6 @@ public class MediaItem { | @@ -412,14 +407,6 @@ public class MediaItem { | ||
| 412 | this.docker = docker; | 407 | this.docker = docker; |
| 413 | } | 408 | } |
| 414 | 409 | ||
| 415 | - public String getMediaServerId() { | ||
| 416 | - return mediaServerId; | ||
| 417 | - } | ||
| 418 | - | ||
| 419 | - public void setMediaServerId(String mediaServerId) { | ||
| 420 | - this.mediaServerId = mediaServerId; | ||
| 421 | - } | ||
| 422 | - | ||
| 423 | public StreamInfo getStreamInfo() { | 410 | public StreamInfo getStreamInfo() { |
| 424 | return streamInfo; | 411 | return streamInfo; |
| 425 | } | 412 | } |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnStreamNoneReaderHookParam.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.media.zlm.dto.hook; | ||
| 2 | + | ||
| 3 | +public class OnStreamNoneReaderHookParam extends HookParam{ | ||
| 4 | + | ||
| 5 | + private String schema; | ||
| 6 | + private String app; | ||
| 7 | + private String stream; | ||
| 8 | + private String vhost; | ||
| 9 | + | ||
| 10 | + public String getSchema() { | ||
| 11 | + return schema; | ||
| 12 | + } | ||
| 13 | + | ||
| 14 | + public void setSchema(String schema) { | ||
| 15 | + this.schema = schema; | ||
| 16 | + } | ||
| 17 | + | ||
| 18 | + public String getApp() { | ||
| 19 | + return app; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + public void setApp(String app) { | ||
| 23 | + this.app = app; | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + public String getStream() { | ||
| 27 | + return stream; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + public void setStream(String stream) { | ||
| 31 | + this.stream = stream; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + public String getVhost() { | ||
| 35 | + return vhost; | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + public void setVhost(String vhost) { | ||
| 39 | + this.vhost = vhost; | ||
| 40 | + } | ||
| 41 | +} |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OnStreamNotFoundHookParam.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.media.zlm.dto.hook; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * zlm hook事件中的on_stream_not_found事件的参数 | ||
| 5 | + * @author lin | ||
| 6 | + */ | ||
| 7 | +public class OnStreamNotFoundHookParam extends HookParam{ | ||
| 8 | + private String id; | ||
| 9 | + private String app; | ||
| 10 | + private String stream; | ||
| 11 | + private String ip; | ||
| 12 | + private String params; | ||
| 13 | + private int port; | ||
| 14 | + private String schema; | ||
| 15 | + private String vhost; | ||
| 16 | + | ||
| 17 | + | ||
| 18 | + public String getId() { | ||
| 19 | + return id; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + public void setId(String id) { | ||
| 23 | + this.id = id; | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + public String getApp() { | ||
| 27 | + return app; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + public void setApp(String app) { | ||
| 31 | + this.app = app; | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + public String getStream() { | ||
| 35 | + return stream; | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + public void setStream(String stream) { | ||
| 39 | + this.stream = stream; | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + public String getIp() { | ||
| 43 | + return ip; | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + public void setIp(String ip) { | ||
| 47 | + this.ip = ip; | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + public String getParams() { | ||
| 51 | + return params; | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + public void setParams(String params) { | ||
| 55 | + this.params = params; | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + public int getPort() { | ||
| 59 | + return port; | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + public void setPort(int port) { | ||
| 63 | + this.port = port; | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + public String getSchema() { | ||
| 67 | + return schema; | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + public void setSchema(String schema) { | ||
| 71 | + this.schema = schema; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + public String getVhost() { | ||
| 75 | + return vhost; | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + public void setVhost(String vhost) { | ||
| 79 | + this.vhost = vhost; | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | + @Override | ||
| 83 | + public String toString() { | ||
| 84 | + return String.format("%s://%s:%s/%s/%s?%s", schema, ip, port, app, stream, params); | ||
| 85 | + } | ||
| 86 | +} |
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/OriginType.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/OriginType.java
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
| 1 | package com.genersoft.iot.vmp.service; | 1 | package com.genersoft.iot.vmp.service; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 4 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 5 | import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; | 5 | import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; |
| 6 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 6 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 7 | +import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData; | ||
| 7 | import com.genersoft.iot.vmp.service.bean.MediaServerLoad; | 8 | import com.genersoft.iot.vmp.service.bean.MediaServerLoad; |
| 8 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; | 9 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| 9 | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; | 10 | import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
| @@ -86,7 +87,7 @@ public interface IMediaServerService { | @@ -86,7 +87,7 @@ public interface IMediaServerService { | ||
| 86 | 87 | ||
| 87 | MediaServerItem getDefaultMediaServer(); | 88 | MediaServerItem getDefaultMediaServer(); |
| 88 | 89 | ||
| 89 | - void updateMediaServerKeepalive(String mediaServerId, JSONObject data); | 90 | + void updateMediaServerKeepalive(String mediaServerId, ServerKeepaliveData data); |
| 90 | 91 | ||
| 91 | boolean checkRtpServer(MediaServerItem mediaServerItem, String rtp, String stream); | 92 | boolean checkRtpServer(MediaServerItem mediaServerItem, String rtp, String stream); |
| 92 | 93 |
src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
| 1 | package com.genersoft.iot.vmp.service; | 1 | package com.genersoft.iot.vmp.service; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONArray; | 3 | +import com.alibaba.fastjson2.JSONArray; |
| 4 | import com.genersoft.iot.vmp.common.StreamInfo; | 4 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 6 | 6 |
src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
| 1 | package com.genersoft.iot.vmp.service; | 1 | package com.genersoft.iot.vmp.service; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.common.StreamInfo; | 4 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 5 | import com.genersoft.iot.vmp.conf.exception.ServiceException; | 5 | import com.genersoft.iot.vmp.conf.exception.ServiceException; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 6 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java
| 1 | package com.genersoft.iot.vmp.service; | 1 | package com.genersoft.iot.vmp.service; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.common.StreamInfo; | 4 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 6 | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; | 6 | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; |
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
| 1 | package com.genersoft.iot.vmp.service; | 1 | package com.genersoft.iot.vmp.service; |
| 2 | 2 | ||
| 3 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; | 3 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; |
| 4 | -import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; | ||
| 5 | -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; | 4 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; |
| 6 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 7 | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | 6 | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; |
| 8 | import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis; | 7 | import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis; |
| 9 | import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo; | 8 | import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo; |
| 10 | -import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; | ||
| 11 | import com.github.pagehelper.PageInfo; | 9 | import com.github.pagehelper.PageInfo; |
| 12 | 10 | ||
| 13 | import java.util.List; | 11 | import java.util.List; |
| @@ -38,7 +36,7 @@ public interface IStreamPushService { | @@ -38,7 +36,7 @@ public interface IStreamPushService { | ||
| 38 | 36 | ||
| 39 | List<StreamPushItem> getPushList(String mediaSererId); | 37 | List<StreamPushItem> getPushList(String mediaSererId); |
| 40 | 38 | ||
| 41 | - StreamPushItem transform(MediaItem item); | 39 | + StreamPushItem transform(OnStreamChangedHookParam item); |
| 42 | 40 | ||
| 43 | StreamPushItem getPush(String app, String streamId); | 41 | StreamPushItem getPush(String app, String streamId); |
| 44 | 42 |
src/main/java/com/genersoft/iot/vmp/service/bean/PlayBackResult.java
| 1 | package com.genersoft.iot.vmp.service.bean; | 1 | package com.genersoft.iot.vmp.service.bean; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; | 4 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 6 | 6 |
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
| @@ -10,6 +10,7 @@ import java.util.Set; | @@ -10,6 +10,7 @@ import java.util.Set; | ||
| 10 | 10 | ||
| 11 | import com.genersoft.iot.vmp.conf.DynamicTask; | 11 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 12 | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 12 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 13 | +import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData; | ||
| 13 | import com.genersoft.iot.vmp.service.bean.MediaServerLoad; | 14 | import com.genersoft.iot.vmp.service.bean.MediaServerLoad; |
| 14 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 15 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 15 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; | 16 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| @@ -23,9 +24,9 @@ import org.springframework.transaction.TransactionDefinition; | @@ -23,9 +24,9 @@ import org.springframework.transaction.TransactionDefinition; | ||
| 23 | import org.springframework.transaction.TransactionStatus; | 24 | import org.springframework.transaction.TransactionStatus; |
| 24 | import org.springframework.util.ObjectUtils; | 25 | import org.springframework.util.ObjectUtils; |
| 25 | 26 | ||
| 26 | -import com.alibaba.fastjson.JSON; | ||
| 27 | -import com.alibaba.fastjson.JSONArray; | ||
| 28 | -import com.alibaba.fastjson.JSONObject; | 27 | +import com.alibaba.fastjson2.JSON; |
| 28 | +import com.alibaba.fastjson2.JSONArray; | ||
| 29 | +import com.alibaba.fastjson2.JSONObject; | ||
| 29 | import com.genersoft.iot.vmp.common.VideoManagerConstants; | 30 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 30 | import com.genersoft.iot.vmp.conf.SipConfig; | 31 | import com.genersoft.iot.vmp.conf.SipConfig; |
| 31 | import com.genersoft.iot.vmp.conf.UserSetting; | 32 | import com.genersoft.iot.vmp.conf.UserSetting; |
| @@ -434,7 +435,7 @@ public class MediaServerServiceImpl implements IMediaServerService { | @@ -434,7 +435,7 @@ public class MediaServerServiceImpl implements IMediaServerService { | ||
| 434 | if (mediaServerConfig != null && mediaServerConfig.getInteger("code") == 0) { | 435 | if (mediaServerConfig != null && mediaServerConfig.getInteger("code") == 0) { |
| 435 | logger.info("[zlm心跳到期]:{}验证后zlm仍在线,恢复心跳信息,请检查zlm是否可以正常向wvp发送心跳", serverItem.getId()); | 436 | logger.info("[zlm心跳到期]:{}验证后zlm仍在线,恢复心跳信息,请检查zlm是否可以正常向wvp发送心跳", serverItem.getId()); |
| 436 | // 添加zlm信息 | 437 | // 添加zlm信息 |
| 437 | - updateMediaServerKeepalive(serverItem.getId(), mediaServerConfig); | 438 | + updateMediaServerKeepalive(serverItem.getId(), null); |
| 438 | }else { | 439 | }else { |
| 439 | publisher.zlmOfflineEventPublish(serverItem.getId()); | 440 | publisher.zlmOfflineEventPublish(serverItem.getId()); |
| 440 | } | 441 | } |
| @@ -526,15 +527,15 @@ public class MediaServerServiceImpl implements IMediaServerService { | @@ -526,15 +527,15 @@ public class MediaServerServiceImpl implements IMediaServerService { | ||
| 526 | Map<String, Object> param = new HashMap<>(); | 527 | Map<String, Object> param = new HashMap<>(); |
| 527 | param.put("api.secret",mediaServerItem.getSecret()); // -profile:v Baseline | 528 | param.put("api.secret",mediaServerItem.getSecret()); // -profile:v Baseline |
| 528 | param.put("hook.enable","1"); | 529 | param.put("hook.enable","1"); |
| 529 | - param.put("hook.on_flow_report",String.format("%s/on_flow_report", hookPrex)); | 530 | + param.put("hook.on_flow_report",""); |
| 530 | param.put("hook.on_play",String.format("%s/on_play", hookPrex)); | 531 | param.put("hook.on_play",String.format("%s/on_play", hookPrex)); |
| 531 | - param.put("hook.on_http_access",String.format("%s/on_http_access", hookPrex)); | 532 | + param.put("hook.on_http_access",""); |
| 532 | param.put("hook.on_publish", String.format("%s/on_publish", hookPrex)); | 533 | param.put("hook.on_publish", String.format("%s/on_publish", hookPrex)); |
| 533 | - param.put("hook.on_record_ts",String.format("%s/on_record_ts", hookPrex)); | ||
| 534 | - param.put("hook.on_rtsp_auth",String.format("%s/on_rtsp_auth", hookPrex)); | ||
| 535 | - param.put("hook.on_rtsp_realm",String.format("%s/on_rtsp_realm", hookPrex)); | 534 | + param.put("hook.on_record_ts",""); |
| 535 | + param.put("hook.on_rtsp_auth",""); | ||
| 536 | + param.put("hook.on_rtsp_realm",""); | ||
| 536 | param.put("hook.on_server_started",String.format("%s/on_server_started", hookPrex)); | 537 | param.put("hook.on_server_started",String.format("%s/on_server_started", hookPrex)); |
| 537 | - param.put("hook.on_shell_login",String.format("%s/on_shell_login", hookPrex)); | 538 | + param.put("hook.on_shell_login",""); |
| 538 | param.put("hook.on_stream_changed",String.format("%s/on_stream_changed", hookPrex)); | 539 | param.put("hook.on_stream_changed",String.format("%s/on_stream_changed", hookPrex)); |
| 539 | param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex)); | 540 | param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex)); |
| 540 | param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex)); | 541 | param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex)); |
| @@ -551,6 +552,7 @@ public class MediaServerServiceImpl implements IMediaServerService { | @@ -551,6 +552,7 @@ public class MediaServerServiceImpl implements IMediaServerService { | ||
| 551 | // 此参数不应大于播放器超时时间 | 552 | // 此参数不应大于播放器超时时间 |
| 552 | // 优化此消息以更快的收到流注销事件 | 553 | // 优化此消息以更快的收到流注销事件 |
| 553 | param.put("general.continue_push_ms", "3000" ); | 554 | param.put("general.continue_push_ms", "3000" ); |
| 555 | + param.put("general.publishToHls", "0" ); | ||
| 554 | // 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track, 设置此选项优化那些音频错误的不规范流, | 556 | // 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track, 设置此选项优化那些音频错误的不规范流, |
| 555 | // 等zlm支持给每个rtpServer设置关闭音频的时候可以不设置此选项 | 557 | // 等zlm支持给每个rtpServer设置关闭音频的时候可以不设置此选项 |
| 556 | // param.put("general.wait_track_ready_ms", "3000" ); | 558 | // param.put("general.wait_track_ready_ms", "3000" ); |
| @@ -645,7 +647,7 @@ public class MediaServerServiceImpl implements IMediaServerService { | @@ -645,7 +647,7 @@ public class MediaServerServiceImpl implements IMediaServerService { | ||
| 645 | } | 647 | } |
| 646 | 648 | ||
| 647 | @Override | 649 | @Override |
| 648 | - public void updateMediaServerKeepalive(String mediaServerId, JSONObject data) { | 650 | + public void updateMediaServerKeepalive(String mediaServerId, ServerKeepaliveData data) { |
| 649 | MediaServerItem mediaServerItem = getOne(mediaServerId); | 651 | MediaServerItem mediaServerItem = getOne(mediaServerId); |
| 650 | if (mediaServerItem == null) { | 652 | if (mediaServerItem == null) { |
| 651 | // 缓存不存在,从数据库查询,如果数据库不存在则是错误的 | 653 | // 缓存不存在,从数据库查询,如果数据库不存在则是错误的 |
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
| 1 | package com.genersoft.iot.vmp.service.impl; | 1 | package com.genersoft.iot.vmp.service.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONArray; | ||
| 5 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONArray; | ||
| 5 | +import com.alibaba.fastjson2.JSONObject; | ||
| 6 | import com.genersoft.iot.vmp.common.StreamInfo; | 6 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 7 | import com.genersoft.iot.vmp.common.StreamURL; | 7 | import com.genersoft.iot.vmp.common.StreamURL; |
| 8 | import com.genersoft.iot.vmp.conf.MediaConfig; | 8 | import com.genersoft.iot.vmp.conf.MediaConfig; |
| 9 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; | 9 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| 10 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 10 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 11 | -import com.genersoft.iot.vmp.media.zlm.dto.OnPublishHookParam; | ||
| 12 | import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; | 11 | import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; |
| 13 | import com.genersoft.iot.vmp.service.IMediaServerService; | 12 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| 14 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 13 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| @@ -17,7 +16,6 @@ import com.genersoft.iot.vmp.service.IMediaService; | @@ -17,7 +16,6 @@ import com.genersoft.iot.vmp.service.IMediaService; | ||
| 17 | import org.springframework.beans.factory.annotation.Autowired; | 16 | import org.springframework.beans.factory.annotation.Autowired; |
| 18 | import org.springframework.stereotype.Service; | 17 | import org.springframework.stereotype.Service; |
| 19 | import org.springframework.util.ObjectUtils; | 18 | import org.springframework.util.ObjectUtils; |
| 20 | -import org.springframework.util.StringUtils; | ||
| 21 | 19 | ||
| 22 | import java.net.URL; | 20 | import java.net.URL; |
| 23 | 21 |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| @@ -25,9 +25,9 @@ import org.springframework.stereotype.Service; | @@ -25,9 +25,9 @@ import org.springframework.stereotype.Service; | ||
| 25 | import org.springframework.util.ObjectUtils; | 25 | import org.springframework.util.ObjectUtils; |
| 26 | import org.springframework.web.context.request.async.DeferredResult; | 26 | import org.springframework.web.context.request.async.DeferredResult; |
| 27 | 27 | ||
| 28 | -import com.alibaba.fastjson.JSON; | ||
| 29 | -import com.alibaba.fastjson.JSONArray; | ||
| 30 | -import com.alibaba.fastjson.JSONObject; | 28 | +import com.alibaba.fastjson2.JSON; |
| 29 | +import com.alibaba.fastjson2.JSONArray; | ||
| 30 | +import com.alibaba.fastjson2.JSONObject; | ||
| 31 | import com.genersoft.iot.vmp.common.StreamInfo; | 31 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 32 | import com.genersoft.iot.vmp.conf.DynamicTask; | 32 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 33 | import com.genersoft.iot.vmp.conf.UserSetting; | 33 | import com.genersoft.iot.vmp.conf.UserSetting; |
| @@ -188,7 +188,7 @@ public class PlayServiceImpl implements IPlayService { | @@ -188,7 +188,7 @@ public class PlayServiceImpl implements IPlayService { | ||
| 188 | 188 | ||
| 189 | resultHolder.invokeAllResult(msg); | 189 | resultHolder.invokeAllResult(msg); |
| 190 | if (hookEvent != null) { | 190 | if (hookEvent != null) { |
| 191 | - hookEvent.response(mediaServerItem, JSONObject.parseObject(JSON.toJSONString(streamInfo))); | 191 | + hookEvent.response(mediaServerItem, JSON.parseObject(JSON.toJSONString(streamInfo))); |
| 192 | } | 192 | } |
| 193 | } | 193 | } |
| 194 | 194 |
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
| 1 | package com.genersoft.iot.vmp.service.impl; | 1 | package com.genersoft.iot.vmp.service.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONArray; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONArray; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.common.StreamInfo; | 5 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 6 | import com.genersoft.iot.vmp.conf.UserSetting; | 6 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 7 | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 7 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 8 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; | 8 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; |
| 9 | -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 10 | -import com.genersoft.iot.vmp.gb28181.bean.TreeType; | ||
| 11 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | 9 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
| 12 | import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; | 10 | import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; |
| 13 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; | 11 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| 14 | -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; | 12 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; |
| 15 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 13 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 16 | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; | 14 | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; |
| 17 | import com.genersoft.iot.vmp.service.IGbStreamService; | 15 | import com.genersoft.iot.vmp.service.IGbStreamService; |
| @@ -27,7 +25,6 @@ import com.genersoft.iot.vmp.service.IStreamProxyService; | @@ -27,7 +25,6 @@ import com.genersoft.iot.vmp.service.IStreamProxyService; | ||
| 27 | import com.genersoft.iot.vmp.utils.DateUtil; | 25 | import com.genersoft.iot.vmp.utils.DateUtil; |
| 28 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; | 26 | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; |
| 29 | import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo; | 27 | import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo; |
| 30 | -import com.genersoft.iot.vmp.vmanager.bean.WVPResult; | ||
| 31 | import com.github.pagehelper.PageInfo; | 28 | import com.github.pagehelper.PageInfo; |
| 32 | import org.slf4j.Logger; | 29 | import org.slf4j.Logger; |
| 33 | import org.slf4j.LoggerFactory; | 30 | import org.slf4j.LoggerFactory; |
| @@ -37,9 +34,7 @@ import org.springframework.stereotype.Service; | @@ -37,9 +34,7 @@ import org.springframework.stereotype.Service; | ||
| 37 | import org.springframework.transaction.TransactionDefinition; | 34 | import org.springframework.transaction.TransactionDefinition; |
| 38 | import org.springframework.transaction.TransactionStatus; | 35 | import org.springframework.transaction.TransactionStatus; |
| 39 | import org.springframework.util.ObjectUtils; | 36 | import org.springframework.util.ObjectUtils; |
| 40 | -import org.springframework.util.StringUtils; | ||
| 41 | 37 | ||
| 42 | -import java.net.InetAddress; | ||
| 43 | import java.util.*; | 38 | import java.util.*; |
| 44 | 39 | ||
| 45 | /** | 40 | /** |
| @@ -389,18 +384,18 @@ public class StreamProxyServiceImpl implements IStreamProxyService { | @@ -389,18 +384,18 @@ public class StreamProxyServiceImpl implements IStreamProxyService { | ||
| 389 | String type = "PULL"; | 384 | String type = "PULL"; |
| 390 | 385 | ||
| 391 | // 发送redis消息 | 386 | // 发送redis消息 |
| 392 | - List<MediaItem> mediaItems = redisCatchStorage.getStreams(mediaServerId, type); | ||
| 393 | - if (mediaItems.size() > 0) { | ||
| 394 | - for (MediaItem mediaItem : mediaItems) { | 387 | + List<OnStreamChangedHookParam> onStreamChangedHookParams = redisCatchStorage.getStreams(mediaServerId, type); |
| 388 | + if (onStreamChangedHookParams.size() > 0) { | ||
| 389 | + for (OnStreamChangedHookParam onStreamChangedHookParam : onStreamChangedHookParams) { | ||
| 395 | JSONObject jsonObject = new JSONObject(); | 390 | JSONObject jsonObject = new JSONObject(); |
| 396 | jsonObject.put("serverId", userSetting.getServerId()); | 391 | jsonObject.put("serverId", userSetting.getServerId()); |
| 397 | - jsonObject.put("app", mediaItem.getApp()); | ||
| 398 | - jsonObject.put("stream", mediaItem.getStream()); | 392 | + jsonObject.put("app", onStreamChangedHookParam.getApp()); |
| 393 | + jsonObject.put("stream", onStreamChangedHookParam.getStream()); | ||
| 399 | jsonObject.put("register", false); | 394 | jsonObject.put("register", false); |
| 400 | jsonObject.put("mediaServerId", mediaServerId); | 395 | jsonObject.put("mediaServerId", mediaServerId); |
| 401 | redisCatchStorage.sendStreamChangeMsg(type, jsonObject); | 396 | redisCatchStorage.sendStreamChangeMsg(type, jsonObject); |
| 402 | // 移除redis内流的信息 | 397 | // 移除redis内流的信息 |
| 403 | - redisCatchStorage.removeStream(mediaServerId, type, mediaItem.getApp(), mediaItem.getStream()); | 398 | + redisCatchStorage.removeStream(mediaServerId, type, onStreamChangedHookParam.getApp(), onStreamChangedHookParam.getStream()); |
| 404 | } | 399 | } |
| 405 | } | 400 | } |
| 406 | } | 401 | } |
| @@ -415,6 +410,47 @@ public class StreamProxyServiceImpl implements IStreamProxyService { | @@ -415,6 +410,47 @@ public class StreamProxyServiceImpl implements IStreamProxyService { | ||
| 415 | return streamProxyMapper.updateStatus(app, stream, status); | 410 | return streamProxyMapper.updateStatus(app, stream, status); |
| 416 | } | 411 | } |
| 417 | 412 | ||
| 413 | + private void syncPullStream(String mediaServerId){ | ||
| 414 | + MediaServerItem mediaServer = mediaServerService.getOne(mediaServerId); | ||
| 415 | + if (mediaServer != null) { | ||
| 416 | + List<OnStreamChangedHookParam> allPullStream = redisCatchStorage.getStreams(mediaServerId, "PULL"); | ||
| 417 | + if (allPullStream.size() > 0) { | ||
| 418 | + zlmresTfulUtils.getMediaList(mediaServer, jsonObject->{ | ||
| 419 | + Map<String, StreamInfo> stringStreamInfoMap = new HashMap<>(); | ||
| 420 | + if (jsonObject.getInteger("code") == 0) { | ||
| 421 | + JSONArray data = jsonObject.getJSONArray("data"); | ||
| 422 | + if(data != null && data.size() > 0) { | ||
| 423 | + for (int i = 0; i < data.size(); i++) { | ||
| 424 | + JSONObject streamJSONObj = data.getJSONObject(i); | ||
| 425 | + if ("rtsp".equals(streamJSONObj.getString("schema"))) { | ||
| 426 | + StreamInfo streamInfo = new StreamInfo(); | ||
| 427 | + String app = streamJSONObj.getString("app"); | ||
| 428 | + String stream = streamJSONObj.getString("stream"); | ||
| 429 | + streamInfo.setApp(app); | ||
| 430 | + streamInfo.setStream(stream); | ||
| 431 | + stringStreamInfoMap.put(app+stream, streamInfo); | ||
| 432 | + } | ||
| 433 | + } | ||
| 434 | + } | ||
| 435 | + } | ||
| 436 | + if (stringStreamInfoMap.size() == 0) { | ||
| 437 | + redisCatchStorage.removeStream(mediaServerId, "PULL"); | ||
| 438 | + }else { | ||
| 439 | + for (String key : stringStreamInfoMap.keySet()) { | ||
| 440 | + StreamInfo streamInfo = stringStreamInfoMap.get(key); | ||
| 441 | + if (stringStreamInfoMap.get(streamInfo.getApp() + streamInfo.getStream()) == null) { | ||
| 442 | + redisCatchStorage.removeStream(mediaServerId, "PULL", streamInfo.getApp(), | ||
| 443 | + streamInfo.getStream()); | ||
| 444 | + } | ||
| 445 | + } | ||
| 446 | + } | ||
| 447 | + }); | ||
| 448 | + } | ||
| 449 | + | ||
| 450 | + } | ||
| 451 | + | ||
| 452 | + } | ||
| 453 | + | ||
| 418 | @Override | 454 | @Override |
| 419 | public ResourceBaceInfo getOverview() { | 455 | public ResourceBaceInfo getOverview() { |
| 420 | return streamProxyMapper.getOverview(); | 456 | return streamProxyMapper.getOverview(); |
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
| 1 | package com.genersoft.iot.vmp.service.impl; | 1 | package com.genersoft.iot.vmp.service.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONArray; | ||
| 5 | -import com.alibaba.fastjson.JSONObject; | ||
| 6 | -import com.alibaba.fastjson.TypeReference; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONArray; | ||
| 5 | +import com.alibaba.fastjson2.JSONObject; | ||
| 6 | +import com.alibaba.fastjson2.TypeReference; | ||
| 7 | import com.genersoft.iot.vmp.conf.MediaConfig; | 7 | import com.genersoft.iot.vmp.conf.MediaConfig; |
| 8 | import com.genersoft.iot.vmp.conf.UserSetting; | 8 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 9 | import com.genersoft.iot.vmp.gb28181.bean.*; | 9 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| @@ -11,6 +11,8 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | @@ -11,6 +11,8 @@ import com.genersoft.iot.vmp.gb28181.event.EventPublisher; | ||
| 11 | import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; | 11 | import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; |
| 12 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; | 12 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| 13 | import com.genersoft.iot.vmp.media.zlm.dto.*; | 13 | import com.genersoft.iot.vmp.media.zlm.dto.*; |
| 14 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; | ||
| 15 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OriginType; | ||
| 14 | import com.genersoft.iot.vmp.service.IGbStreamService; | 16 | import com.genersoft.iot.vmp.service.IGbStreamService; |
| 15 | import com.genersoft.iot.vmp.service.IMediaServerService; | 17 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| 16 | import com.genersoft.iot.vmp.service.IStreamPushService; | 18 | import com.genersoft.iot.vmp.service.IStreamPushService; |
| @@ -29,7 +31,6 @@ import org.springframework.stereotype.Service; | @@ -29,7 +31,6 @@ import org.springframework.stereotype.Service; | ||
| 29 | import org.springframework.transaction.TransactionDefinition; | 31 | import org.springframework.transaction.TransactionDefinition; |
| 30 | import org.springframework.transaction.TransactionStatus; | 32 | import org.springframework.transaction.TransactionStatus; |
| 31 | import org.springframework.util.ObjectUtils; | 33 | import org.springframework.util.ObjectUtils; |
| 32 | -import org.springframework.util.StringUtils; | ||
| 33 | 34 | ||
| 34 | import java.util.*; | 35 | import java.util.*; |
| 35 | import java.util.stream.Collectors; | 36 | import java.util.stream.Collectors; |
| @@ -93,8 +94,8 @@ public class StreamPushServiceImpl implements IStreamPushService { | @@ -93,8 +94,8 @@ public class StreamPushServiceImpl implements IStreamPushService { | ||
| 93 | 94 | ||
| 94 | Map<String, StreamPushItem> result = new HashMap<>(); | 95 | Map<String, StreamPushItem> result = new HashMap<>(); |
| 95 | 96 | ||
| 96 | - List<MediaItem> mediaItems = JSON.parseObject(jsonData, new TypeReference<List<MediaItem>>() {}); | ||
| 97 | - for (MediaItem item : mediaItems) { | 97 | + List<OnStreamChangedHookParam> onStreamChangedHookParams = JSON.parseObject(jsonData, new TypeReference<List<OnStreamChangedHookParam>>() {}); |
| 98 | + for (OnStreamChangedHookParam item : onStreamChangedHookParams) { | ||
| 98 | 99 | ||
| 99 | // 不保存国标推理以及拉流代理的流 | 100 | // 不保存国标推理以及拉流代理的流 |
| 100 | if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal() | 101 | if (item.getOriginType() == OriginType.RTSP_PUSH.ordinal() |
| @@ -112,7 +113,7 @@ public class StreamPushServiceImpl implements IStreamPushService { | @@ -112,7 +113,7 @@ public class StreamPushServiceImpl implements IStreamPushService { | ||
| 112 | return new ArrayList<>(result.values()); | 113 | return new ArrayList<>(result.values()); |
| 113 | } | 114 | } |
| 114 | @Override | 115 | @Override |
| 115 | - public StreamPushItem transform(MediaItem item) { | 116 | + public StreamPushItem transform(OnStreamChangedHookParam item) { |
| 116 | StreamPushItem streamPushItem = new StreamPushItem(); | 117 | StreamPushItem streamPushItem = new StreamPushItem(); |
| 117 | streamPushItem.setApp(item.getApp()); | 118 | streamPushItem.setApp(item.getApp()); |
| 118 | streamPushItem.setMediaServerId(item.getMediaServerId()); | 119 | streamPushItem.setMediaServerId(item.getMediaServerId()); |
| @@ -206,8 +207,8 @@ public class StreamPushServiceImpl implements IStreamPushService { | @@ -206,8 +207,8 @@ public class StreamPushServiceImpl implements IStreamPushService { | ||
| 206 | List<StreamPushItem> pushList = getPushList(mediaServerId); | 207 | List<StreamPushItem> pushList = getPushList(mediaServerId); |
| 207 | Map<String, StreamPushItem> pushItemMap = new HashMap<>(); | 208 | Map<String, StreamPushItem> pushItemMap = new HashMap<>(); |
| 208 | // redis记录 | 209 | // redis记录 |
| 209 | - List<MediaItem> mediaItems = redisCatchStorage.getStreams(mediaServerId, "PUSH"); | ||
| 210 | - Map<String, MediaItem> streamInfoPushItemMap = new HashMap<>(); | 210 | + List<OnStreamChangedHookParam> onStreamChangedHookParams = redisCatchStorage.getStreams(mediaServerId, "PUSH"); |
| 211 | + Map<String, OnStreamChangedHookParam> streamInfoPushItemMap = new HashMap<>(); | ||
| 211 | if (pushList.size() > 0) { | 212 | if (pushList.size() > 0) { |
| 212 | for (StreamPushItem streamPushItem : pushList) { | 213 | for (StreamPushItem streamPushItem : pushList) { |
| 213 | if (ObjectUtils.isEmpty(streamPushItem.getGbId())) { | 214 | if (ObjectUtils.isEmpty(streamPushItem.getGbId())) { |
| @@ -215,9 +216,9 @@ public class StreamPushServiceImpl implements IStreamPushService { | @@ -215,9 +216,9 @@ public class StreamPushServiceImpl implements IStreamPushService { | ||
| 215 | } | 216 | } |
| 216 | } | 217 | } |
| 217 | } | 218 | } |
| 218 | - if (mediaItems.size() > 0) { | ||
| 219 | - for (MediaItem mediaItem : mediaItems) { | ||
| 220 | - streamInfoPushItemMap.put(mediaItem.getApp() + mediaItem.getStream(), mediaItem); | 219 | + if (onStreamChangedHookParams.size() > 0) { |
| 220 | + for (OnStreamChangedHookParam onStreamChangedHookParam : onStreamChangedHookParams) { | ||
| 221 | + streamInfoPushItemMap.put(onStreamChangedHookParam.getApp() + onStreamChangedHookParam.getStream(), onStreamChangedHookParam); | ||
| 221 | } | 222 | } |
| 222 | } | 223 | } |
| 223 | zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{ | 224 | zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{ |
| @@ -258,19 +259,19 @@ public class StreamPushServiceImpl implements IStreamPushService { | @@ -258,19 +259,19 @@ public class StreamPushServiceImpl implements IStreamPushService { | ||
| 258 | } | 259 | } |
| 259 | 260 | ||
| 260 | } | 261 | } |
| 261 | - Collection<MediaItem> offlineMediaItemList = streamInfoPushItemMap.values(); | ||
| 262 | - if (offlineMediaItemList.size() > 0) { | 262 | + Collection<OnStreamChangedHookParam> offlineOnStreamChangedHookParamList = streamInfoPushItemMap.values(); |
| 263 | + if (offlineOnStreamChangedHookParamList.size() > 0) { | ||
| 263 | String type = "PUSH"; | 264 | String type = "PUSH"; |
| 264 | - for (MediaItem offlineMediaItem : offlineMediaItemList) { | 265 | + for (OnStreamChangedHookParam offlineOnStreamChangedHookParam : offlineOnStreamChangedHookParamList) { |
| 265 | JSONObject jsonObject = new JSONObject(); | 266 | JSONObject jsonObject = new JSONObject(); |
| 266 | jsonObject.put("serverId", userSetting.getServerId()); | 267 | jsonObject.put("serverId", userSetting.getServerId()); |
| 267 | - jsonObject.put("app", offlineMediaItem.getApp()); | ||
| 268 | - jsonObject.put("stream", offlineMediaItem.getStream()); | 268 | + jsonObject.put("app", offlineOnStreamChangedHookParam.getApp()); |
| 269 | + jsonObject.put("stream", offlineOnStreamChangedHookParam.getStream()); | ||
| 269 | jsonObject.put("register", false); | 270 | jsonObject.put("register", false); |
| 270 | jsonObject.put("mediaServerId", mediaServerId); | 271 | jsonObject.put("mediaServerId", mediaServerId); |
| 271 | redisCatchStorage.sendStreamChangeMsg(type, jsonObject); | 272 | redisCatchStorage.sendStreamChangeMsg(type, jsonObject); |
| 272 | // 移除redis内流的信息 | 273 | // 移除redis内流的信息 |
| 273 | - redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlineMediaItem.getApp(), offlineMediaItem.getStream()); | 274 | + redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlineOnStreamChangedHookParam.getApp(), offlineOnStreamChangedHookParam.getStream()); |
| 274 | } | 275 | } |
| 275 | } | 276 | } |
| 276 | })); | 277 | })); |
| @@ -288,15 +289,15 @@ public class StreamPushServiceImpl implements IStreamPushService { | @@ -288,15 +289,15 @@ public class StreamPushServiceImpl implements IStreamPushService { | ||
| 288 | // 发送流停止消息 | 289 | // 发送流停止消息 |
| 289 | String type = "PUSH"; | 290 | String type = "PUSH"; |
| 290 | // 发送redis消息 | 291 | // 发送redis消息 |
| 291 | - List<MediaItem> streamInfoList = redisCatchStorage.getStreams(mediaServerId, type); | 292 | + List<OnStreamChangedHookParam> streamInfoList = redisCatchStorage.getStreams(mediaServerId, type); |
| 292 | if (streamInfoList.size() > 0) { | 293 | if (streamInfoList.size() > 0) { |
| 293 | - for (MediaItem mediaItem : streamInfoList) { | 294 | + for (OnStreamChangedHookParam onStreamChangedHookParam : streamInfoList) { |
| 294 | // 移除redis内流的信息 | 295 | // 移除redis内流的信息 |
| 295 | - redisCatchStorage.removeStream(mediaServerId, type, mediaItem.getApp(), mediaItem.getStream()); | 296 | + redisCatchStorage.removeStream(mediaServerId, type, onStreamChangedHookParam.getApp(), onStreamChangedHookParam.getStream()); |
| 296 | JSONObject jsonObject = new JSONObject(); | 297 | JSONObject jsonObject = new JSONObject(); |
| 297 | jsonObject.put("serverId", userSetting.getServerId()); | 298 | jsonObject.put("serverId", userSetting.getServerId()); |
| 298 | - jsonObject.put("app", mediaItem.getApp()); | ||
| 299 | - jsonObject.put("stream", mediaItem.getStream()); | 299 | + jsonObject.put("app", onStreamChangedHookParam.getApp()); |
| 300 | + jsonObject.put("stream", onStreamChangedHookParam.getStream()); | ||
| 300 | jsonObject.put("register", false); | 301 | jsonObject.put("register", false); |
| 301 | jsonObject.put("mediaServerId", mediaServerId); | 302 | jsonObject.put("mediaServerId", mediaServerId); |
| 302 | redisCatchStorage.sendStreamChangeMsg(type, jsonObject); | 303 | redisCatchStorage.sendStreamChangeMsg(type, jsonObject); |
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisAlarmMsgListener.java
| 1 | package com.genersoft.iot.vmp.service.redisMsg; | 1 | package com.genersoft.iot.vmp.service.redisMsg; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.*; | 4 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 5 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; | 5 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; |
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java
| 1 | package com.genersoft.iot.vmp.service.redisMsg; | 1 | package com.genersoft.iot.vmp.service.redisMsg; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.conf.DynamicTask; | 5 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 6 | import com.genersoft.iot.vmp.conf.UserSetting; | 6 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 7 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; | 7 | import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; |
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGpsMsgListener.java
| 1 | package com.genersoft.iot.vmp.service.redisMsg; | 1 | package com.genersoft.iot.vmp.service.redisMsg; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; | 4 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; |
| 5 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 5 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 6 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; | 6 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamResponseListener.java
| 1 | package com.genersoft.iot.vmp.service.redisMsg; | 1 | package com.genersoft.iot.vmp.service.redisMsg; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; | 4 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; |
| 5 | import com.genersoft.iot.vmp.service.bean.MessageForPushChannelResponse; | 5 | import com.genersoft.iot.vmp.service.bean.MessageForPushChannelResponse; |
| 6 | import org.slf4j.Logger; | 6 | import org.slf4j.Logger; |
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamStatusListMsgListener.java
| 1 | package com.genersoft.iot.vmp.service.redisMsg; | 1 | package com.genersoft.iot.vmp.service.redisMsg; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | 5 | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; |
| 6 | import com.genersoft.iot.vmp.service.IGbStreamService; | 6 | import com.genersoft.iot.vmp.service.IGbStreamService; |
| 7 | import com.genersoft.iot.vmp.service.IMediaServerService; | 7 | import com.genersoft.iot.vmp.service.IMediaServerService; |
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisPushStreamStatusMsgListener.java
| 1 | package com.genersoft.iot.vmp.service.redisMsg; | 1 | package com.genersoft.iot.vmp.service.redisMsg; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | import com.genersoft.iot.vmp.common.VideoManagerConstants; | 4 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 5 | import com.genersoft.iot.vmp.conf.DynamicTask; | 5 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 6 | import com.genersoft.iot.vmp.service.IStreamPushService; | 6 | import com.genersoft.iot.vmp.service.IStreamPushService; |
src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisStreamMsgListener.java
| 1 | package com.genersoft.iot.vmp.service.redisMsg; | 1 | package com.genersoft.iot.vmp.service.redisMsg; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.conf.UserSetting; | 5 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 6 | 6 | ||
| 7 | import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; | 7 | import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; |
| 8 | -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; | 8 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; |
| 9 | import org.slf4j.Logger; | 9 | import org.slf4j.Logger; |
| 10 | import org.slf4j.LoggerFactory; | 10 | import org.slf4j.LoggerFactory; |
| 11 | import org.springframework.beans.factory.annotation.Autowired; | 11 | import org.springframework.beans.factory.annotation.Autowired; |
| @@ -66,20 +66,20 @@ public class RedisStreamMsgListener implements MessageListener { | @@ -66,20 +66,20 @@ public class RedisStreamMsgListener implements MessageListener { | ||
| 66 | String stream = steamMsgJson.getString("stream"); | 66 | String stream = steamMsgJson.getString("stream"); |
| 67 | boolean register = steamMsgJson.getBoolean("register"); | 67 | boolean register = steamMsgJson.getBoolean("register"); |
| 68 | String mediaServerId = steamMsgJson.getString("mediaServerId"); | 68 | String mediaServerId = steamMsgJson.getString("mediaServerId"); |
| 69 | - MediaItem mediaItem = new MediaItem(); | ||
| 70 | - mediaItem.setSeverId(serverId); | ||
| 71 | - mediaItem.setApp(app); | ||
| 72 | - mediaItem.setStream(stream); | ||
| 73 | - mediaItem.setRegist(register); | ||
| 74 | - mediaItem.setMediaServerId(mediaServerId); | ||
| 75 | - mediaItem.setCreateStamp(System.currentTimeMillis()/1000); | ||
| 76 | - mediaItem.setAliveSecond(0L); | ||
| 77 | - mediaItem.setTotalReaderCount("0"); | ||
| 78 | - mediaItem.setOriginType(0); | ||
| 79 | - mediaItem.setOriginTypeStr("0"); | ||
| 80 | - mediaItem.setOriginTypeStr("unknown"); | 69 | + OnStreamChangedHookParam onStreamChangedHookParam = new OnStreamChangedHookParam(); |
| 70 | + onStreamChangedHookParam.setSeverId(serverId); | ||
| 71 | + onStreamChangedHookParam.setApp(app); | ||
| 72 | + onStreamChangedHookParam.setStream(stream); | ||
| 73 | + onStreamChangedHookParam.setRegist(register); | ||
| 74 | + onStreamChangedHookParam.setMediaServerId(mediaServerId); | ||
| 75 | + onStreamChangedHookParam.setCreateStamp(System.currentTimeMillis()/1000); | ||
| 76 | + onStreamChangedHookParam.setAliveSecond(0L); | ||
| 77 | + onStreamChangedHookParam.setTotalReaderCount("0"); | ||
| 78 | + onStreamChangedHookParam.setOriginType(0); | ||
| 79 | + onStreamChangedHookParam.setOriginTypeStr("0"); | ||
| 80 | + onStreamChangedHookParam.setOriginTypeStr("unknown"); | ||
| 81 | if (register) { | 81 | if (register) { |
| 82 | - zlmMediaListManager.addPush(mediaItem); | 82 | + zlmMediaListManager.addPush(onStreamChangedHookParam); |
| 83 | }else { | 83 | }else { |
| 84 | zlmMediaListManager.removeMedia(app, stream); | 84 | zlmMediaListManager.removeMedia(app, stream); |
| 85 | } | 85 | } |
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
| 1 | package com.genersoft.iot.vmp.storager; | 1 | package com.genersoft.iot.vmp.storager; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.common.StreamInfo; | 4 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 5 | import com.genersoft.iot.vmp.common.SystemAllInfo; | 5 | import com.genersoft.iot.vmp.common.SystemAllInfo; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.*; | 6 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 7 | import com.genersoft.iot.vmp.media.zlm.dto.*; | 7 | import com.genersoft.iot.vmp.media.zlm.dto.*; |
| 8 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; | ||
| 8 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; | 9 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; |
| 9 | import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; | 10 | import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; |
| 10 | -import com.genersoft.iot.vmp.service.bean.SSRCInfo; | ||
| 11 | import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; | 11 | import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; |
| 12 | import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo; | 12 | import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo; |
| 13 | 13 | ||
| @@ -131,7 +131,7 @@ public interface IRedisCatchStorage { | @@ -131,7 +131,7 @@ public interface IRedisCatchStorage { | ||
| 131 | * @param app | 131 | * @param app |
| 132 | * @param streamId | 132 | * @param streamId |
| 133 | */ | 133 | */ |
| 134 | - void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, MediaItem item); | 134 | + void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, OnStreamChangedHookParam item); |
| 135 | 135 | ||
| 136 | /** | 136 | /** |
| 137 | * 移除流信息从redis | 137 | * 移除流信息从redis |
| @@ -165,7 +165,7 @@ public interface IRedisCatchStorage { | @@ -165,7 +165,7 @@ public interface IRedisCatchStorage { | ||
| 165 | */ | 165 | */ |
| 166 | ThirdPartyGB queryMemberNoGBId(String queryKey); | 166 | ThirdPartyGB queryMemberNoGBId(String queryKey); |
| 167 | 167 | ||
| 168 | - List<MediaItem> getStreams(String mediaServerId, String pull); | 168 | + List<OnStreamChangedHookParam> getStreams(String mediaServerId, String pull); |
| 169 | 169 | ||
| 170 | /** | 170 | /** |
| 171 | * 将device信息写入redis | 171 | * 将device信息写入redis |
| @@ -191,7 +191,7 @@ public interface IRedisCatchStorage { | @@ -191,7 +191,7 @@ public interface IRedisCatchStorage { | ||
| 191 | 191 | ||
| 192 | void resetAllSN(); | 192 | void resetAllSN(); |
| 193 | 193 | ||
| 194 | - MediaItem getStreamInfo(String app, String streamId, String mediaServerId); | 194 | + OnStreamChangedHookParam getStreamInfo(String app, String streamId, String mediaServerId); |
| 195 | 195 | ||
| 196 | void addCpuInfo(double cpuInfo); | 196 | void addCpuInfo(double cpuInfo); |
| 197 | 197 |
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
| 1 | package com.genersoft.iot.vmp.storager.impl; | 1 | package com.genersoft.iot.vmp.storager.impl; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.common.StreamInfo; | 5 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 6 | import com.genersoft.iot.vmp.common.SystemAllInfo; | 6 | import com.genersoft.iot.vmp.common.SystemAllInfo; |
| 7 | import com.genersoft.iot.vmp.common.VideoManagerConstants; | 7 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 8 | import com.genersoft.iot.vmp.conf.UserSetting; | 8 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 9 | import com.genersoft.iot.vmp.gb28181.bean.*; | 9 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 10 | -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; | 10 | +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; |
| 11 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 11 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 12 | import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; | 12 | import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; |
| 13 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; | 13 | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; |
| @@ -573,14 +573,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { | @@ -573,14 +573,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { | ||
| 573 | } | 573 | } |
| 574 | 574 | ||
| 575 | @Override | 575 | @Override |
| 576 | - public void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, MediaItem mediaItem) { | 576 | + public void addStream(MediaServerItem mediaServerItem, String type, String app, String streamId, OnStreamChangedHookParam onStreamChangedHookParam) { |
| 577 | // 查找是否使用了callID | 577 | // 查找是否使用了callID |
| 578 | StreamAuthorityInfo streamAuthorityInfo = getStreamAuthorityInfo(app, streamId); | 578 | StreamAuthorityInfo streamAuthorityInfo = getStreamAuthorityInfo(app, streamId); |
| 579 | String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId(); | 579 | String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_" + app + "_" + streamId + "_" + mediaServerItem.getId(); |
| 580 | if (streamAuthorityInfo != null) { | 580 | if (streamAuthorityInfo != null) { |
| 581 | - mediaItem.setCallId(streamAuthorityInfo.getCallId()); | 581 | + onStreamChangedHookParam.setCallId(streamAuthorityInfo.getCallId()); |
| 582 | } | 582 | } |
| 583 | - RedisUtil.set(key, mediaItem); | 583 | + RedisUtil.set(key, onStreamChangedHookParam); |
| 584 | } | 584 | } |
| 585 | 585 | ||
| 586 | @Override | 586 | @Override |
| @@ -625,7 +625,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { | @@ -625,7 +625,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { | ||
| 625 | public ThirdPartyGB queryMemberNoGBId(String queryKey) { | 625 | public ThirdPartyGB queryMemberNoGBId(String queryKey) { |
| 626 | String key = VideoManagerConstants.WVP_STREAM_GB_ID_PREFIX + queryKey; | 626 | String key = VideoManagerConstants.WVP_STREAM_GB_ID_PREFIX + queryKey; |
| 627 | JSONObject jsonObject = (JSONObject)RedisUtil.get(key); | 627 | JSONObject jsonObject = (JSONObject)RedisUtil.get(key); |
| 628 | - return JSONObject.toJavaObject(jsonObject, ThirdPartyGB.class); | 628 | + return jsonObject.to(ThirdPartyGB.class); |
| 629 | } | 629 | } |
| 630 | 630 | ||
| 631 | @Override | 631 | @Override |
| @@ -638,13 +638,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { | @@ -638,13 +638,13 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { | ||
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | @Override | 640 | @Override |
| 641 | - public List<MediaItem> getStreams(String mediaServerId, String type) { | ||
| 642 | - List<MediaItem> result = new ArrayList<>(); | 641 | + public List<OnStreamChangedHookParam> getStreams(String mediaServerId, String type) { |
| 642 | + List<OnStreamChangedHookParam> result = new ArrayList<>(); | ||
| 643 | String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_*_*_" + mediaServerId; | 643 | String key = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_" + type + "_*_*_" + mediaServerId; |
| 644 | List<Object> streams = RedisUtil.scan(key); | 644 | List<Object> streams = RedisUtil.scan(key); |
| 645 | for (Object stream : streams) { | 645 | for (Object stream : streams) { |
| 646 | - MediaItem mediaItem = (MediaItem)RedisUtil.get((String) stream); | ||
| 647 | - result.add(mediaItem); | 646 | + OnStreamChangedHookParam onStreamChangedHookParam = (OnStreamChangedHookParam)RedisUtil.get((String) stream); |
| 647 | + result.add(onStreamChangedHookParam); | ||
| 648 | } | 648 | } |
| 649 | return result; | 649 | return result; |
| 650 | } | 650 | } |
| @@ -716,14 +716,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { | @@ -716,14 +716,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { | ||
| 716 | 716 | ||
| 717 | 717 | ||
| 718 | @Override | 718 | @Override |
| 719 | - public MediaItem getStreamInfo(String app, String streamId, String mediaServerId) { | 719 | + public OnStreamChangedHookParam getStreamInfo(String app, String streamId, String mediaServerId) { |
| 720 | String scanKey = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_*_" + app + "_" + streamId + "_" + mediaServerId; | 720 | String scanKey = VideoManagerConstants.WVP_SERVER_STREAM_PREFIX + userSetting.getServerId() + "_*_" + app + "_" + streamId + "_" + mediaServerId; |
| 721 | 721 | ||
| 722 | - MediaItem result = null; | 722 | + OnStreamChangedHookParam result = null; |
| 723 | List<Object> keys = RedisUtil.scan(scanKey); | 723 | List<Object> keys = RedisUtil.scan(scanKey); |
| 724 | if (keys.size() > 0) { | 724 | if (keys.size() > 0) { |
| 725 | String key = (String) keys.get(0); | 725 | String key = (String) keys.get(0); |
| 726 | - result = (MediaItem)RedisUtil.get(key); | 726 | + result = (OnStreamChangedHookParam)RedisUtil.get(key); |
| 727 | } | 727 | } |
| 728 | 728 | ||
| 729 | return result; | 729 | return result; |
src/main/java/com/genersoft/iot/vmp/utils/SystemInfoUtils.java
| 1 | package com.genersoft.iot.vmp.utils; | 1 | package com.genersoft.iot.vmp.utils; |
| 2 | 2 | ||
| 3 | +import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener; | ||
| 4 | +import org.slf4j.Logger; | ||
| 5 | +import org.slf4j.LoggerFactory; | ||
| 3 | import org.springframework.util.ObjectUtils; | 6 | import org.springframework.util.ObjectUtils; |
| 4 | import oshi.SystemInfo; | 7 | import oshi.SystemInfo; |
| 5 | import oshi.hardware.*; | 8 | import oshi.hardware.*; |
| @@ -21,6 +24,8 @@ import java.util.concurrent.TimeUnit; | @@ -21,6 +24,8 @@ import java.util.concurrent.TimeUnit; | ||
| 21 | */ | 24 | */ |
| 22 | public class SystemInfoUtils { | 25 | public class SystemInfoUtils { |
| 23 | 26 | ||
| 27 | + private final static Logger logger = LoggerFactory.getLogger(SystemInfoUtils.class); | ||
| 28 | + | ||
| 24 | /** | 29 | /** |
| 25 | * 获取cpu信息 | 30 | * 获取cpu信息 |
| 26 | * @return | 31 | * @return |
| @@ -73,7 +78,7 @@ public class SystemInfoUtils { | @@ -73,7 +78,7 @@ public class SystemInfoUtils { | ||
| 73 | try { | 78 | try { |
| 74 | Thread.sleep(1000); | 79 | Thread.sleep(1000); |
| 75 | } catch (InterruptedException e) { | 80 | } catch (InterruptedException e) { |
| 76 | - throw new RuntimeException(e); | 81 | + logger.error("[线程休眠失败] : {}", e.getMessage()); |
| 77 | } | 82 | } |
| 78 | List<NetworkIF> afterNetworkIFs = hal.getNetworkIFs(); | 83 | List<NetworkIF> afterNetworkIFs = hal.getNetworkIFs(); |
| 79 | NetworkIF afterNet = afterNetworkIFs.get(afterNetworkIFs.size() - 1); | 84 | NetworkIF afterNet = afterNetworkIFs.get(afterNetworkIFs.size() - 1); |
src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java
| @@ -2,11 +2,13 @@ package com.genersoft.iot.vmp.utils.redis; | @@ -2,11 +2,13 @@ package com.genersoft.iot.vmp.utils.redis; | ||
| 2 | 2 | ||
| 3 | import java.nio.charset.Charset; | 3 | import java.nio.charset.Charset; |
| 4 | 4 | ||
| 5 | +import com.alibaba.fastjson2.JSONReader; | ||
| 6 | +import com.alibaba.fastjson2.JSONWriter; | ||
| 5 | import org.springframework.data.redis.serializer.RedisSerializer; | 7 | import org.springframework.data.redis.serializer.RedisSerializer; |
| 6 | import org.springframework.data.redis.serializer.SerializationException; | 8 | import org.springframework.data.redis.serializer.SerializationException; |
| 7 | 9 | ||
| 8 | -import com.alibaba.fastjson.JSON; | ||
| 9 | -import com.alibaba.fastjson.serializer.SerializerFeature; | 10 | +import com.alibaba.fastjson2.JSON; |
| 11 | +import com.alibaba.fastjson2.JSONWriter.Feature; | ||
| 10 | 12 | ||
| 11 | /** | 13 | /** |
| 12 | * @description:使用fastjson实现redis的序列化 | 14 | * @description:使用fastjson实现redis的序列化 |
| @@ -29,7 +31,7 @@ public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { | @@ -29,7 +31,7 @@ public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { | ||
| 29 | if (t == null) { | 31 | if (t == null) { |
| 30 | return new byte[0]; | 32 | return new byte[0]; |
| 31 | } | 33 | } |
| 32 | - return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); | 34 | + return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET); |
| 33 | } | 35 | } |
| 34 | 36 | ||
| 35 | @Override | 37 | @Override |
| @@ -38,6 +40,6 @@ public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { | @@ -38,6 +40,6 @@ public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { | ||
| 38 | return null; | 40 | return null; |
| 39 | } | 41 | } |
| 40 | String str = new String(bytes, DEFAULT_CHARSET); | 42 | String str = new String(bytes, DEFAULT_CHARSET); |
| 41 | - return (T) JSON.parseObject(str, clazz); | 43 | + return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType); |
| 42 | } | 44 | } |
| 43 | } | 45 | } |
src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
| @@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.utils.redis; | @@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.utils.redis; | ||
| 3 | import java.util.*; | 3 | import java.util.*; |
| 4 | import java.util.concurrent.TimeUnit; | 4 | import java.util.concurrent.TimeUnit; |
| 5 | 5 | ||
| 6 | -import com.alibaba.fastjson.JSONObject; | 6 | +import com.alibaba.fastjson2.JSONObject; |
| 7 | import com.genersoft.iot.vmp.utils.SpringBeanFactory; | 7 | import com.genersoft.iot.vmp.utils.SpringBeanFactory; |
| 8 | import gov.nist.javax.sip.stack.UDPMessageChannel; | 8 | import gov.nist.javax.sip.stack.UDPMessageChannel; |
| 9 | import org.springframework.data.redis.core.*; | 9 | import org.springframework.data.redis.core.*; |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceConfig.java
| @@ -7,7 +7,7 @@ | @@ -7,7 +7,7 @@ | ||
| 7 | 7 | ||
| 8 | package com.genersoft.iot.vmp.vmanager.gb28181.device; | 8 | package com.genersoft.iot.vmp.vmanager.gb28181.device; |
| 9 | 9 | ||
| 10 | -import com.alibaba.fastjson.JSONObject; | 10 | +import com.alibaba.fastjson2.JSONObject; |
| 11 | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 11 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 12 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 12 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 13 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | 13 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceControl.java
| @@ -7,7 +7,7 @@ | @@ -7,7 +7,7 @@ | ||
| 7 | 7 | ||
| 8 | package com.genersoft.iot.vmp.vmanager.gb28181.device; | 8 | package com.genersoft.iot.vmp.vmanager.gb28181.device; |
| 9 | 9 | ||
| 10 | -import com.alibaba.fastjson.JSONObject; | 10 | +import com.alibaba.fastjson2.JSONObject; |
| 11 | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 11 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 12 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 12 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 13 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; | 13 | import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
| 1 | package com.genersoft.iot.vmp.vmanager.gb28181.device; | 1 | package com.genersoft.iot.vmp.vmanager.gb28181.device; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.conf.DynamicTask; | 4 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 5 | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 5 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 6 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/platform/PlatformController.java
| 1 | package com.genersoft.iot.vmp.vmanager.gb28181.platform; | 1 | package com.genersoft.iot.vmp.vmanager.gb28181.platform; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.common.VideoManagerConstants; | 5 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 6 | import com.genersoft.iot.vmp.conf.DynamicTask; | 6 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 7 | import com.genersoft.iot.vmp.conf.UserSetting; | 7 | import com.genersoft.iot.vmp.conf.UserSetting; |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
| 1 | package com.genersoft.iot.vmp.vmanager.gb28181.play; | 1 | package com.genersoft.iot.vmp.vmanager.gb28181.play; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONArray; | 3 | +import com.alibaba.fastjson2.JSONArray; |
| 4 | import com.genersoft.iot.vmp.common.StreamInfo; | 4 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 5 | import com.genersoft.iot.vmp.conf.UserSetting; | 5 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 6 | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 6 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| @@ -33,7 +33,7 @@ import org.springframework.web.bind.annotation.PostMapping; | @@ -33,7 +33,7 @@ import org.springframework.web.bind.annotation.PostMapping; | ||
| 33 | import org.springframework.web.bind.annotation.RequestMapping; | 33 | import org.springframework.web.bind.annotation.RequestMapping; |
| 34 | import org.springframework.web.bind.annotation.RestController; | 34 | import org.springframework.web.bind.annotation.RestController; |
| 35 | 35 | ||
| 36 | -import com.alibaba.fastjson.JSONObject; | 36 | +import com.alibaba.fastjson2.JSONObject; |
| 37 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | 37 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
| 38 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; | 38 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| 39 | import org.springframework.web.context.request.async.DeferredResult; | 39 | import org.springframework.web.context.request.async.DeferredResult; |
src/main/java/com/genersoft/iot/vmp/vmanager/record/RecordController.java
| 1 | //package com.genersoft.iot.vmp.vmanager.record; | 1 | //package com.genersoft.iot.vmp.vmanager.record; |
| 2 | // | 2 | // |
| 3 | -//import com.alibaba.fastjson.JSONObject; | 3 | +//import com.alibaba.fastjson2.JSONObject; |
| 4 | //import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | 4 | //import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; |
| 5 | //import com.genersoft.iot.vmp.service.IRecordInfoServer; | 5 | //import com.genersoft.iot.vmp.service.IRecordInfoServer; |
| 6 | //import com.genersoft.iot.vmp.storager.dao.dto.RecordInfo; | 6 | //import com.genersoft.iot.vmp.storager.dao.dto.RecordInfo; |
src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java
| 1 | package com.genersoft.iot.vmp.vmanager.server; | 1 | package com.genersoft.iot.vmp.vmanager.server; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSON; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSON; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.VManageBootstrap; | 5 | import com.genersoft.iot.vmp.VManageBootstrap; |
| 6 | import com.genersoft.iot.vmp.common.SystemAllInfo; | 6 | import com.genersoft.iot.vmp.common.SystemAllInfo; |
| 7 | import com.genersoft.iot.vmp.common.VersionPo; | 7 | import com.genersoft.iot.vmp.common.VersionPo; |
src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
| 1 | package com.genersoft.iot.vmp.vmanager.streamProxy; | 1 | package com.genersoft.iot.vmp.vmanager.streamProxy; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.common.StreamInfo; | 4 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 5 | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 5 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 6 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 6 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiControlController.java
| 1 | package com.genersoft.iot.vmp.web.gb28181; | 1 | package com.genersoft.iot.vmp.web.gb28181; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 4 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 6 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | 6 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; |
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiController.java
| 1 | package com.genersoft.iot.vmp.web.gb28181; | 1 | package com.genersoft.iot.vmp.web.gb28181; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.conf.SipConfig; | 4 | import com.genersoft.iot.vmp.conf.SipConfig; |
| 5 | import org.slf4j.Logger; | 5 | import org.slf4j.Logger; |
| 6 | import org.slf4j.LoggerFactory; | 6 | import org.slf4j.LoggerFactory; |
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiDeviceController.java
| 1 | package com.genersoft.iot.vmp.web.gb28181; | 1 | package com.genersoft.iot.vmp.web.gb28181; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONArray; | ||
| 4 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONArray; |
| 4 | +import com.alibaba.fastjson2.JSONObject; | ||
| 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; | 5 | import com.genersoft.iot.vmp.gb28181.bean.Device; |
| 6 | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | 6 | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
| 7 | import com.genersoft.iot.vmp.service.IDeviceService; | 7 | import com.genersoft.iot.vmp.service.IDeviceService; |
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
| 1 | package com.genersoft.iot.vmp.web.gb28181; | 1 | package com.genersoft.iot.vmp.web.gb28181; |
| 2 | 2 | ||
| 3 | -import com.alibaba.fastjson.JSONObject; | 3 | +import com.alibaba.fastjson2.JSONObject; |
| 4 | import com.genersoft.iot.vmp.common.StreamInfo; | 4 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 5 | import com.genersoft.iot.vmp.conf.UserSetting; | 5 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 6 | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; | 6 | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
src/main/resources/all-application.yml
| @@ -192,6 +192,8 @@ user-settings: | @@ -192,6 +192,8 @@ user-settings: | ||
| 192 | use-source-ip-as-stream-ip: true | 192 | use-source-ip-as-stream-ip: true |
| 193 | # 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放 | 193 | # 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放 |
| 194 | stream-on-demand: true | 194 | stream-on-demand: true |
| 195 | + # 推流鉴权, 默认开启 | ||
| 196 | + push-authority: true | ||
| 195 | 197 | ||
| 196 | # 关闭在线文档(生产环境建议关闭) | 198 | # 关闭在线文档(生产环境建议关闭) |
| 197 | springdoc: | 199 | springdoc: |
web_src/src/components/console/ConsoleResource.vue
| 1 | <template > | 1 | <template > |
| 2 | <div id="consoleResource" style="width: 100%; height: 100%; background: #FFFFFF; text-align: center"> | 2 | <div id="consoleResource" style="width: 100%; height: 100%; background: #FFFFFF; text-align: center"> |
| 3 | <div style="width: 50%;height: 50%; float:left; "> | 3 | <div style="width: 50%;height: 50%; float:left; "> |
| 4 | - <el-progress :width="100" :stroke-width="8" type="circle" :percentage="deviceInfo.online/deviceInfo.total*100" style="margin-top: 20px; font-size: 18px"></el-progress> | 4 | + <el-progress :width="100" :stroke-width="8" type="circle" :percentage="Math.floor(deviceInfo.online/deviceInfo.total*100)" style="margin-top: 20px; font-size: 18px"></el-progress> |
| 5 | <div class="resourceInfo"> | 5 | <div class="resourceInfo"> |
| 6 | 设备总数:{{deviceInfo.total}}<br/> | 6 | 设备总数:{{deviceInfo.total}}<br/> |
| 7 | 在线数:{{deviceInfo.online}} | 7 | 在线数:{{deviceInfo.online}} |
| 8 | </div> | 8 | </div> |
| 9 | </div> | 9 | </div> |
| 10 | <div style="width: 50%;height: 50%; float:left; "> | 10 | <div style="width: 50%;height: 50%; float:left; "> |
| 11 | - <el-progress :width="100" :stroke-width="10" type="circle" :percentage="channelInfo.online/channelInfo.total*100" style="margin-top: 20px"></el-progress> | 11 | + <el-progress :width="100" :stroke-width="10" type="circle" :percentage="Math.floor(channelInfo.online/channelInfo.total*100)" style="margin-top: 20px"></el-progress> |
| 12 | <div class="resourceInfo"> | 12 | <div class="resourceInfo"> |
| 13 | 通道总数:{{channelInfo.total}}<br/> | 13 | 通道总数:{{channelInfo.total}}<br/> |
| 14 | 在线数:{{channelInfo.online}} | 14 | 在线数:{{channelInfo.online}} |
| 15 | </div> | 15 | </div> |
| 16 | </div> | 16 | </div> |
| 17 | <div style="width: 50%;height: 50%; float:left; "> | 17 | <div style="width: 50%;height: 50%; float:left; "> |
| 18 | - <el-progress :width="100" :stroke-width="10" type="circle" :percentage="pushInfo.online/pushInfo.total*100" style="margin-top: 20px"></el-progress> | 18 | + <el-progress :width="100" :stroke-width="10" type="circle" :percentage="Math.floor(pushInfo.online/pushInfo.total*100)" style="margin-top: 20px"></el-progress> |
| 19 | <div class="resourceInfo"> | 19 | <div class="resourceInfo"> |
| 20 | 推流总数:{{pushInfo.total}}<br/> | 20 | 推流总数:{{pushInfo.total}}<br/> |
| 21 | 在线数:{{pushInfo.online}} | 21 | 在线数:{{pushInfo.online}} |
| 22 | </div> | 22 | </div> |
| 23 | </div> | 23 | </div> |
| 24 | <div style="width: 50%;height: 50%; float:left; "> | 24 | <div style="width: 50%;height: 50%; float:left; "> |
| 25 | - <el-progress :width="100" :stroke-width="10" type="circle" :percentage="proxyInfo.online/proxyInfo.total*100" style="margin-top: 20px"></el-progress> | 25 | + <el-progress :width="100" :stroke-width="10" type="circle" :percentage="Math.floor(proxyInfo.online/proxyInfo.total*100)" style="margin-top: 20px"></el-progress> |
| 26 | <div class="resourceInfo"> | 26 | <div class="resourceInfo"> |
| 27 | 拉流代理总数:{{proxyInfo.total}}<br/> | 27 | 拉流代理总数:{{proxyInfo.total}}<br/> |
| 28 | 在线数:{{proxyInfo.online}} | 28 | 在线数:{{proxyInfo.online}} |
web_src/src/components/dialog/devicePlayer.vue
| @@ -121,6 +121,10 @@ | @@ -121,6 +121,10 @@ | ||
| 121 | <el-tag >RTC:</el-tag> | 121 | <el-tag >RTC:</el-tag> |
| 122 | <span>{{ streamInfo.rtc.url }}</span> | 122 | <span>{{ streamInfo.rtc.url }}</span> |
| 123 | </el-dropdown-item> | 123 | </el-dropdown-item> |
| 124 | + <el-dropdown-item :command="streamInfo.rtcs.url"> | ||
| 125 | + <el-tag >RTCS:</el-tag> | ||
| 126 | + <span>{{ streamInfo.rtcs }}</span> | ||
| 127 | + </el-dropdown-item> | ||
| 124 | <el-dropdown-item :command="streamInfo.rtmp.url"> | 128 | <el-dropdown-item :command="streamInfo.rtmp.url"> |
| 125 | <el-tag >RTMP:</el-tag> | 129 | <el-tag >RTMP:</el-tag> |
| 126 | <span>{{ streamInfo.rtmp.url }}</span> | 130 | <span>{{ streamInfo.rtmp.url }}</span> |
| @@ -322,7 +326,7 @@ export default { | @@ -322,7 +326,7 @@ export default { | ||
| 322 | player: { | 326 | player: { |
| 323 | jessibuca : ["ws_flv", "wss_flv"], | 327 | jessibuca : ["ws_flv", "wss_flv"], |
| 324 | livePlayer : ["ws_flv", "wss_flv"], | 328 | livePlayer : ["ws_flv", "wss_flv"], |
| 325 | - webRTC: ["rtc", "rtc"], | 329 | + webRTC: ["rtc", "rtcs"], |
| 326 | }, | 330 | }, |
| 327 | videoHistory: { | 331 | videoHistory: { |
| 328 | date: '', | 332 | date: '', |
| @@ -393,7 +397,7 @@ export default { | @@ -393,7 +397,7 @@ export default { | ||
| 393 | changePlayer: function (tab) { | 397 | changePlayer: function (tab) { |
| 394 | console.log(this.player[tab.name][0]) | 398 | console.log(this.player[tab.name][0]) |
| 395 | this.activePlayer = tab.name; | 399 | this.activePlayer = tab.name; |
| 396 | - this.videoUrl = this.streamInfo[this.player[tab.name][0]].url | 400 | + this.videoUrl = this.getUrlByStreamInfo() |
| 397 | console.log(this.videoUrl) | 401 | console.log(this.videoUrl) |
| 398 | }, | 402 | }, |
| 399 | openDialog: function (tab, deviceId, channelId, param) { | 403 | openDialog: function (tab, deviceId, channelId, param) { |
web_src/src/components/dialog/rtcPlayer.vue
| @@ -51,7 +51,7 @@ export default { | @@ -51,7 +51,7 @@ export default { | ||
| 51 | }); | 51 | }); |
| 52 | 52 | ||
| 53 | webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,(e)=>{//获取到了远端流,可以播放 | 53 | webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,(e)=>{//获取到了远端流,可以播放 |
| 54 | - console.error('播放成功',e.streams) | 54 | + console.log('播放成功',e.streams) |
| 55 | this.eventcallbacK("playing", "播放成功") | 55 | this.eventcallbacK("playing", "播放成功") |
| 56 | }); | 56 | }); |
| 57 | 57 | ||
| @@ -59,7 +59,7 @@ export default { | @@ -59,7 +59,7 @@ export default { | ||
| 59 | console.error('offer anwser 交换失败',e) | 59 | console.error('offer anwser 交换失败',e) |
| 60 | this.eventcallbacK("OFFER ANSWER ERROR ", "offer anwser 交换失败") | 60 | this.eventcallbacK("OFFER ANSWER ERROR ", "offer anwser 交换失败") |
| 61 | if (e.code ==-400 && e.msg=="流不存在"){ | 61 | if (e.code ==-400 && e.msg=="流不存在"){ |
| 62 | - console.log("111111") | 62 | + console.log("流不存在") |
| 63 | this.timer = setTimeout(()=>{ | 63 | this.timer = setTimeout(()=>{ |
| 64 | this.webrtcPlayer.close(); | 64 | this.webrtcPlayer.close(); |
| 65 | this.play(url) | 65 | this.play(url) |
web_src/src/components/live.vue
| @@ -138,8 +138,14 @@ export default { | @@ -138,8 +138,14 @@ export default { | ||
| 138 | url: '/api/play/start/' + deviceId + '/' + channelId | 138 | url: '/api/play/start/' + deviceId + '/' + channelId |
| 139 | }).then(function (res) { | 139 | }).then(function (res) { |
| 140 | if (res.data.code === 0 && res.data.data) { | 140 | if (res.data.code === 0 && res.data.data) { |
| 141 | - itemData.playUrl = res.data.data.https_flv.url | ||
| 142 | - that.setPlayUrl(res.data.data.ws_flv.url, idxTmp) | 141 | + let videoUrl; |
| 142 | + if (location.protocol === "https:") { | ||
| 143 | + videoUrl = res.data.data.wss_flv.url; | ||
| 144 | + } else { | ||
| 145 | + videoUrl = res.data.data.ws_flv.url; | ||
| 146 | + } | ||
| 147 | + itemData.playUrl = videoUrl; | ||
| 148 | + that.setPlayUrl(videoUrl, idxTmp); | ||
| 143 | } else { | 149 | } else { |
| 144 | that.$message.error(res.data.msg); | 150 | that.$message.error(res.data.msg); |
| 145 | } | 151 | } |