合并主线

结构优化
648540858 2022-10-17 17:02:16 +08:00
parent 82fd369ce5
commit f6320c7dd3
4 changed files with 92 additions and 85 deletions

View File

@ -1,4 +1,4 @@
alter table wvp.media_server alter table media_server
drop column streamNoneReaderDelayMS; drop column streamNoneReaderDelayMS;
alter table stream_proxy alter table stream_proxy

View File

@ -896,7 +896,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(requesterId, channelId); AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(requesterId, channelId);
if (audioBroadcastCatch == null) { if (audioBroadcastCatch == null) {
logger.warn("来自设备的Invite请求非语音广播已忽略requesterId {}/{}", requesterId, channelId); logger.warn("来自设备的Invite请求非语音广播已忽略requesterId {}/{}", requesterId, channelId);
responseAck(serverTransaction, Response.FORBIDDEN); try {
responseAck(serverTransaction, Response.FORBIDDEN);
} catch (SipException | InvalidArgumentException | ParseException e) {
logger.error("[命令发送失败] 来自设备的Invite请求非语音广播 FORBIDDEN: {}", e.getMessage());
}
return; return;
} }
Request request = serverTransaction.getRequest(); Request request = serverTransaction.getRequest();
@ -920,86 +924,102 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
if (ssrcIndex > 0) { if (ssrcIndex > 0) {
substring = contentString.substring(0, ssrcIndex); substring = contentString.substring(0, ssrcIndex);
} }
SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring); try {
SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
// 获取支持的格式 // 获取支持的格式
Vector mediaDescriptions = sdp.getMediaDescriptions(true); Vector mediaDescriptions = sdp.getMediaDescriptions(true);
// 查看是否支持PS 负载96 // 查看是否支持PS 负载96
int port = -1; int port = -1;
boolean mediaTransmissionTCP = false; boolean mediaTransmissionTCP = false;
Boolean tcpActive = null; Boolean tcpActive = null;
for (int i = 0; i < mediaDescriptions.size(); i++) { for (int i = 0; i < mediaDescriptions.size(); i++) {
MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i); MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i);
Media media = mediaDescription.getMedia(); Media media = mediaDescription.getMedia();
Vector mediaFormats = media.getMediaFormats(false); Vector mediaFormats = media.getMediaFormats(false);
if (mediaFormats.contains("8")) { if (mediaFormats.contains("8")) {
port = media.getMediaPort(); port = media.getMediaPort();
String protocol = media.getProtocol(); String protocol = media.getProtocol();
// 区分TCP发流还是udp 当前默认udp // 区分TCP发流还是udp 当前默认udp
if ("TCP/RTP/AVP".equals(protocol)) { if ("TCP/RTP/AVP".equals(protocol)) {
String setup = mediaDescription.getAttribute("setup"); String setup = mediaDescription.getAttribute("setup");
if (setup != null) { if (setup != null) {
mediaTransmissionTCP = true; mediaTransmissionTCP = true;
if ("active".equals(setup)) { if ("active".equals(setup)) {
tcpActive = true; tcpActive = true;
} else if ("passive".equals(setup)) { } else if ("passive".equals(setup)) {
tcpActive = false; tcpActive = false;
}
} }
} }
break;
} }
break;
} }
} if (port == -1) {
if (port == -1) { logger.info("不支持的媒体格式返回415");
logger.info("不支持的媒体格式返回415"); // 回复不支持的格式
// 回复不支持的格式 try {
responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE); // 不支持的格式发415 responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE); // 不支持的格式发415
return; } catch (SipException | InvalidArgumentException | ParseException e) {
} logger.error("[命令发送失败] invite 不支持的媒体格式: {}", e.getMessage());
String addressStr = sdp.getOrigin().getAddress(); }
logger.info("设备{}请求语音流,地址:{}:{}ssrc{}", requesterId, addressStr, port, ssrc); return;
}
String addressStr = sdp.getOrigin().getAddress();
logger.info("设备{}请求语音流,地址:{}:{}ssrc{}", requesterId, addressStr, port, ssrc);
MediaServerItem mediaServerItem = playService.getNewMediaServerItem(device); MediaServerItem mediaServerItem = playService.getNewMediaServerItem(device);
if (mediaServerItem == null) { if (mediaServerItem == null) {
logger.warn("未找到可用的zlm"); logger.warn("未找到可用的zlm");
responseAck(serverTransaction, Response.BUSY_HERE); try {
return; responseAck(serverTransaction, Response.BUSY_HERE);
} } catch (SipException | InvalidArgumentException | ParseException e) {
SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId, logger.error("[命令发送失败] invite 未找到可用的zlm: {}", e.getMessage());
device.getDeviceId(), audioBroadcastCatch.getChannelId(), }
mediaTransmissionTCP); return;
if (sendRtpItem == null) { }
logger.warn("服务器端口资源不足"); SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,
responseAck(serverTransaction, Response.BUSY_HERE); device.getDeviceId(), audioBroadcastCatch.getChannelId(),
return; mediaTransmissionTCP);
} if (sendRtpItem == null) {
sendRtpItem.setTcp(mediaTransmissionTCP); logger.warn("服务器端口资源不足");
if (tcpActive != null) { try {
sendRtpItem.setTcpActive(tcpActive); responseAck(serverTransaction, Response.BUSY_HERE);
} } catch (SipException | InvalidArgumentException | ParseException e) {
String app = "broadcast"; logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage());
String stream = device.getDeviceId() + "_" + audioBroadcastCatch.getChannelId(); }
return;
}
sendRtpItem.setTcp(mediaTransmissionTCP);
if (tcpActive != null) {
sendRtpItem.setTcpActive(tcpActive);
}
String app = "broadcast";
String stream = device.getDeviceId() + "_" + audioBroadcastCatch.getChannelId();
CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME); CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME);
sendRtpItem.setPlayType(InviteStreamType.PLAY); sendRtpItem.setPlayType(InviteStreamType.PLAY);
sendRtpItem.setCallId(callIdHeader.getCallId()); sendRtpItem.setCallId(callIdHeader.getCallId());
sendRtpItem.setPlatformId(requesterId); sendRtpItem.setPlatformId(requesterId);
sendRtpItem.setStatus(1); sendRtpItem.setStatus(1);
sendRtpItem.setApp(app); sendRtpItem.setApp(app);
sendRtpItem.setStreamId(stream); sendRtpItem.setStreamId(stream);
sendRtpItem.setPt(8); sendRtpItem.setPt(8);
sendRtpItem.setUsePs(false); sendRtpItem.setUsePs(false);
sendRtpItem.setOnlyAudio(true); sendRtpItem.setOnlyAudio(true);
redisCatchStorage.updateSendRTPSever(sendRtpItem); redisCatchStorage.updateSendRTPSever(sendRtpItem);
Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, app, stream); Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, app, stream);
if (streamReady) { if (streamReady) {
sendOk(device, sendRtpItem, sdp, serverTransaction, mediaServerItem, mediaTransmissionTCP, ssrc); sendOk(device, sendRtpItem, sdp, serverTransaction, mediaServerItem, mediaTransmissionTCP, ssrc);
}else { }else {
logger.warn("[语音通话] 未发现待推送的流,app={},stream={}", app, stream); logger.warn("[语音通话] 未发现待推送的流,app={},stream={}", app, stream);
playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId()); playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId());
}
} catch (SdpException e) {
logger.error("[SDP解析异常]", e);
} }
} else { } else {
logger.warn("来自无效设备/平台的请求"); logger.warn("来自无效设备/平台的请求");

View File

@ -11,7 +11,6 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 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.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.utils.Coordtransform;
import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;

View File

@ -38,8 +38,6 @@ public class MediaServerItemLite {
private String secret; private String secret;
private int streamNoneReaderDelayMS;
private int hookAliveInterval; private int hookAliveInterval;
private int recordAssistPort; private int recordAssistPort;
@ -60,9 +58,7 @@ public class MediaServerItemLite {
this.rtspPort = mediaServerItem.getRtspPort(); this.rtspPort = mediaServerItem.getRtspPort();
this.rtspSSLPort = mediaServerItem.getRtspSSLPort(); this.rtspSSLPort = mediaServerItem.getRtspSSLPort();
this.secret = mediaServerItem.getSecret(); this.secret = mediaServerItem.getSecret();
this.streamNoneReaderDelayMS = mediaServerItem.getStreamNoneReaderDelayMS();
this.hookAliveInterval = mediaServerItem.getHookAliveInterval(); this.hookAliveInterval = mediaServerItem.getHookAliveInterval();
this.streamNoneReaderDelayMS = mediaServerItem.getStreamNoneReaderDelayMS();
this.recordAssistPort = mediaServerItem.getRecordAssistPort(); this.recordAssistPort = mediaServerItem.getRecordAssistPort();
} }
@ -171,14 +167,6 @@ public class MediaServerItemLite {
this.secret = secret; this.secret = secret;
} }
public int getStreamNoneReaderDelayMS() {
return streamNoneReaderDelayMS;
}
public void setStreamNoneReaderDelayMS(int streamNoneReaderDelayMS) {
this.streamNoneReaderDelayMS = streamNoneReaderDelayMS;
}
public int getHookAliveInterval() { public int getHookAliveInterval() {
return hookAliveInterval; return hookAliveInterval;
} }