Commit 983c7c351f3790d0effe2894ce435552ff0f2feb
1 parent
d4fdd975
优化对讲释放流程
Showing
4 changed files
with
77 additions
and
55 deletions
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 | @@ -113,6 +113,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In | ||
| 113 | CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); | 113 | CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME); |
| 114 | SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, null, null, callIdHeader.getCallId()); | 114 | SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, null, null, callIdHeader.getCallId()); |
| 115 | 115 | ||
| 116 | + // 收流端发送的停止 | ||
| 116 | if (sendRtpItem != null){ | 117 | if (sendRtpItem != null){ |
| 117 | logger.info("[收到bye] 来自{},停止通道:{}, 类型: {}", sendRtpItem.getPlatformId(), sendRtpItem.getChannelId(), sendRtpItem.getPlayType()); | 118 | logger.info("[收到bye] 来自{},停止通道:{}, 类型: {}", sendRtpItem.getPlatformId(), sendRtpItem.getChannelId(), sendRtpItem.getPlayType()); |
| 118 | 119 | ||
| @@ -139,6 +140,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In | @@ -139,6 +140,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In | ||
| 139 | logger.info("[上级平台停止观看] 未找到平台{}的信息,发送redis消息失败", sendRtpItem.getPlatformId()); | 140 | logger.info("[上级平台停止观看] 未找到平台{}的信息,发送redis消息失败", sendRtpItem.getPlatformId()); |
| 140 | } | 141 | } |
| 141 | } | 142 | } |
| 143 | + | ||
| 142 | AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId()); | 144 | AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId()); |
| 143 | if (audioBroadcastCatch != null && audioBroadcastCatch.getSipTransactionInfo().getCallId().equals(callIdHeader.getCallId())) { | 145 | if (audioBroadcastCatch != null && audioBroadcastCatch.getSipTransactionInfo().getCallId().equals(callIdHeader.getCallId())) { |
| 144 | // 来自上级平台的停止对讲 | 146 | // 来自上级平台的停止对讲 |
| @@ -165,54 +167,67 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In | @@ -165,54 +167,67 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In | ||
| 165 | } | 167 | } |
| 166 | } | 168 | } |
| 167 | 169 | ||
| 168 | - // 可能是设备发送的停止 | ||
| 169 | - SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(null, null, callIdHeader.getCallId(), null); | ||
| 170 | - if (ssrcTransaction == null && sendRtpItem == null) { | ||
| 171 | - logger.info("[收到bye] 但是无法获取推流信息和发流信息,忽略此请求"); | ||
| 172 | - logger.info(request.toString()); | ||
| 173 | - return; | ||
| 174 | - } | ||
| 175 | - if (ssrcTransaction != null) { | ||
| 176 | - logger.info("[收到bye] 来自设备:{}, 通道已停止推流: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | 170 | + // 发流端发送的停止 |
| 171 | + SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(null, null, callIdHeader.getCallId(), null); | ||
| 172 | + if (ssrcTransaction == null ) { | ||
| 173 | + logger.info("[收到bye] 但是无法获取推流信息和发流信息,忽略此请求"); | ||
| 174 | + logger.info(request.toString()); | ||
| 175 | + return; | ||
| 176 | + } | ||
| 177 | 177 | ||
| 178 | - Device device = deviceService.getDevice(ssrcTransaction.getDeviceId()); | ||
| 179 | - if (device == null) { | ||
| 180 | - logger.info("[收到bye] 未找到设备:{} ", ssrcTransaction.getDeviceId()); | ||
| 181 | - return; | ||
| 182 | - } | ||
| 183 | - DeviceChannel channel = channelService.getOne(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | 178 | + |
| 179 | + ParentPlatform platform = platformService.queryPlatformByServerGBId(ssrcTransaction.getDeviceId()); | ||
| 180 | + if (platform != null ) { | ||
| 181 | + if (ssrcTransaction.getType().equals(InviteSessionType.BROADCAST)) { | ||
| 182 | + logger.info("[收到bye] 上级停止语音对讲,来自:{}, 通道已停止推流: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | ||
| 183 | + DeviceChannel channel = storager.queryChannelInParentPlatform(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | ||
| 184 | if (channel == null) { | 184 | if (channel == null) { |
| 185 | logger.info("[收到bye] 未找到通道,设备:{}, 通道:{}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | 185 | logger.info("[收到bye] 未找到通道,设备:{}, 通道:{}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); |
| 186 | return; | 186 | return; |
| 187 | } | 187 | } |
| 188 | - storager.stopPlay(device.getDeviceId(), channel.getChannelId()); | ||
| 189 | - InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); | ||
| 190 | - if (inviteInfo != null) { | ||
| 191 | - inviteStreamService.removeInviteInfo(inviteInfo); | ||
| 192 | - if (inviteInfo.getStreamInfo() != null) { | ||
| 193 | - mediaServerService.closeRTPServer(inviteInfo.getStreamInfo().getMediaServerId(), inviteInfo.getStreamInfo().getStream()); | ||
| 194 | - } | ||
| 195 | - } | ||
| 196 | - // 释放ssrc | ||
| 197 | - MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransaction.getMediaServerId()); | ||
| 198 | - if (mediaServerItem != null) { | ||
| 199 | - mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcTransaction.getSsrc()); | ||
| 200 | - } | ||
| 201 | - streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcTransaction.getStream()); | ||
| 202 | - if (ssrcTransaction.getType() == InviteSessionType.BROADCAST) { | ||
| 203 | - // 查找来源的对讲设备,发送停止 | ||
| 204 | - Device sourceDevice = storager.queryVideoDeviceByPlatformIdAndChannelId(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | ||
| 205 | - if (sourceDevice != null) { | ||
| 206 | - playService.stopAudioBroadcast(sourceDevice.getDeviceId(), channel.getChannelId()); | ||
| 207 | - } | 188 | + String mediaServerId = ssrcTransaction.getMediaServerId(); |
| 189 | + platformService.stopBroadcast(platform, channel, ssrcTransaction.getStream(), false, | ||
| 190 | + mediaServerService.getOne(mediaServerId)); | ||
| 191 | + } | ||
| 192 | + | ||
| 193 | + }else { | ||
| 194 | + Device device = deviceService.getDevice(ssrcTransaction.getDeviceId()); | ||
| 195 | + if (device == null) { | ||
| 196 | + logger.info("[收到bye] 未找到设备:{} ", ssrcTransaction.getDeviceId()); | ||
| 197 | + return; | ||
| 198 | + } | ||
| 199 | + DeviceChannel channel = channelService.getOne(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | ||
| 200 | + if (channel == null) { | ||
| 201 | + logger.info("[收到bye] 未找到通道,设备:{}, 通道:{}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | ||
| 202 | + return; | ||
| 203 | + } | ||
| 204 | + storager.stopPlay(device.getDeviceId(), channel.getChannelId()); | ||
| 205 | + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId()); | ||
| 206 | + if (inviteInfo != null) { | ||
| 207 | + inviteStreamService.removeInviteInfo(inviteInfo); | ||
| 208 | + if (inviteInfo.getStreamInfo() != null) { | ||
| 209 | + mediaServerService.closeRTPServer(inviteInfo.getStreamInfo().getMediaServerId(), inviteInfo.getStreamInfo().getStream()); | ||
| 208 | } | 210 | } |
| 209 | - AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(ssrcTransaction.getDeviceId(), channel.getChannelId()); | ||
| 210 | - if (audioBroadcastCatch != null) { | ||
| 211 | - // 来自上级平台的停止对讲 | ||
| 212 | - logger.info("[停止对讲] 来自上级,平台:{}, 通道:{}", ssrcTransaction.getDeviceId(), channel.getChannelId()); | ||
| 213 | - audioBroadcastManager.del(ssrcTransaction.getDeviceId(), channel.getChannelId()); | 211 | + } |
| 212 | + // 释放ssrc | ||
| 213 | + MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransaction.getMediaServerId()); | ||
| 214 | + if (mediaServerItem != null) { | ||
| 215 | + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcTransaction.getSsrc()); | ||
| 216 | + } | ||
| 217 | + streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcTransaction.getStream()); | ||
| 218 | + if (ssrcTransaction.getType() == InviteSessionType.BROADCAST) { | ||
| 219 | + // 查找来源的对讲设备,发送停止 | ||
| 220 | + Device sourceDevice = storager.queryVideoDeviceByPlatformIdAndChannelId(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); | ||
| 221 | + if (sourceDevice != null) { | ||
| 222 | + playService.stopAudioBroadcast(sourceDevice.getDeviceId(), channel.getChannelId()); | ||
| 214 | } | 223 | } |
| 215 | } | 224 | } |
| 216 | - | 225 | + AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(ssrcTransaction.getDeviceId(), channel.getChannelId()); |
| 226 | + if (audioBroadcastCatch != null) { | ||
| 227 | + // 来自上级平台的停止对讲 | ||
| 228 | + logger.info("[停止对讲] 来自上级,平台:{}, 通道:{}", ssrcTransaction.getDeviceId(), channel.getChannelId()); | ||
| 229 | + audioBroadcastManager.del(ssrcTransaction.getDeviceId(), channel.getChannelId()); | ||
| 230 | + } | ||
| 231 | + } | ||
| 217 | } | 232 | } |
| 218 | } | 233 | } |
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 | @@ -137,12 +137,7 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp | ||
| 137 | logger.info("[国标级联] 语音喊话 设备正在使用中 platform: {}, channel: {}", | 137 | logger.info("[国标级联] 语音喊话 设备正在使用中 platform: {}, channel: {}", |
| 138 | platform.getServerGBId(), deviceChannel.getChannelId()); | 138 | platform.getServerGBId(), deviceChannel.getChannelId()); |
| 139 | // 查看语音通道已经建立且已经占用 回复BYE | 139 | // 查看语音通道已经建立且已经占用 回复BYE |
| 140 | - try { | ||
| 141 | - platformService.stopBroadcast(platform, deviceChannel.getChannelId(), streamChangedHookParam.getStream()); | ||
| 142 | - } catch (InvalidArgumentException | ParseException | SsrcTransactionNotFoundException | | ||
| 143 | - SipException e) { | ||
| 144 | - logger.info("[消息发送失败] 国标级联 语音喊话 platform: {}, channel: {}", platform.getServerGBId(), deviceChannel.getChannelId()); | ||
| 145 | - } | 140 | + platformService.stopBroadcast(platform, deviceChannel, streamChangedHookParam.getStream(), true, mediaServerItem); |
| 146 | }else { | 141 | }else { |
| 147 | // 查看语音通道已经建立但是未占用 | 142 | // 查看语音通道已经建立但是未占用 |
| 148 | broadcastCatch.setApp(streamChangedHookParam.getApp()); | 143 | broadcastCatch.setApp(streamChangedHookParam.getApp()); |
src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java
| 1 | package com.genersoft.iot.vmp.service; | 1 | package com.genersoft.iot.vmp.service; |
| 2 | 2 | ||
| 3 | -import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; | 3 | +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; |
| 4 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | 4 | import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; |
| 5 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; | 5 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| 6 | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; | 6 | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; |
| @@ -78,9 +78,6 @@ public interface IPlatformService { | @@ -78,9 +78,6 @@ public interface IPlatformService { | ||
| 78 | 78 | ||
| 79 | /** | 79 | /** |
| 80 | * 语音喊话回复BYE | 80 | * 语音喊话回复BYE |
| 81 | - * @param platform 平台 | ||
| 82 | - * @param channelId 通道 | ||
| 83 | - * @param stream 流信息 | ||
| 84 | */ | 81 | */ |
| 85 | - void stopBroadcast(ParentPlatform platform, String channelId, String stream )throws InvalidArgumentException, ParseException, SsrcTransactionNotFoundException, SipException; | 82 | + void stopBroadcast(ParentPlatform platform, DeviceChannel channel, String stream,boolean sendBye, MediaServerItem mediaServerItem); |
| 86 | } | 83 | } |
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java
| @@ -422,7 +422,6 @@ public class PlatformServiceImpl implements IPlatformService { | @@ -422,7 +422,6 @@ public class PlatformServiceImpl implements IPlatformService { | ||
| 422 | } | 422 | } |
| 423 | InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, platform.getServerGBId(), channelId); | 423 | InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, platform.getServerGBId(), channelId); |
| 424 | 424 | ||
| 425 | - | ||
| 426 | if (inviteInfo != null && inviteInfo.getStreamInfo() != null) { | 425 | if (inviteInfo != null && inviteInfo.getStreamInfo() != null) { |
| 427 | // 如果zlm不存在这个流,则删除数据即可 | 426 | // 如果zlm不存在这个流,则删除数据即可 |
| 428 | MediaServerItem mediaServerItemForStreamInfo = mediaServerService.getOne(inviteInfo.getStreamInfo().getMediaServerId()); | 427 | MediaServerItem mediaServerItemForStreamInfo = mediaServerService.getOne(inviteInfo.getStreamInfo().getMediaServerId()); |
| @@ -547,7 +546,23 @@ public class PlatformServiceImpl implements IPlatformService { | @@ -547,7 +546,23 @@ public class PlatformServiceImpl implements IPlatformService { | ||
| 547 | } | 546 | } |
| 548 | 547 | ||
| 549 | @Override | 548 | @Override |
| 550 | - public void stopBroadcast(ParentPlatform platform, String channelId, String stream) throws InvalidArgumentException, ParseException, SsrcTransactionNotFoundException, SipException { | ||
| 551 | - commanderForPlatform.streamByeCmd(platform, channelId, stream, null, null); | 549 | + public void stopBroadcast(ParentPlatform platform, DeviceChannel channel, String stream, boolean sendBye, MediaServerItem mediaServerItem) { |
| 550 | + | ||
| 551 | + try { | ||
| 552 | + if (sendBye) { | ||
| 553 | + commanderForPlatform.streamByeCmd(platform, channel.getChannelId(), stream, null, null); | ||
| 554 | + } | ||
| 555 | + } catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) { | ||
| 556 | + logger.warn("[消息发送失败] 停止语音对讲, 平台:{},通道:{}", platform.getId(), channel.getChannelId() ); | ||
| 557 | + } finally { | ||
| 558 | + mediaServerService.closeRTPServer(mediaServerItem, stream); | ||
| 559 | + InviteInfo inviteInfo = inviteStreamService.getInviteInfo(null, platform.getServerGBId(), channel.getChannelId(), stream); | ||
| 560 | + if (inviteInfo != null) { | ||
| 561 | + // 释放ssrc | ||
| 562 | + mediaServerService.releaseSsrc(mediaServerItem.getId(), inviteInfo.getSsrcInfo().getSsrc()); | ||
| 563 | + inviteStreamService.removeInviteInfo(inviteInfo); | ||
| 564 | + } | ||
| 565 | + streamSession.remove(platform.getServerGBId(), channel.getChannelId(), stream); | ||
| 566 | + } | ||
| 552 | } | 567 | } |
| 553 | } | 568 | } |