合并主线
parent
82fd369ce5
commit
f6320c7dd3
|
@ -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
|
||||||
|
|
|
@ -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("来自无效设备/平台的请求");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue