Commit a9bdb0a706e10d2dffb50ae5a8086dd744bbd976
1 parent
f8f65d47
优化语音广播流程
Showing
4 changed files
with
72 additions
and
54 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
| ... | ... | @@ -4,9 +4,8 @@ import com.alibaba.fastjson.JSON; |
| 4 | 4 | import com.alibaba.fastjson.JSONObject; |
| 5 | 5 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 6 | 6 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 7 | -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamType; | |
| 8 | -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | |
| 9 | -import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; | |
| 7 | +import com.genersoft.iot.vmp.gb28181.bean.*; | |
| 8 | +import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; | |
| 10 | 9 | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| 11 | 10 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; |
| 12 | 11 | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; |
| ... | ... | @@ -82,6 +81,9 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In |
| 82 | 81 | @Autowired |
| 83 | 82 | private ISIPCommanderForPlatform commanderForPlatform; |
| 84 | 83 | |
| 84 | + @Autowired | |
| 85 | + private AudioBroadcastManager audioBroadcastManager; | |
| 86 | + | |
| 85 | 87 | |
| 86 | 88 | /** |
| 87 | 89 | * 处理 ACK请求 |
| ... | ... | @@ -122,6 +124,13 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In |
| 122 | 124 | if (jsonObject == null) { |
| 123 | 125 | logger.error("RTP推流失败: 请检查ZLM服务"); |
| 124 | 126 | } else if (jsonObject.getInteger("code") == 0) { |
| 127 | + if (sendRtpItem.isOnlyAudio()) { | |
| 128 | + AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId()); | |
| 129 | + audioBroadcastCatch.setStatus(AudioBroadcastCatchStatus.Ok); | |
| 130 | + audioBroadcastCatch.setDialog((SIPDialog) evt.getDialog()); | |
| 131 | + audioBroadcastCatch.setRequest((SIPRequest) evt.getRequest()); | |
| 132 | + audioBroadcastManager.update(audioBroadcastCatch); | |
| 133 | + } | |
| 125 | 134 | logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port")); |
| 126 | 135 | } else { |
| 127 | 136 | logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param)); | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
| ... | ... | @@ -91,7 +91,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In |
| 91 | 91 | if (dialog.getState().equals(DialogState.TERMINATED)) { |
| 92 | 92 | String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser(); |
| 93 | 93 | String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser(); |
| 94 | - SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, channelId, null, callIdHeader.getCallId()); | |
| 94 | + SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, null, null, callIdHeader.getCallId()); | |
| 95 | 95 | logger.info("收到bye, [{}/{}]", platformGbId, channelId); |
| 96 | 96 | if (sendRtpItem != null){ |
| 97 | 97 | String streamId = sendRtpItem.getStreamId(); |
| ... | ... | @@ -103,15 +103,15 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In |
| 103 | 103 | logger.info("收到bye:停止向上级推流:" + streamId); |
| 104 | 104 | MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId()); |
| 105 | 105 | zlmrtpServerFactory.stopSendRtpStream(mediaInfo, param); |
| 106 | - redisCatchStorage.deleteSendRTPServer(platformGbId, channelId, callIdHeader.getCallId(), null); | |
| 106 | + redisCatchStorage.deleteSendRTPServer(platformGbId, sendRtpItem.getChannelId(), callIdHeader.getCallId(), null); | |
| 107 | 107 | int totalReaderCount = zlmrtpServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId); |
| 108 | 108 | if (totalReaderCount <= 0) { |
| 109 | 109 | logger.info("收到bye: {} 无其它观看者,通知设备停止推流", streamId); |
| 110 | 110 | if (sendRtpItem.getPlayType().equals(InviteStreamType.PLAY)) { |
| 111 | - cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId, streamId, null); | |
| 111 | + cmder.streamByeCmd(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId(), streamId, null); | |
| 112 | 112 | } |
| 113 | 113 | if (sendRtpItem.isOnlyAudio()) { |
| 114 | - playService.stopAudioBroadcast(sendRtpItem.getDeviceId(), channelId); | |
| 114 | + playService.stopAudioBroadcast(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId()); | |
| 115 | 115 | } |
| 116 | 116 | if (sendRtpItem.getPlayType().equals(InviteStreamType.PUSH)) { |
| 117 | 117 | MessageForPushChannel messageForPushChannel = new MessageForPushChannel(); | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| ... | ... | @@ -713,6 +713,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 713 | 713 | String waiteStreamTimeoutTaskKey = "waite-stream-" + device.getDeviceId() + audioBroadcastCatch.getChannelId(); |
| 714 | 714 | dynamicTask.startDelay(waiteStreamTimeoutTaskKey, ()->{ |
| 715 | 715 | logger.info("等待推流超时: {}/{}", app, stream); |
| 716 | + subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); | |
| 716 | 717 | playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId()); |
| 717 | 718 | // 发送bye |
| 718 | 719 | try { |
| ... | ... | @@ -728,35 +729,42 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 728 | 729 | |
| 729 | 730 | subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, |
| 730 | 731 | (MediaServerItem mediaServerItemInUse, JSONObject json)->{ |
| 731 | - sendRtpItem.setStatus(2); | |
| 732 | - dynamicTask.stop(waiteStreamTimeoutTaskKey); | |
| 733 | - redisCatchStorage.updateSendRTPSever(sendRtpItem); | |
| 734 | - StringBuffer content = new StringBuffer(200); | |
| 735 | - content.append("v=0\r\n"); | |
| 736 | - content.append("o="+ audioBroadcastCatch.getChannelId() +" 0 0 IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); | |
| 737 | - content.append("s=Play\r\n"); | |
| 738 | - content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); | |
| 739 | - content.append("t=0 0\r\n"); | |
| 740 | - content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n"); | |
| 741 | - content.append("a=sendonly\r\n"); | |
| 742 | - content.append("a=rtpmap:8 PCMA/8000\r\n"); | |
| 743 | - content.append("y="+ finalSsrc + "\r\n"); | |
| 744 | - content.append("f=v/////a/1/8/1\r\n"); | |
| 745 | - | |
| 746 | - ParentPlatform parentPlatform = new ParentPlatform(); | |
| 747 | - parentPlatform.setServerIP(device.getIp()); | |
| 748 | - parentPlatform.setServerPort(device.getPort()); | |
| 749 | - parentPlatform.setServerGBId(device.getDeviceId()); | |
| 750 | - try { | |
| 751 | - responseSdpAck(evt, content.toString(), parentPlatform); | |
| 752 | - } catch (SipException e) { | |
| 753 | - throw new RuntimeException(e); | |
| 754 | - } catch (InvalidArgumentException e) { | |
| 755 | - throw new RuntimeException(e); | |
| 756 | - } catch (ParseException e) { | |
| 757 | - throw new RuntimeException(e); | |
| 758 | - } | |
| 759 | - }); | |
| 732 | + logger.info("收到语音对讲推流"); | |
| 733 | + try { | |
| 734 | + sendRtpItem.setStatus(2); | |
| 735 | + redisCatchStorage.updateSendRTPSever(sendRtpItem); | |
| 736 | + StringBuffer content = new StringBuffer(200); | |
| 737 | + content.append("v=0\r\n"); | |
| 738 | + content.append("o="+ config.getId() +" "+ sdp.getOrigin().getSessionId() +" " + sdp.getOrigin().getSessionVersion() + " IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); | |
| 739 | + content.append("s=Play\r\n"); | |
| 740 | + content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); | |
| 741 | + content.append("t=0 0\r\n"); | |
| 742 | + content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n"); | |
| 743 | + content.append("a=sendonly\r\n"); | |
| 744 | + content.append("a=rtpmap:8 PCMA/8000\r\n"); | |
| 745 | + content.append("y="+ finalSsrc + "\r\n"); | |
| 746 | + content.append("f=v/////a/1/8/1\r\n"); | |
| 747 | + | |
| 748 | + ParentPlatform parentPlatform = new ParentPlatform(); | |
| 749 | + parentPlatform.setServerIP(device.getIp()); | |
| 750 | + parentPlatform.setServerPort(device.getPort()); | |
| 751 | + parentPlatform.setServerGBId(device.getDeviceId()); | |
| 752 | + | |
| 753 | + responseSdpAck(evt, content.toString(), parentPlatform); | |
| 754 | + Dialog dialog = evt.getDialog(); | |
| 755 | + audioBroadcastCatch.setDialog((SIPDialog) dialog); | |
| 756 | + audioBroadcastCatch.setRequest((SIPRequest) request); | |
| 757 | + audioBroadcastManager.update(audioBroadcastCatch); | |
| 758 | + } catch (SipException e) { | |
| 759 | + throw new RuntimeException(e); | |
| 760 | + } catch (InvalidArgumentException e) { | |
| 761 | + throw new RuntimeException(e); | |
| 762 | + } catch (ParseException e) { | |
| 763 | + throw new RuntimeException(e); | |
| 764 | + } catch (SdpParseException e) { | |
| 765 | + throw new RuntimeException(e); | |
| 766 | + } | |
| 767 | + }); | |
| 760 | 768 | } |
| 761 | 769 | String key = DeferredResultHolder.CALLBACK_CMD_BROADCAST + device.getDeviceId(); |
| 762 | 770 | WVPResult<AudioBroadcastResult> wvpResult = new WVPResult<>(); | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| ... | ... | @@ -675,26 +675,27 @@ public class PlayServiceImpl implements IPlayService { |
| 675 | 675 | AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(deviceId, channelId); |
| 676 | 676 | if (audioBroadcastCatch != null) { |
| 677 | 677 | audioBroadcastManager.del(deviceId, audioBroadcastCatch.getChannelId()); |
| 678 | - } | |
| 679 | - try { | |
| 680 | - SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(deviceId, channelId, null, null); | |
| 681 | - if (sendRtpItem != null) { | |
| 682 | - redisCatchStorage.deleteSendRTPServer(deviceId, sendRtpItem.getChannelId(), null, null); | |
| 683 | - MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId()); | |
| 684 | - Map<String, Object> param = new HashMap<>(); | |
| 685 | - param.put("vhost", "__defaultVhost__"); | |
| 686 | - param.put("app", sendRtpItem.getApp()); | |
| 687 | - param.put("stream", sendRtpItem.getStreamId()); | |
| 688 | - zlmresTfulUtils.stopSendRtp(mediaInfo, param); | |
| 689 | - } | |
| 690 | - if (audioBroadcastCatch.getStatus() == AudioBroadcastCatchStatus.Ok) { | |
| 691 | - cmder.streamByeCmd(audioBroadcastCatch.getDialog(), audioBroadcastCatch.getRequest(), null); | |
| 678 | + try { | |
| 679 | + SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(deviceId, audioBroadcastCatch.getChannelId(), null, null); | |
| 680 | + if (sendRtpItem != null) { | |
| 681 | + redisCatchStorage.deleteSendRTPServer(deviceId, sendRtpItem.getChannelId(), null, null); | |
| 682 | + MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId()); | |
| 683 | + Map<String, Object> param = new HashMap<>(); | |
| 684 | + param.put("vhost", "__defaultVhost__"); | |
| 685 | + param.put("app", sendRtpItem.getApp()); | |
| 686 | + param.put("stream", sendRtpItem.getStreamId()); | |
| 687 | + zlmresTfulUtils.stopSendRtp(mediaInfo, param); | |
| 688 | + } | |
| 689 | + if (audioBroadcastCatch.getStatus() == AudioBroadcastCatchStatus.Ok) { | |
| 690 | + cmder.streamByeCmd(audioBroadcastCatch.getDialog(), audioBroadcastCatch.getRequest(), null); | |
| 691 | + } | |
| 692 | + } catch (SipException e) { | |
| 693 | + throw new RuntimeException(e); | |
| 694 | + } catch (ParseException e) { | |
| 695 | + throw new RuntimeException(e); | |
| 692 | 696 | } |
| 693 | - } catch (SipException e) { | |
| 694 | - throw new RuntimeException(e); | |
| 695 | - } catch (ParseException e) { | |
| 696 | - throw new RuntimeException(e); | |
| 697 | 697 | } |
| 698 | 698 | |
| 699 | + | |
| 699 | 700 | } |
| 700 | 701 | } | ... | ... |