瀏覽代碼

优化对讲释放流程

648540858 2 年之前
父節點
當前提交
983c7c351f

+ 56 - 41
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java

@@ -113,6 +113,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
 		CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME);
 		SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(null, null, null, callIdHeader.getCallId());
 
+		// 收流端发送的停止
 		if (sendRtpItem != null){
 			logger.info("[收到bye] 来自{},停止通道:{}, 类型: {}", sendRtpItem.getPlatformId(), sendRtpItem.getChannelId(), sendRtpItem.getPlayType());
 
@@ -139,6 +140,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
 					logger.info("[上级平台停止观看] 未找到平台{}的信息,发送redis消息失败", sendRtpItem.getPlatformId());
 				}
 			}
+
 			AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
 			if (audioBroadcastCatch != null && audioBroadcastCatch.getSipTransactionInfo().getCallId().equals(callIdHeader.getCallId())) {
 				// 来自上级平台的停止对讲
@@ -165,54 +167,67 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
 			}
 		}
 
-			// 可能是设备发送的停止
-			SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(null, null, callIdHeader.getCallId(), null);
-			if (ssrcTransaction == null && sendRtpItem == null) {
-				logger.info("[收到bye] 但是无法获取推流信息和发流信息,忽略此请求");
-				logger.info(request.toString());
-				return;
-			}
-			if (ssrcTransaction != null) {
-				logger.info("[收到bye] 来自设备:{}, 通道已停止推流: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
+		// 发流端发送的停止
+		SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(null, null, callIdHeader.getCallId(), null);
+		if (ssrcTransaction == null ) {
+			logger.info("[收到bye] 但是无法获取推流信息和发流信息,忽略此请求");
+			logger.info(request.toString());
+			return;
+		}
 
-				Device device = deviceService.getDevice(ssrcTransaction.getDeviceId());
-				if (device == null) {
-					logger.info("[收到bye] 未找到设备:{} ", ssrcTransaction.getDeviceId());
-					return;
-				}
-				DeviceChannel channel = channelService.getOne(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
+
+		ParentPlatform platform = platformService.queryPlatformByServerGBId(ssrcTransaction.getDeviceId());
+		if (platform != null ) {
+			if (ssrcTransaction.getType().equals(InviteSessionType.BROADCAST)) {
+				logger.info("[收到bye] 上级停止语音对讲,来自:{}, 通道已停止推流: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
+				DeviceChannel channel = storager.queryChannelInParentPlatform(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
 				if (channel == null) {
 					logger.info("[收到bye] 未找到通道,设备:{}, 通道:{}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
 					return;
 				}
-				storager.stopPlay(device.getDeviceId(), channel.getChannelId());
-				InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId());
-				if (inviteInfo != null) {
-					inviteStreamService.removeInviteInfo(inviteInfo);
-					if (inviteInfo.getStreamInfo() != null) {
-						mediaServerService.closeRTPServer(inviteInfo.getStreamInfo().getMediaServerId(), inviteInfo.getStreamInfo().getStream());
-					}
-				}
-				// 释放ssrc
-				MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransaction.getMediaServerId());
-				if (mediaServerItem != null) {
-					mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcTransaction.getSsrc());
-				}
-				streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcTransaction.getStream());
-				if (ssrcTransaction.getType() == InviteSessionType.BROADCAST) {
-					// 查找来源的对讲设备,发送停止
-					Device sourceDevice = storager.queryVideoDeviceByPlatformIdAndChannelId(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
-					if (sourceDevice != null) {
-						playService.stopAudioBroadcast(sourceDevice.getDeviceId(), channel.getChannelId());
-					}
+				String mediaServerId = ssrcTransaction.getMediaServerId();
+				platformService.stopBroadcast(platform, channel, ssrcTransaction.getStream(), false,
+						mediaServerService.getOne(mediaServerId));
+			}
+
+		}else {
+			Device device = deviceService.getDevice(ssrcTransaction.getDeviceId());
+			if (device == null) {
+				logger.info("[收到bye] 未找到设备:{} ", ssrcTransaction.getDeviceId());
+				return;
+			}
+			DeviceChannel channel = channelService.getOne(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
+			if (channel == null) {
+				logger.info("[收到bye] 未找到通道,设备:{}, 通道:{}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
+				return;
+			}
+			storager.stopPlay(device.getDeviceId(), channel.getChannelId());
+			InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId());
+			if (inviteInfo != null) {
+				inviteStreamService.removeInviteInfo(inviteInfo);
+				if (inviteInfo.getStreamInfo() != null) {
+					mediaServerService.closeRTPServer(inviteInfo.getStreamInfo().getMediaServerId(), inviteInfo.getStreamInfo().getStream());
 				}
-				AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(ssrcTransaction.getDeviceId(), channel.getChannelId());
-				if (audioBroadcastCatch != null) {
-					// 来自上级平台的停止对讲
-					logger.info("[停止对讲] 来自上级,平台:{}, 通道:{}", ssrcTransaction.getDeviceId(), channel.getChannelId());
-					audioBroadcastManager.del(ssrcTransaction.getDeviceId(), channel.getChannelId());
+			}
+			// 释放ssrc
+			MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransaction.getMediaServerId());
+			if (mediaServerItem != null) {
+				mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcTransaction.getSsrc());
+			}
+			streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcTransaction.getStream());
+			if (ssrcTransaction.getType() == InviteSessionType.BROADCAST) {
+				// 查找来源的对讲设备,发送停止
+				Device sourceDevice = storager.queryVideoDeviceByPlatformIdAndChannelId(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
+				if (sourceDevice != null) {
+					playService.stopAudioBroadcast(sourceDevice.getDeviceId(), channel.getChannelId());
 				}
 			}
-
+			AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(ssrcTransaction.getDeviceId(), channel.getChannelId());
+			if (audioBroadcastCatch != null) {
+				// 来自上级平台的停止对讲
+				logger.info("[停止对讲] 来自上级,平台:{}, 通道:{}", ssrcTransaction.getDeviceId(), channel.getChannelId());
+				audioBroadcastManager.del(ssrcTransaction.getDeviceId(), channel.getChannelId());
+			}
+		}
 	}
 }

+ 1 - 6
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/BroadcastNotifyMessageHandler.java

@@ -137,12 +137,7 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp
                                 logger.info("[国标级联] 语音喊话 设备正在使用中 platform: {}, channel: {}",
                                         platform.getServerGBId(), deviceChannel.getChannelId());
                                 //  查看语音通道已经建立且已经占用 回复BYE
-                                try {
-                                    platformService.stopBroadcast(platform, deviceChannel.getChannelId(), streamChangedHookParam.getStream());
-                                } catch (InvalidArgumentException | ParseException | SsrcTransactionNotFoundException |
-                                         SipException e) {
-                                    logger.info("[消息发送失败] 国标级联 语音喊话 platform: {}, channel: {}", platform.getServerGBId(), deviceChannel.getChannelId());
-                                }
+                                platformService.stopBroadcast(platform, deviceChannel, streamChangedHookParam.getStream(),  true, mediaServerItem);
                             }else {
                                 // 查看语音通道已经建立但是未占用
                                 broadcastCatch.setApp(streamChangedHookParam.getApp());

+ 2 - 5
src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java

@@ -1,6 +1,6 @@
 package com.genersoft.iot.vmp.service;
 
-import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
+import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
@@ -78,9 +78,6 @@ public interface IPlatformService {
 
     /**
      * 语音喊话回复BYE
-     * @param platform 平台
-     * @param channelId 通道
-     * @param stream 流信息
      */
-    void stopBroadcast(ParentPlatform platform, String channelId, String stream )throws InvalidArgumentException, ParseException, SsrcTransactionNotFoundException, SipException;
+    void stopBroadcast(ParentPlatform platform, DeviceChannel channel, String stream,boolean sendBye, MediaServerItem mediaServerItem);
 }

+ 18 - 3
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java

@@ -422,7 +422,6 @@ public class PlatformServiceImpl implements IPlatformService {
         }
         InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, platform.getServerGBId(), channelId);
 
-
         if (inviteInfo != null && inviteInfo.getStreamInfo() != null) {
             // 如果zlm不存在这个流,则删除数据即可
             MediaServerItem mediaServerItemForStreamInfo = mediaServerService.getOne(inviteInfo.getStreamInfo().getMediaServerId());
@@ -547,7 +546,23 @@ public class PlatformServiceImpl implements IPlatformService {
     }
 
     @Override
-    public void stopBroadcast(ParentPlatform platform, String channelId, String stream) throws InvalidArgumentException, ParseException, SsrcTransactionNotFoundException, SipException {
-        commanderForPlatform.streamByeCmd(platform, channelId, stream, null, null);
+    public void stopBroadcast(ParentPlatform platform, DeviceChannel channel, String stream, boolean sendBye, MediaServerItem mediaServerItem) {
+
+        try {
+            if (sendBye) {
+                commanderForPlatform.streamByeCmd(platform, channel.getChannelId(), stream, null, null);
+            }
+        } catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
+            logger.warn("[消息发送失败] 停止语音对讲, 平台:{},通道:{}", platform.getId(), channel.getChannelId() );
+        } finally {
+            mediaServerService.closeRTPServer(mediaServerItem, stream);
+            InviteInfo inviteInfo = inviteStreamService.getInviteInfo(null, platform.getServerGBId(), channel.getChannelId(), stream);
+            if (inviteInfo != null) {
+                // 释放ssrc
+                mediaServerService.releaseSsrc(mediaServerItem.getId(), inviteInfo.getSsrcInfo().getSsrc());
+                inviteStreamService.removeInviteInfo(inviteInfo);
+            }
+            streamSession.remove(platform.getServerGBId(), channel.getChannelId(), stream);
+        }
     }
 }