|
|
@@ -15,8 +15,11 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor
|
|
|
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
|
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
|
|
+import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
|
|
|
import com.genersoft.iot.vmp.service.*;
|
|
|
import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
|
|
|
+import com.genersoft.iot.vmp.service.bean.RequestStopPushStreamMsg;
|
|
|
+import com.genersoft.iot.vmp.service.redisMsg.RedisGbPlayMsgListener;
|
|
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
|
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
|
|
|
import gov.nist.javax.sip.message.SIPRequest;
|
|
|
@@ -92,6 +95,12 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
|
|
|
@Autowired
|
|
|
private UserSetting userSetting;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IStreamPushService pushService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisGbPlayMsgListener redisGbPlayMsgListener;
|
|
|
+
|
|
|
@Override
|
|
|
public void afterPropertiesSet() throws Exception {
|
|
|
// 添加消息处理的订阅
|
|
|
@@ -124,58 +133,81 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
|
|
|
param.put("stream",streamId);
|
|
|
param.put("ssrc",sendRtpItem.getSsrc());
|
|
|
logger.info("[收到bye] 停止推流:{}, 媒体节点: {}", streamId, sendRtpItem.getMediaServerId());
|
|
|
- MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
|
|
|
- redisCatchStorage.deleteSendRTPServer(sendRtpItem.getPlatformId(), sendRtpItem.getChannelId(),
|
|
|
- callIdHeader.getCallId(), null);
|
|
|
- zlmServerFactory.stopSendRtpStream(mediaInfo, param);
|
|
|
- if (userSetting.getUseCustomSsrcForParentInvite()) {
|
|
|
- mediaServerService.releaseSsrc(mediaInfo.getId(), sendRtpItem.getSsrc());
|
|
|
- }
|
|
|
+
|
|
|
if (sendRtpItem.getPlayType().equals(InviteStreamType.PUSH)) {
|
|
|
- ParentPlatform platform = platformService.queryPlatformByServerGBId(sendRtpItem.getPlatformId());
|
|
|
- if (platform != null) {
|
|
|
- MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(0,
|
|
|
- sendRtpItem.getApp(), sendRtpItem.getStream(), sendRtpItem.getChannelId(),
|
|
|
- sendRtpItem.getPlatformId(), platform.getName(), userSetting.getServerId(), sendRtpItem.getMediaServerId());
|
|
|
- messageForPushChannel.setPlatFormIndex(platform.getId());
|
|
|
- redisCatchStorage.sendPlatformStopPlayMsg(messageForPushChannel);
|
|
|
+ // 查询这路流是否是本平台的
|
|
|
+ StreamPushItem push = pushService.getPush(sendRtpItem.getApp(), sendRtpItem.getStream());
|
|
|
+ if (push!= null && !push.isSelf()) {
|
|
|
+ // 不是本平台的就发送redis消息让其他wvp停止发流
|
|
|
+ ParentPlatform platform = platformService.queryPlatformByServerGBId(sendRtpItem.getPlatformId());
|
|
|
+ if (platform != null) {
|
|
|
+ RequestStopPushStreamMsg streamMsg = RequestStopPushStreamMsg.getInstance(sendRtpItem, platform.getName(), platform.getId());
|
|
|
+ redisGbPlayMsgListener.sendMsgForStopSendRtpStream(sendRtpItem.getServerId(), streamMsg);
|
|
|
+ }
|
|
|
}else {
|
|
|
- logger.info("[上级平台停止观看] 未找到平台{}的信息,发送redis消息失败", sendRtpItem.getPlatformId());
|
|
|
- }
|
|
|
- }
|
|
|
+ MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
|
|
|
+ redisCatchStorage.deleteSendRTPServer(sendRtpItem.getPlatformId(), sendRtpItem.getChannelId(),
|
|
|
+ callIdHeader.getCallId(), null);
|
|
|
+ zlmServerFactory.stopSendRtpStream(mediaInfo, param);
|
|
|
+ if (userSetting.getUseCustomSsrcForParentInvite()) {
|
|
|
+ mediaServerService.releaseSsrc(mediaInfo.getId(), sendRtpItem.getSsrc());
|
|
|
+ }
|
|
|
|
|
|
- AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
|
|
|
- if (audioBroadcastCatch != null && audioBroadcastCatch.getSipTransactionInfo().getCallId().equals(callIdHeader.getCallId())) {
|
|
|
- // 来自上级平台的停止对讲
|
|
|
- logger.info("[停止对讲] 来自上级,平台:{}, 通道:{}", sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
|
|
|
- audioBroadcastManager.del(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
|
|
|
+ ParentPlatform platform = platformService.queryPlatformByServerGBId(sendRtpItem.getPlatformId());
|
|
|
+ if (platform != null) {
|
|
|
+ MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(0,
|
|
|
+ sendRtpItem.getApp(), sendRtpItem.getStream(), sendRtpItem.getChannelId(),
|
|
|
+ sendRtpItem.getPlatformId(), platform.getName(), userSetting.getServerId(), sendRtpItem.getMediaServerId());
|
|
|
+ messageForPushChannel.setPlatFormIndex(platform.getId());
|
|
|
+ redisCatchStorage.sendPlatformStopPlayMsg(messageForPushChannel);
|
|
|
+ }else {
|
|
|
+ logger.info("[上级平台停止观看] 未找到平台{}的信息,发送redis消息失败", sendRtpItem.getPlatformId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
|
|
|
+ redisCatchStorage.deleteSendRTPServer(sendRtpItem.getPlatformId(), sendRtpItem.getChannelId(),
|
|
|
+ callIdHeader.getCallId(), null);
|
|
|
+ zlmServerFactory.stopSendRtpStream(mediaInfo, param);
|
|
|
+ if (userSetting.getUseCustomSsrcForParentInvite()) {
|
|
|
+ mediaServerService.releaseSsrc(mediaInfo.getId(), sendRtpItem.getSsrc());
|
|
|
+ }
|
|
|
}
|
|
|
+ MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
|
|
|
+ if (mediaInfo != null) {
|
|
|
+ AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
|
|
|
+ if (audioBroadcastCatch != null && audioBroadcastCatch.getSipTransactionInfo().getCallId().equals(callIdHeader.getCallId())) {
|
|
|
+ // 来自上级平台的停止对讲
|
|
|
+ logger.info("[停止对讲] 来自上级,平台:{}, 通道:{}", sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
|
|
|
+ audioBroadcastManager.del(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
|
|
|
+ }
|
|
|
|
|
|
- int totalReaderCount = zlmServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId);
|
|
|
- if (totalReaderCount <= 0) {
|
|
|
- logger.info("[收到bye] {} 无其它观看者,通知设备停止推流", streamId);
|
|
|
- if (sendRtpItem.getPlayType().equals(InviteStreamType.PLAY)) {
|
|
|
- Device device = deviceService.getDevice(sendRtpItem.getDeviceId());
|
|
|
- if (device == null) {
|
|
|
- logger.info("[收到bye] {} 通知设备停止推流时未找到设备信息", streamId);
|
|
|
- }
|
|
|
- try {
|
|
|
- logger.info("[停止点播] {}/{}", sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
|
|
|
- cmder.streamByeCmd(device, sendRtpItem.getChannelId(), streamId, null);
|
|
|
- } catch (InvalidArgumentException | ParseException | SipException |
|
|
|
- SsrcTransactionNotFoundException e) {
|
|
|
- logger.error("[收到bye] {} 无其它观看者,通知设备停止推流, 发送BYE失败 {}",streamId, e.getMessage());
|
|
|
+ int totalReaderCount = zlmServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId);
|
|
|
+ if (totalReaderCount <= 0) {
|
|
|
+ logger.info("[收到bye] {} 无其它观看者,通知设备停止推流", streamId);
|
|
|
+ if (sendRtpItem.getPlayType().equals(InviteStreamType.PLAY)) {
|
|
|
+ Device device = deviceService.getDevice(sendRtpItem.getDeviceId());
|
|
|
+ if (device == null) {
|
|
|
+ logger.info("[收到bye] {} 通知设备停止推流时未找到设备信息", streamId);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ logger.info("[停止点播] {}/{}", sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
|
|
|
+ cmder.streamByeCmd(device, sendRtpItem.getChannelId(), streamId, null);
|
|
|
+ } catch (InvalidArgumentException | ParseException | SipException |
|
|
|
+ SsrcTransactionNotFoundException e) {
|
|
|
+ logger.error("[收到bye] {} 无其它观看者,通知设备停止推流, 发送BYE失败 {}",streamId, e.getMessage());
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 可能是设备发送的停止
|
|
|
- SsrcTransaction ssrcTransaction = streamSession.getSsrcTransactionByCallId(callIdHeader.getCallId());
|
|
|
- if (ssrcTransaction == null) {
|
|
|
- return;
|
|
|
- }
|
|
|
- logger.info("[收到bye] 来自设备:{}, 通道已停止推流: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
|
|
|
+ // 可能是设备发送的停止
|
|
|
+ SsrcTransaction ssrcTransaction = streamSession.getSsrcTransactionByCallId(callIdHeader.getCallId());
|
|
|
+ if (ssrcTransaction == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ logger.info("[收到bye] 来自设备:{}, 通道已停止推流: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
|
|
|
|
|
|
ParentPlatform platform = platformService.queryPlatformByServerGBId(ssrcTransaction.getDeviceId());
|
|
|
if (platform != null ) {
|