Commit 5b3dc4d5957050c2ce3e3c0013337168d8c9f700
1 parent
250a059c
优化点播结束后关闭RTPServer
Showing
15 changed files
with
193 additions
and
29 deletions
src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
| @@ -99,6 +99,12 @@ public class VideoManagerConstants { | @@ -99,6 +99,12 @@ public class VideoManagerConstants { | ||
| 99 | */ | 99 | */ |
| 100 | public static final String VM_MSG_STREAM_PUSH_REQUESTED = "VM_MSG_STREAM_PUSH_REQUESTED"; | 100 | public static final String VM_MSG_STREAM_PUSH_REQUESTED = "VM_MSG_STREAM_PUSH_REQUESTED"; |
| 101 | 101 | ||
| 102 | + | ||
| 103 | + /** | ||
| 104 | + * redis 消息通知平台通知设备推流结果 | ||
| 105 | + */ | ||
| 106 | + public static final String VM_MSG_STREAM_PUSH_RESPONSE = "VM_MSG_STREAM_PUSH_RESPONSE"; | ||
| 107 | + | ||
| 102 | /** | 108 | /** |
| 103 | * redis 消息请求所有的在线通道 | 109 | * redis 消息请求所有的在线通道 |
| 104 | */ | 110 | */ |
src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java
| @@ -12,7 +12,6 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; | @@ -12,7 +12,6 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; | ||
| 12 | import org.springframework.data.redis.core.RedisTemplate; | 12 | import org.springframework.data.redis.core.RedisTemplate; |
| 13 | import org.springframework.data.redis.listener.PatternTopic; | 13 | import org.springframework.data.redis.listener.PatternTopic; |
| 14 | import org.springframework.data.redis.listener.RedisMessageListenerContainer; | 14 | import org.springframework.data.redis.listener.RedisMessageListenerContainer; |
| 15 | -import org.springframework.data.redis.serializer.RedisSerializer; | ||
| 16 | import org.springframework.data.redis.serializer.StringRedisSerializer; | 15 | import org.springframework.data.redis.serializer.StringRedisSerializer; |
| 17 | 16 | ||
| 18 | import com.genersoft.iot.vmp.utils.redis.FastJsonRedisSerializer; | 17 | import com.genersoft.iot.vmp.utils.redis.FastJsonRedisSerializer; |
| @@ -43,7 +42,10 @@ public class RedisConfig extends CachingConfigurerSupport { | @@ -43,7 +42,10 @@ public class RedisConfig extends CachingConfigurerSupport { | ||
| 43 | private RedisPushStreamStatusMsgListener redisPushStreamStatusMsgListener; | 42 | private RedisPushStreamStatusMsgListener redisPushStreamStatusMsgListener; |
| 44 | 43 | ||
| 45 | @Autowired | 44 | @Autowired |
| 46 | - private RedisPushStreamListMsgListener redisPushStreamListMsgListener; | 45 | + private RedisPushStreamStatusListMsgListener redisPushStreamListMsgListener; |
| 46 | + | ||
| 47 | + @Autowired | ||
| 48 | + private RedisPushStreamResponseListener redisPushStreamResponseListener; | ||
| 47 | 49 | ||
| 48 | @Bean | 50 | @Bean |
| 49 | public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { | 51 | public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { |
| @@ -81,7 +83,7 @@ public class RedisConfig extends CachingConfigurerSupport { | @@ -81,7 +83,7 @@ public class RedisConfig extends CachingConfigurerSupport { | ||
| 81 | container.addMessageListener(redisGbPlayMsgListener, new PatternTopic(RedisGbPlayMsgListener.WVP_PUSH_STREAM_KEY)); | 83 | container.addMessageListener(redisGbPlayMsgListener, new PatternTopic(RedisGbPlayMsgListener.WVP_PUSH_STREAM_KEY)); |
| 82 | container.addMessageListener(redisPushStreamStatusMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_PUSH_STREAM_STATUS_CHANGE)); | 84 | container.addMessageListener(redisPushStreamStatusMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_PUSH_STREAM_STATUS_CHANGE)); |
| 83 | container.addMessageListener(redisPushStreamListMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_PUSH_STREAM_LIST_CHANGE)); | 85 | container.addMessageListener(redisPushStreamListMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_PUSH_STREAM_LIST_CHANGE)); |
| 86 | + container.addMessageListener(redisPushStreamResponseListener, new PatternTopic(VideoManagerConstants.VM_MSG_STREAM_PUSH_RESPONSE)); | ||
| 84 | return container; | 87 | return container; |
| 85 | } | 88 | } |
| 86 | - | ||
| 87 | } | 89 | } |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| @@ -694,7 +694,7 @@ public class SIPCommander implements ISIPCommander { | @@ -694,7 +694,7 @@ public class SIPCommander implements ISIPCommander { | ||
| 694 | dialog = streamSession.getDialogByStream(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); | 694 | dialog = streamSession.getDialogByStream(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); |
| 695 | } | 695 | } |
| 696 | mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc()); | 696 | mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc()); |
| 697 | - mediaServerService.closeRTPServer(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); | 697 | + mediaServerService.closeRTPServer(ssrcTransaction.getMediaServerId(), ssrcTransaction.getStream()); |
| 698 | streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); | 698 | streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); |
| 699 | 699 | ||
| 700 | if (dialog == null) { | 700 | if (dialog == null) { |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
| @@ -121,7 +121,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In | @@ -121,7 +121,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In | ||
| 121 | StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId); | 121 | StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId); |
| 122 | if (streamInfo != null) { | 122 | if (streamInfo != null) { |
| 123 | redisCatchStorage.stopPlay(streamInfo); | 123 | redisCatchStorage.stopPlay(streamInfo); |
| 124 | - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, streamInfo.getStream()); | 124 | + mediaServerService.closeRTPServer(streamInfo.getMediaServerId(), streamInfo.getStream()); |
| 125 | } | 125 | } |
| 126 | SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null); | 126 | SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null); |
| 127 | if (ssrcTransactionForPlay != null){ | 127 | if (ssrcTransactionForPlay != null){ |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| @@ -24,6 +24,7 @@ import com.genersoft.iot.vmp.service.IStreamPushService; | @@ -24,6 +24,7 @@ import com.genersoft.iot.vmp.service.IStreamPushService; | ||
| 24 | import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; | 24 | import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; |
| 25 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; | 25 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| 26 | import com.genersoft.iot.vmp.service.impl.RedisGbPlayMsgListener; | 26 | import com.genersoft.iot.vmp.service.impl.RedisGbPlayMsgListener; |
| 27 | +import com.genersoft.iot.vmp.service.impl.RedisPushStreamResponseListener; | ||
| 27 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 28 | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| 28 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; | 29 | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; |
| 29 | import com.genersoft.iot.vmp.utils.DateUtil; | 30 | import com.genersoft.iot.vmp.utils.DateUtil; |
| @@ -74,7 +75,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -74,7 +75,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 74 | private DynamicTask dynamicTask; | 75 | private DynamicTask dynamicTask; |
| 75 | 76 | ||
| 76 | @Autowired | 77 | @Autowired |
| 77 | - private SIPCommander cmder; | 78 | + private RedisPushStreamResponseListener redisPushStreamResponseListener; |
| 78 | 79 | ||
| 79 | @Autowired | 80 | @Autowired |
| 80 | private IPlayService playService; | 81 | private IPlayService playService; |
| @@ -556,7 +557,6 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -556,7 +557,6 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 556 | otherWvpPushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, | 557 | otherWvpPushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, |
| 557 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | 558 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); |
| 558 | } | 559 | } |
| 559 | - | ||
| 560 | } | 560 | } |
| 561 | /** | 561 | /** |
| 562 | * 通知流上线 | 562 | * 通知流上线 |
| @@ -639,6 +639,23 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -639,6 +639,23 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 639 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | 639 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); |
| 640 | } | 640 | } |
| 641 | }); | 641 | }); |
| 642 | + | ||
| 643 | + // 添加回复的拒绝或者错误的通知 | ||
| 644 | + redisPushStreamResponseListener.addEvent(gbStream.getApp(), gbStream.getStream(), response -> { | ||
| 645 | + if (response.getCode() != 0) { | ||
| 646 | + dynamicTask.stop(callIdHeader.getCallId()); | ||
| 647 | + mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream()); | ||
| 648 | + try { | ||
| 649 | + responseAck(evt, Response.TEMPORARILY_UNAVAILABLE, response.getMsg()); | ||
| 650 | + } catch (SipException e) { | ||
| 651 | + throw new RuntimeException(e); | ||
| 652 | + } catch (InvalidArgumentException e) { | ||
| 653 | + throw new RuntimeException(e); | ||
| 654 | + } catch (ParseException e) { | ||
| 655 | + throw new RuntimeException(e); | ||
| 656 | + } | ||
| 657 | + } | ||
| 658 | + }); | ||
| 642 | } | 659 | } |
| 643 | } | 660 | } |
| 644 | 661 |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/CatalogQueryMessageHandler.java
| @@ -79,8 +79,8 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem | @@ -79,8 +79,8 @@ public class CatalogQueryMessageHandler extends SIPRequestProcessorParent implem | ||
| 79 | List<DeviceChannel> allChannels = new ArrayList<>(); | 79 | List<DeviceChannel> allChannels = new ArrayList<>(); |
| 80 | 80 | ||
| 81 | // 回复平台 | 81 | // 回复平台 |
| 82 | - DeviceChannel deviceChannel = getChannelForPlatform(parentPlatform); | ||
| 83 | - allChannels.add(deviceChannel); | 82 | +// DeviceChannel deviceChannel = getChannelForPlatform(parentPlatform); |
| 83 | +// allChannels.add(deviceChannel); | ||
| 84 | 84 | ||
| 85 | // 回复目录 | 85 | // 回复目录 |
| 86 | if (catalogs.size() > 0) { | 86 | if (catalogs.size() > 0) { |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
| @@ -139,6 +139,7 @@ public class ZLMRTPServerFactory { | @@ -139,6 +139,7 @@ public class ZLMRTPServerFactory { | ||
| 139 | param.put("stream_id", streamId); | 139 | param.put("stream_id", streamId); |
| 140 | JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(serverItem, param); | 140 | JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(serverItem, param); |
| 141 | if (jsonObject != null ) { | 141 | if (jsonObject != null ) { |
| 142 | + System.out.println(jsonObject); | ||
| 142 | if (jsonObject.getInteger("code") == 0) { | 143 | if (jsonObject.getInteger("code") == 0) { |
| 143 | result = jsonObject.getInteger("hit") == 1; | 144 | result = jsonObject.getInteger("hit") == 1; |
| 144 | }else { | 145 | }else { |
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
| @@ -50,7 +50,9 @@ public interface IMediaServerService { | @@ -50,7 +50,9 @@ public interface IMediaServerService { | ||
| 50 | 50 | ||
| 51 | SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback, Integer port); | 51 | SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, String ssrc, boolean ssrcCheck, boolean isPlayback, Integer port); |
| 52 | 52 | ||
| 53 | - void closeRTPServer(String deviceId, String channelId, String ssrc); | 53 | + void closeRTPServer(MediaServerItem mediaServerItem, String streamId); |
| 54 | + | ||
| 55 | + void closeRTPServer(String mediaServerId, String streamId); | ||
| 54 | 56 | ||
| 55 | void clearRTPServer(MediaServerItem mediaServerItem); | 57 | void clearRTPServer(MediaServerItem mediaServerItem); |
| 56 | 58 |
src/main/java/com/genersoft/iot/vmp/service/bean/MessageForPushChannel.java
| @@ -48,6 +48,8 @@ public class MessageForPushChannel { | @@ -48,6 +48,8 @@ public class MessageForPushChannel { | ||
| 48 | */ | 48 | */ |
| 49 | private String mediaServerId; | 49 | private String mediaServerId; |
| 50 | 50 | ||
| 51 | + | ||
| 52 | + | ||
| 51 | public static MessageForPushChannel getInstance(int type, String app, String stream, String gbId, | 53 | public static MessageForPushChannel getInstance(int type, String app, String stream, String gbId, |
| 52 | String platFormId, String platFormName, String serverId, | 54 | String platFormId, String platFormName, String serverId, |
| 53 | String mediaServerId){ | 55 | String mediaServerId){ |
src/main/java/com/genersoft/iot/vmp/service/bean/MessageForPushChannelResponse.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.service.bean; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * 当redis回复推流结果上级平台 | ||
| 5 | + * @author lin | ||
| 6 | + */ | ||
| 7 | +public class MessageForPushChannelResponse { | ||
| 8 | + /** | ||
| 9 | + * 错误玛 | ||
| 10 | + * 0 成功 1 失败 | ||
| 11 | + */ | ||
| 12 | + private int code; | ||
| 13 | + /** | ||
| 14 | + * 错误内容 | ||
| 15 | + */ | ||
| 16 | + private String msg; | ||
| 17 | + | ||
| 18 | + /** | ||
| 19 | + * 流应用名 | ||
| 20 | + */ | ||
| 21 | + private String app; | ||
| 22 | + | ||
| 23 | + /** | ||
| 24 | + * 流Id | ||
| 25 | + */ | ||
| 26 | + private String stream; | ||
| 27 | + | ||
| 28 | + | ||
| 29 | + | ||
| 30 | + public static MessageForPushChannelResponse getInstance(int code, String msg, String app, String stream){ | ||
| 31 | + MessageForPushChannelResponse messageForPushChannel = new MessageForPushChannelResponse(); | ||
| 32 | + messageForPushChannel.setCode(code); | ||
| 33 | + messageForPushChannel.setMsg(msg); | ||
| 34 | + messageForPushChannel.setApp(app); | ||
| 35 | + messageForPushChannel.setStream(stream); | ||
| 36 | + return messageForPushChannel; | ||
| 37 | + } | ||
| 38 | + | ||
| 39 | + | ||
| 40 | + public int getCode() { | ||
| 41 | + return code; | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + public void setCode(int code) { | ||
| 45 | + this.code = code; | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + public String getApp() { | ||
| 49 | + return app; | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + public void setApp(String app) { | ||
| 53 | + this.app = app; | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + public String getStream() { | ||
| 57 | + return stream; | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + public void setStream(String stream) { | ||
| 61 | + this.stream = stream; | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + public String getMsg() { | ||
| 65 | + return msg; | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + public void setMsg(String msg) { | ||
| 69 | + this.msg = msg; | ||
| 70 | + } | ||
| 71 | +} |
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
| @@ -145,7 +145,7 @@ public class DeviceServiceImpl implements IDeviceService { | @@ -145,7 +145,7 @@ public class DeviceServiceImpl implements IDeviceService { | ||
| 145 | if (ssrcTransactions != null && ssrcTransactions.size() > 0) { | 145 | if (ssrcTransactions != null && ssrcTransactions.size() > 0) { |
| 146 | for (SsrcTransaction ssrcTransaction : ssrcTransactions) { | 146 | for (SsrcTransaction ssrcTransaction : ssrcTransactions) { |
| 147 | mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc()); | 147 | mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc()); |
| 148 | - mediaServerService.closeRTPServer(deviceId, ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); | 148 | + mediaServerService.closeRTPServer(ssrcTransaction.getMediaServerId(), ssrcTransaction.getStream()); |
| 149 | streamSession.remove(deviceId, ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); | 149 | streamSession.remove(deviceId, ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); |
| 150 | } | 150 | } |
| 151 | } | 151 | } |
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
| @@ -164,16 +164,18 @@ public class MediaServerServiceImpl implements IMediaServerService { | @@ -164,16 +164,18 @@ public class MediaServerServiceImpl implements IMediaServerService { | ||
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | @Override | 166 | @Override |
| 167 | - public void closeRTPServer(String deviceId, String channelId, String stream) { | ||
| 168 | - String mediaServerId = streamSession.getMediaServerId(deviceId, channelId, stream); | ||
| 169 | - String ssrc = streamSession.getSSRC(deviceId, channelId, stream); | ||
| 170 | - MediaServerItem mediaServerItem = this.getOne(mediaServerId); | ||
| 171 | - if (mediaServerItem != null) { | ||
| 172 | - String streamId = String.format("%s_%s", deviceId, channelId); | ||
| 173 | - zlmrtpServerFactory.closeRTPServer(mediaServerItem, streamId); | ||
| 174 | - releaseSsrc(mediaServerItem.getId(), ssrc); | 167 | + public void closeRTPServer(MediaServerItem mediaServerItem, String streamId) { |
| 168 | + if (mediaServerItem == null) { | ||
| 169 | + return; | ||
| 175 | } | 170 | } |
| 176 | - streamSession.remove(deviceId, channelId, stream); | 171 | + zlmrtpServerFactory.closeRTPServer(mediaServerItem, streamId); |
| 172 | + releaseSsrc(mediaServerItem.getId(), streamId); | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + @Override | ||
| 176 | + public void closeRTPServer(String mediaServerId, String streamId) { | ||
| 177 | + MediaServerItem mediaServerItem = this.getOne(mediaServerId); | ||
| 178 | + closeRTPServer(mediaServerItem, streamId); | ||
| 177 | } | 179 | } |
| 178 | 180 | ||
| 179 | @Override | 181 | @Override |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| @@ -270,7 +270,7 @@ public class PlayServiceImpl implements IPlayService { | @@ -270,7 +270,7 @@ public class PlayServiceImpl implements IPlayService { | ||
| 270 | logger.info("[点播超时] 消息未响应 deviceId: {}, channelId: {}", device.getDeviceId(), channelId); | 270 | logger.info("[点播超时] 消息未响应 deviceId: {}, channelId: {}", device.getDeviceId(), channelId); |
| 271 | timeoutCallback.run(0, "点播超时"); | 271 | timeoutCallback.run(0, "点播超时"); |
| 272 | mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); | 272 | mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); |
| 273 | - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); | 273 | + mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream()); |
| 274 | streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); | 274 | streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); |
| 275 | } | 275 | } |
| 276 | }, userSetting.getPlayTimeout()); | 276 | }, userSetting.getPlayTimeout()); |
| @@ -333,7 +333,7 @@ public class PlayServiceImpl implements IPlayService { | @@ -333,7 +333,7 @@ public class PlayServiceImpl implements IPlayService { | ||
| 333 | }); | 333 | }); |
| 334 | } | 334 | } |
| 335 | // 关闭rtp server | 335 | // 关闭rtp server |
| 336 | - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); | 336 | + mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream()); |
| 337 | // 重新开启ssrc server | 337 | // 重新开启ssrc server |
| 338 | mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort()); | 338 | mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort()); |
| 339 | 339 | ||
| @@ -341,7 +341,7 @@ public class PlayServiceImpl implements IPlayService { | @@ -341,7 +341,7 @@ public class PlayServiceImpl implements IPlayService { | ||
| 341 | } | 341 | } |
| 342 | }, (event) -> { | 342 | }, (event) -> { |
| 343 | dynamicTask.stop(timeOutTaskKey); | 343 | dynamicTask.stop(timeOutTaskKey); |
| 344 | - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream()); | 344 | + mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream()); |
| 345 | // 释放ssrc | 345 | // 释放ssrc |
| 346 | mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); | 346 | mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc()); |
| 347 | 347 | ||
| @@ -445,7 +445,7 @@ public class PlayServiceImpl implements IPlayService { | @@ -445,7 +445,7 @@ public class PlayServiceImpl implements IPlayService { | ||
| 445 | cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); | 445 | cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); |
| 446 | }else { | 446 | }else { |
| 447 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); | 447 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| 448 | - mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream()); | 448 | + mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| 449 | streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); | 449 | streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); |
| 450 | } | 450 | } |
| 451 | cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); | 451 | cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); |
| @@ -533,7 +533,7 @@ public class PlayServiceImpl implements IPlayService { | @@ -533,7 +533,7 @@ public class PlayServiceImpl implements IPlayService { | ||
| 533 | }); | 533 | }); |
| 534 | } | 534 | } |
| 535 | // 关闭rtp server | 535 | // 关闭rtp server |
| 536 | - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, ssrcInfo.getStream()); | 536 | + mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| 537 | // 重新开启ssrc server | 537 | // 重新开启ssrc server |
| 538 | mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort()); | 538 | mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort()); |
| 539 | } | 539 | } |
| @@ -593,7 +593,7 @@ public class PlayServiceImpl implements IPlayService { | @@ -593,7 +593,7 @@ public class PlayServiceImpl implements IPlayService { | ||
| 593 | cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); | 593 | cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); |
| 594 | }else { | 594 | }else { |
| 595 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); | 595 | mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); |
| 596 | - mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream()); | 596 | + mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| 597 | streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); | 597 | streamSession.remove(deviceId, channelId, ssrcInfo.getStream()); |
| 598 | } | 598 | } |
| 599 | cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); | 599 | cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null); |
src/main/java/com/genersoft/iot/vmp/service/impl/RedisPushStreamResponseListener.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.service.impl; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSON; | ||
| 4 | +import com.alibaba.fastjson.JSONObject; | ||
| 5 | +import com.genersoft.iot.vmp.media.zlm.dto.ChannelOnlineEvent; | ||
| 6 | +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | ||
| 7 | +import com.genersoft.iot.vmp.service.IGbStreamService; | ||
| 8 | +import com.genersoft.iot.vmp.service.IMediaServerService; | ||
| 9 | +import com.genersoft.iot.vmp.service.IStreamPushService; | ||
| 10 | +import com.genersoft.iot.vmp.service.bean.MessageForPushChannelResponse; | ||
| 11 | +import com.genersoft.iot.vmp.utils.DateUtil; | ||
| 12 | +import org.slf4j.Logger; | ||
| 13 | +import org.slf4j.LoggerFactory; | ||
| 14 | +import org.springframework.data.redis.connection.Message; | ||
| 15 | +import org.springframework.data.redis.connection.MessageListener; | ||
| 16 | +import org.springframework.stereotype.Component; | ||
| 17 | +import org.springframework.util.ObjectUtils; | ||
| 18 | + | ||
| 19 | +import javax.annotation.Resource; | ||
| 20 | +import java.util.ArrayList; | ||
| 21 | +import java.util.List; | ||
| 22 | +import java.util.Map; | ||
| 23 | +import java.util.concurrent.ConcurrentHashMap; | ||
| 24 | + | ||
| 25 | +/** | ||
| 26 | + * 接收redis返回的推流结果 | ||
| 27 | + * @author lin | ||
| 28 | + */ | ||
| 29 | +@Component | ||
| 30 | +public class RedisPushStreamResponseListener implements MessageListener { | ||
| 31 | + | ||
| 32 | + private final static Logger logger = LoggerFactory.getLogger(RedisPushStreamResponseListener.class); | ||
| 33 | + | ||
| 34 | + private Map<String, PushStreamResponseEvent> responseEvents = new ConcurrentHashMap<>(); | ||
| 35 | + | ||
| 36 | + public interface PushStreamResponseEvent{ | ||
| 37 | + void run(MessageForPushChannelResponse response); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + @Override | ||
| 41 | + public void onMessage(Message message, byte[] bytes) { | ||
| 42 | + // | ||
| 43 | + logger.warn("[REDIS消息-请求推流结果]: {}", new String(message.getBody())); | ||
| 44 | + MessageForPushChannelResponse response = JSON.parseObject(new String(message.getBody()), MessageForPushChannelResponse.class); | ||
| 45 | + if (response == null || ObjectUtils.isEmpty(response.getApp()) || ObjectUtils.isEmpty(response.getStream())){ | ||
| 46 | + logger.info("[REDIS消息-请求推流结果]:参数不全"); | ||
| 47 | + return; | ||
| 48 | + } | ||
| 49 | + // 查看正在等待的invite消息 | ||
| 50 | + if (responseEvents.get(response.getApp() + response.getStream()) != null) { | ||
| 51 | + responseEvents.get(response.getApp() + response.getStream()).run(response); | ||
| 52 | + } | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + public void addEvent(String app, String stream, PushStreamResponseEvent callback) { | ||
| 56 | + responseEvents.put(app + stream, callback); | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + public void removeEvent(String app, String stream) { | ||
| 60 | + responseEvents.remove(app + stream); | ||
| 61 | + } | ||
| 62 | +} |
src/main/java/com/genersoft/iot/vmp/service/impl/RedisPushStreamListMsgListener.java renamed to src/main/java/com/genersoft/iot/vmp/service/impl/RedisPushStreamStatusListMsgListener.java
| @@ -9,7 +9,6 @@ import com.genersoft.iot.vmp.service.IStreamPushService; | @@ -9,7 +9,6 @@ import com.genersoft.iot.vmp.service.IStreamPushService; | ||
| 9 | import com.genersoft.iot.vmp.utils.DateUtil; | 9 | import com.genersoft.iot.vmp.utils.DateUtil; |
| 10 | import org.slf4j.Logger; | 10 | import org.slf4j.Logger; |
| 11 | import org.slf4j.LoggerFactory; | 11 | import org.slf4j.LoggerFactory; |
| 12 | -import org.springframework.beans.factory.annotation.Autowired; | ||
| 13 | import org.springframework.data.redis.connection.Message; | 12 | import org.springframework.data.redis.connection.Message; |
| 14 | import org.springframework.data.redis.connection.MessageListener; | 13 | import org.springframework.data.redis.connection.MessageListener; |
| 15 | import org.springframework.stereotype.Component; | 14 | import org.springframework.stereotype.Component; |
| @@ -23,9 +22,9 @@ import java.util.*; | @@ -23,9 +22,9 @@ import java.util.*; | ||
| 23 | * @Description: 接收redis发送的推流设备列表更新通知 | 22 | * @Description: 接收redis发送的推流设备列表更新通知 |
| 24 | */ | 23 | */ |
| 25 | @Component | 24 | @Component |
| 26 | -public class RedisPushStreamListMsgListener implements MessageListener { | 25 | +public class RedisPushStreamStatusListMsgListener implements MessageListener { |
| 27 | 26 | ||
| 28 | - private final static Logger logger = LoggerFactory.getLogger(RedisPushStreamListMsgListener.class); | 27 | + private final static Logger logger = LoggerFactory.getLogger(RedisPushStreamStatusListMsgListener.class); |
| 29 | @Resource | 28 | @Resource |
| 30 | private IMediaServerService mediaServerService; | 29 | private IMediaServerService mediaServerService; |
| 31 | 30 |