Commit 5b3dc4d5957050c2ce3e3c0013337168d8c9f700

Authored by 648540858
1 parent 250a059c

优化点播结束后关闭RTPServer

src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
... ... @@ -99,6 +99,12 @@ public class VideoManagerConstants {
99 99 */
100 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 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 12 import org.springframework.data.redis.core.RedisTemplate;
13 13 import org.springframework.data.redis.listener.PatternTopic;
14 14 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
15   -import org.springframework.data.redis.serializer.RedisSerializer;
16 15 import org.springframework.data.redis.serializer.StringRedisSerializer;
17 16  
18 17 import com.genersoft.iot.vmp.utils.redis.FastJsonRedisSerializer;
... ... @@ -43,7 +42,10 @@ public class RedisConfig extends CachingConfigurerSupport {
43 42 private RedisPushStreamStatusMsgListener redisPushStreamStatusMsgListener;
44 43  
45 44 @Autowired
46   - private RedisPushStreamListMsgListener redisPushStreamListMsgListener;
  45 + private RedisPushStreamStatusListMsgListener redisPushStreamListMsgListener;
  46 +
  47 + @Autowired
  48 + private RedisPushStreamResponseListener redisPushStreamResponseListener;
47 49  
48 50 @Bean
49 51 public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
... ... @@ -81,7 +83,7 @@ public class RedisConfig extends CachingConfigurerSupport {
81 83 container.addMessageListener(redisGbPlayMsgListener, new PatternTopic(RedisGbPlayMsgListener.WVP_PUSH_STREAM_KEY));
82 84 container.addMessageListener(redisPushStreamStatusMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_PUSH_STREAM_STATUS_CHANGE));
83 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 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 694 dialog = streamSession.getDialogByStream(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
695 695 }
696 696 mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc());
697   - mediaServerService.closeRTPServer(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
  697 + mediaServerService.closeRTPServer(ssrcTransaction.getMediaServerId(), ssrcTransaction.getStream());
698 698 streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
699 699  
700 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 121 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId);
122 122 if (streamInfo != null) {
123 123 redisCatchStorage.stopPlay(streamInfo);
124   - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, streamInfo.getStream());
  124 + mediaServerService.closeRTPServer(streamInfo.getMediaServerId(), streamInfo.getStream());
125 125 }
126 126 SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null);
127 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 24 import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
25 25 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
26 26 import com.genersoft.iot.vmp.service.impl.RedisGbPlayMsgListener;
  27 +import com.genersoft.iot.vmp.service.impl.RedisPushStreamResponseListener;
27 28 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
28 29 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
29 30 import com.genersoft.iot.vmp.utils.DateUtil;
... ... @@ -74,7 +75,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
74 75 private DynamicTask dynamicTask;
75 76  
76 77 @Autowired
77   - private SIPCommander cmder;
  78 + private RedisPushStreamResponseListener redisPushStreamResponseListener;
78 79  
79 80 @Autowired
80 81 private IPlayService playService;
... ... @@ -556,7 +557,6 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
556 557 otherWvpPushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
557 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 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 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 86 if (catalogs.size() > 0) {
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
... ... @@ -139,6 +139,7 @@ public class ZLMRTPServerFactory {
139 139 param.put("stream_id", streamId);
140 140 JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(serverItem, param);
141 141 if (jsonObject != null ) {
  142 + System.out.println(jsonObject);
142 143 if (jsonObject.getInteger("code") == 0) {
143 144 result = jsonObject.getInteger("hit") == 1;
144 145 }else {
... ...
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
... ... @@ -50,7 +50,9 @@ public interface IMediaServerService {
50 50  
51 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 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 48 */
49 49 private String mediaServerId;
50 50  
  51 +
  52 +
51 53 public static MessageForPushChannel getInstance(int type, String app, String stream, String gbId,
52 54 String platFormId, String platFormName, String serverId,
53 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 145 if (ssrcTransactions != null && ssrcTransactions.size() > 0) {
146 146 for (SsrcTransaction ssrcTransaction : ssrcTransactions) {
147 147 mediaServerService.releaseSsrc(ssrcTransaction.getMediaServerId(), ssrcTransaction.getSsrc());
148   - mediaServerService.closeRTPServer(deviceId, ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
  148 + mediaServerService.closeRTPServer(ssrcTransaction.getMediaServerId(), ssrcTransaction.getStream());
149 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 164 }
165 165  
166 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 181 @Override
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
... ... @@ -270,7 +270,7 @@ public class PlayServiceImpl implements IPlayService {
270 270 logger.info("[点播超时] 消息未响应 deviceId: {}, channelId: {}", device.getDeviceId(), channelId);
271 271 timeoutCallback.run(0, "点播超时");
272 272 mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
273   - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
  273 + mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
274 274 streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
275 275 }
276 276 }, userSetting.getPlayTimeout());
... ... @@ -333,7 +333,7 @@ public class PlayServiceImpl implements IPlayService {
333 333 });
334 334 }
335 335 // 关闭rtp server
336   - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
  336 + mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
337 337 // 重新开启ssrc server
338 338 mediaServerService.openRTPServer(mediaServerItem, finalSsrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, finalSsrcInfo.getPort());
339 339  
... ... @@ -341,7 +341,7 @@ public class PlayServiceImpl implements IPlayService {
341 341 }
342 342 }, (event) -> {
343 343 dynamicTask.stop(timeOutTaskKey);
344   - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
  344 + mediaServerService.closeRTPServer(mediaServerItem, finalSsrcInfo.getStream());
345 345 // 释放ssrc
346 346 mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
347 347  
... ... @@ -445,7 +445,7 @@ public class PlayServiceImpl implements IPlayService {
445 445 cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
446 446 }else {
447 447 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
448   - mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
  448 + mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
449 449 streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
450 450 }
451 451 cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
... ... @@ -533,7 +533,7 @@ public class PlayServiceImpl implements IPlayService {
533 533 });
534 534 }
535 535 // 关闭rtp server
536   - mediaServerService.closeRTPServer(device.getDeviceId(), channelId, ssrcInfo.getStream());
  536 + mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
537 537 // 重新开启ssrc server
538 538 mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort());
539 539 }
... ... @@ -593,7 +593,7 @@ public class PlayServiceImpl implements IPlayService {
593 593 cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
594 594 }else {
595 595 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
596   - mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
  596 + mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
597 597 streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
598 598 }
599 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 9 import com.genersoft.iot.vmp.utils.DateUtil;
10 10 import org.slf4j.Logger;
11 11 import org.slf4j.LoggerFactory;
12   -import org.springframework.beans.factory.annotation.Autowired;
13 12 import org.springframework.data.redis.connection.Message;
14 13 import org.springframework.data.redis.connection.MessageListener;
15 14 import org.springframework.stereotype.Component;
... ... @@ -23,9 +22,9 @@ import java.util.*;
23 22 * @Description: 接收redis发送的推流设备列表更新通知
24 23 */
25 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 28 @Resource
30 29 private IMediaServerService mediaServerService;
31 30  
... ...