Commit f6320c7dd3dfd25e98bb63f41d79a33af5009a93

Authored by 648540858
1 parent 82fd369c

合并主线

sql/update.sql
1 -alter table wvp.media_server 1 +alter table media_server
2 drop column streamNoneReaderDelayMS; 2 drop column streamNoneReaderDelayMS;
3 3
4 alter table stream_proxy 4 alter table stream_proxy
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -896,7 +896,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -896,7 +896,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
896 AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(requesterId, channelId); 896 AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(requesterId, channelId);
897 if (audioBroadcastCatch == null) { 897 if (audioBroadcastCatch == null) {
898 logger.warn("来自设备的Invite请求非语音广播,已忽略,requesterId: {}/{}", requesterId, channelId); 898 logger.warn("来自设备的Invite请求非语音广播,已忽略,requesterId: {}/{}", requesterId, channelId);
899 - responseAck(serverTransaction, Response.FORBIDDEN); 899 + try {
  900 + responseAck(serverTransaction, Response.FORBIDDEN);
  901 + } catch (SipException | InvalidArgumentException | ParseException e) {
  902 + logger.error("[命令发送失败] 来自设备的Invite请求非语音广播 FORBIDDEN: {}", e.getMessage());
  903 + }
900 return; 904 return;
901 } 905 }
902 Request request = serverTransaction.getRequest(); 906 Request request = serverTransaction.getRequest();
@@ -920,86 +924,102 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -920,86 +924,102 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
920 if (ssrcIndex > 0) { 924 if (ssrcIndex > 0) {
921 substring = contentString.substring(0, ssrcIndex); 925 substring = contentString.substring(0, ssrcIndex);
922 } 926 }
923 - SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);  
924 -  
925 - // 获取支持的格式  
926 - Vector mediaDescriptions = sdp.getMediaDescriptions(true);  
927 -  
928 - // 查看是否支持PS 负载96  
929 - int port = -1;  
930 - boolean mediaTransmissionTCP = false;  
931 - Boolean tcpActive = null;  
932 - for (int i = 0; i < mediaDescriptions.size(); i++) {  
933 - MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i);  
934 - Media media = mediaDescription.getMedia();  
935 -  
936 - Vector mediaFormats = media.getMediaFormats(false);  
937 - if (mediaFormats.contains("8")) {  
938 - port = media.getMediaPort();  
939 - String protocol = media.getProtocol();  
940 - // 区分TCP发流还是udp, 当前默认udp  
941 - if ("TCP/RTP/AVP".equals(protocol)) {  
942 - String setup = mediaDescription.getAttribute("setup");  
943 - if (setup != null) {  
944 - mediaTransmissionTCP = true;  
945 - if ("active".equals(setup)) {  
946 - tcpActive = true;  
947 - } else if ("passive".equals(setup)) {  
948 - tcpActive = false; 927 + try {
  928 + SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
  929 +
  930 + // 获取支持的格式
  931 + Vector mediaDescriptions = sdp.getMediaDescriptions(true);
  932 +
  933 + // 查看是否支持PS 负载96
  934 + int port = -1;
  935 + boolean mediaTransmissionTCP = false;
  936 + Boolean tcpActive = null;
  937 + for (int i = 0; i < mediaDescriptions.size(); i++) {
  938 + MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i);
  939 + Media media = mediaDescription.getMedia();
  940 +
  941 + Vector mediaFormats = media.getMediaFormats(false);
  942 + if (mediaFormats.contains("8")) {
  943 + port = media.getMediaPort();
  944 + String protocol = media.getProtocol();
  945 + // 区分TCP发流还是udp, 当前默认udp
  946 + if ("TCP/RTP/AVP".equals(protocol)) {
  947 + String setup = mediaDescription.getAttribute("setup");
  948 + if (setup != null) {
  949 + mediaTransmissionTCP = true;
  950 + if ("active".equals(setup)) {
  951 + tcpActive = true;
  952 + } else if ("passive".equals(setup)) {
  953 + tcpActive = false;
  954 + }
949 } 955 }
950 } 956 }
  957 + break;
951 } 958 }
952 - break;  
953 } 959 }
954 - }  
955 - if (port == -1) {  
956 - logger.info("不支持的媒体格式,返回415");  
957 - // 回复不支持的格式  
958 - responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE); // 不支持的格式,发415  
959 - return;  
960 - }  
961 - String addressStr = sdp.getOrigin().getAddress();  
962 - logger.info("设备{}请求语音流,地址:{}:{},ssrc:{}", requesterId, addressStr, port, ssrc); 960 + if (port == -1) {
  961 + logger.info("不支持的媒体格式,返回415");
  962 + // 回复不支持的格式
  963 + try {
  964 + responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE); // 不支持的格式,发415
  965 + } catch (SipException | InvalidArgumentException | ParseException e) {
  966 + logger.error("[命令发送失败] invite 不支持的媒体格式: {}", e.getMessage());
  967 + }
  968 + return;
  969 + }
  970 + String addressStr = sdp.getOrigin().getAddress();
  971 + logger.info("设备{}请求语音流,地址:{}:{},ssrc:{}", requesterId, addressStr, port, ssrc);
963 972
964 - MediaServerItem mediaServerItem = playService.getNewMediaServerItem(device);  
965 - if (mediaServerItem == null) {  
966 - logger.warn("未找到可用的zlm");  
967 - responseAck(serverTransaction, Response.BUSY_HERE);  
968 - return;  
969 - }  
970 - SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,  
971 - device.getDeviceId(), audioBroadcastCatch.getChannelId(),  
972 - mediaTransmissionTCP);  
973 - if (sendRtpItem == null) {  
974 - logger.warn("服务器端口资源不足");  
975 - responseAck(serverTransaction, Response.BUSY_HERE);  
976 - return;  
977 - }  
978 - sendRtpItem.setTcp(mediaTransmissionTCP);  
979 - if (tcpActive != null) {  
980 - sendRtpItem.setTcpActive(tcpActive);  
981 - }  
982 - String app = "broadcast";  
983 - String stream = device.getDeviceId() + "_" + audioBroadcastCatch.getChannelId(); 973 + MediaServerItem mediaServerItem = playService.getNewMediaServerItem(device);
  974 + if (mediaServerItem == null) {
  975 + logger.warn("未找到可用的zlm");
  976 + try {
  977 + responseAck(serverTransaction, Response.BUSY_HERE);
  978 + } catch (SipException | InvalidArgumentException | ParseException e) {
  979 + logger.error("[命令发送失败] invite 未找到可用的zlm: {}", e.getMessage());
  980 + }
  981 + return;
  982 + }
  983 + SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,
  984 + device.getDeviceId(), audioBroadcastCatch.getChannelId(),
  985 + mediaTransmissionTCP);
  986 + if (sendRtpItem == null) {
  987 + logger.warn("服务器端口资源不足");
  988 + try {
  989 + responseAck(serverTransaction, Response.BUSY_HERE);
  990 + } catch (SipException | InvalidArgumentException | ParseException e) {
  991 + logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage());
  992 + }
  993 + return;
  994 + }
  995 + sendRtpItem.setTcp(mediaTransmissionTCP);
  996 + if (tcpActive != null) {
  997 + sendRtpItem.setTcpActive(tcpActive);
  998 + }
  999 + String app = "broadcast";
  1000 + String stream = device.getDeviceId() + "_" + audioBroadcastCatch.getChannelId();
984 1001
985 - CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME);  
986 - sendRtpItem.setPlayType(InviteStreamType.PLAY);  
987 - sendRtpItem.setCallId(callIdHeader.getCallId());  
988 - sendRtpItem.setPlatformId(requesterId);  
989 - sendRtpItem.setStatus(1);  
990 - sendRtpItem.setApp(app);  
991 - sendRtpItem.setStreamId(stream);  
992 - sendRtpItem.setPt(8);  
993 - sendRtpItem.setUsePs(false);  
994 - sendRtpItem.setOnlyAudio(true);  
995 - redisCatchStorage.updateSendRTPSever(sendRtpItem); 1002 + CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME);
  1003 + sendRtpItem.setPlayType(InviteStreamType.PLAY);
  1004 + sendRtpItem.setCallId(callIdHeader.getCallId());
  1005 + sendRtpItem.setPlatformId(requesterId);
  1006 + sendRtpItem.setStatus(1);
  1007 + sendRtpItem.setApp(app);
  1008 + sendRtpItem.setStreamId(stream);
  1009 + sendRtpItem.setPt(8);
  1010 + sendRtpItem.setUsePs(false);
  1011 + sendRtpItem.setOnlyAudio(true);
  1012 + redisCatchStorage.updateSendRTPSever(sendRtpItem);
996 1013
997 - Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, app, stream);  
998 - if (streamReady) {  
999 - sendOk(device, sendRtpItem, sdp, serverTransaction, mediaServerItem, mediaTransmissionTCP, ssrc);  
1000 - }else {  
1001 - logger.warn("[语音通话], 未发现待推送的流,app={},stream={}", app, stream);  
1002 - playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId()); 1014 + Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, app, stream);
  1015 + if (streamReady) {
  1016 + sendOk(device, sendRtpItem, sdp, serverTransaction, mediaServerItem, mediaTransmissionTCP, ssrc);
  1017 + }else {
  1018 + logger.warn("[语音通话], 未发现待推送的流,app={},stream={}", app, stream);
  1019 + playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId());
  1020 + }
  1021 + } catch (SdpException e) {
  1022 + logger.error("[SDP解析异常]", e);
1003 } 1023 }
1004 } else { 1024 } else {
1005 logger.warn("来自无效设备/平台的请求"); 1025 logger.warn("来自无效设备/平台的请求");
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -11,7 +11,6 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; @@ -11,7 +11,6 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
11 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; 11 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
12 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 12 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
13 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 13 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
14 -import com.genersoft.iot.vmp.gb28181.utils.Coordtransform;  
15 import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; 14 import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
16 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 15 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
17 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; 16 import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItemLite.java
@@ -38,8 +38,6 @@ public class MediaServerItemLite { @@ -38,8 +38,6 @@ public class MediaServerItemLite {
38 38
39 private String secret; 39 private String secret;
40 40
41 - private int streamNoneReaderDelayMS;  
42 -  
43 private int hookAliveInterval; 41 private int hookAliveInterval;
44 42
45 private int recordAssistPort; 43 private int recordAssistPort;
@@ -60,9 +58,7 @@ public class MediaServerItemLite { @@ -60,9 +58,7 @@ public class MediaServerItemLite {
60 this.rtspPort = mediaServerItem.getRtspPort(); 58 this.rtspPort = mediaServerItem.getRtspPort();
61 this.rtspSSLPort = mediaServerItem.getRtspSSLPort(); 59 this.rtspSSLPort = mediaServerItem.getRtspSSLPort();
62 this.secret = mediaServerItem.getSecret(); 60 this.secret = mediaServerItem.getSecret();
63 - this.streamNoneReaderDelayMS = mediaServerItem.getStreamNoneReaderDelayMS();  
64 this.hookAliveInterval = mediaServerItem.getHookAliveInterval(); 61 this.hookAliveInterval = mediaServerItem.getHookAliveInterval();
65 - this.streamNoneReaderDelayMS = mediaServerItem.getStreamNoneReaderDelayMS();  
66 this.recordAssistPort = mediaServerItem.getRecordAssistPort(); 62 this.recordAssistPort = mediaServerItem.getRecordAssistPort();
67 } 63 }
68 64
@@ -171,14 +167,6 @@ public class MediaServerItemLite { @@ -171,14 +167,6 @@ public class MediaServerItemLite {
171 this.secret = secret; 167 this.secret = secret;
172 } 168 }
173 169
174 - public int getStreamNoneReaderDelayMS() {  
175 - return streamNoneReaderDelayMS;  
176 - }  
177 -  
178 - public void setStreamNoneReaderDelayMS(int streamNoneReaderDelayMS) {  
179 - this.streamNoneReaderDelayMS = streamNoneReaderDelayMS;  
180 - }  
181 -  
182 public int getHookAliveInterval() { 170 public int getHookAliveInterval() {
183 return hookAliveInterval; 171 return hookAliveInterval;
184 } 172 }