|
@@ -17,9 +17,11 @@ import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
|
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
|
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
|
|
|
|
+import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
|
|
|
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
|
|
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
|
|
|
import com.genersoft.iot.vmp.service.IMediaServerService;
|
|
import com.genersoft.iot.vmp.service.IMediaServerService;
|
|
|
import com.genersoft.iot.vmp.service.IPlayService;
|
|
import com.genersoft.iot.vmp.service.IPlayService;
|
|
|
|
|
+import com.genersoft.iot.vmp.service.IStreamProxyService;
|
|
|
import com.genersoft.iot.vmp.service.IStreamPushService;
|
|
import com.genersoft.iot.vmp.service.IStreamPushService;
|
|
|
import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
|
|
import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
|
|
|
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
|
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
|
@@ -65,6 +67,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
|
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private IStreamPushService streamPushService;
|
|
private IStreamPushService streamPushService;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private IStreamProxyService streamProxyService;
|
|
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private IRedisCatchStorage redisCatchStorage;
|
|
private IRedisCatchStorage redisCatchStorage;
|
|
@@ -142,6 +146,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
|
|
|
|
|
|
|
MediaServerItem mediaServerItem = null;
|
|
MediaServerItem mediaServerItem = null;
|
|
|
StreamPushItem streamPushItem = null;
|
|
StreamPushItem streamPushItem = null;
|
|
|
|
|
+ StreamProxyItem proxyByAppAndStream =null;
|
|
|
// 不是通道可能是直播流
|
|
// 不是通道可能是直播流
|
|
|
if (channel != null && gbStream == null) {
|
|
if (channel != null && gbStream == null) {
|
|
|
if (channel.getStatus() == 0) {
|
|
if (channel.getStatus() == 0) {
|
|
@@ -175,6 +180,13 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
|
|
responseAck(evt, Response.GONE);
|
|
responseAck(evt, Response.GONE);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ }else if("proxy".equals(gbStream.getStreamType())){
|
|
|
|
|
+ proxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(gbStream.getApp(), gbStream.getStream());
|
|
|
|
|
+ if (proxyByAppAndStream == null) {
|
|
|
|
|
+ logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
|
|
|
|
|
+ responseAck(evt, Response.GONE);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 通道存在,发181,呼叫转接中
|
|
responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 通道存在,发181,呼叫转接中
|
|
@@ -416,14 +428,33 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} else if (gbStream != null) {
|
|
} else if (gbStream != null) {
|
|
|
- if (streamPushItem != null && streamPushItem.isPushIng()) {
|
|
|
|
|
- // 推流状态
|
|
|
|
|
- pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
|
|
|
|
|
- mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
|
|
|
|
|
- } else {
|
|
|
|
|
- // 未推流 拉起
|
|
|
|
|
- notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
|
|
|
|
|
- mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
|
|
|
|
|
|
|
+ if("push".equals(gbStream.getStreamType())) {
|
|
|
|
|
+ if (streamPushItem != null && streamPushItem.isPushIng()) {
|
|
|
|
|
+ // 推流状态
|
|
|
|
|
+ pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
|
|
|
|
|
+ mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 未推流 拉起
|
|
|
|
|
+ notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
|
|
|
|
|
+ mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
|
|
|
|
|
+ }
|
|
|
|
|
+ }else if ("proxy".equals(gbStream.getStreamType())){
|
|
|
|
|
+ if(null != proxyByAppAndStream &&proxyByAppAndStream.isStatus()){
|
|
|
|
|
+ pushProxyStream(evt, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,
|
|
|
|
|
+ mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ //开启代理拉流
|
|
|
|
|
+ boolean start1 = streamProxyService.start(gbStream.getApp(), gbStream.getStream());
|
|
|
|
|
+ if(start1) {
|
|
|
|
|
+ pushProxyStream(evt, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,
|
|
|
|
|
+ mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ //失败后通知
|
|
|
|
|
+ notifyStreamOnline(evt, gbStream, null, platform, callIdHeader, mediaServerItem, port, tcpActive,
|
|
|
|
|
+ mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -442,7 +473,39 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
|
|
/**
|
|
/**
|
|
|
* 安排推流
|
|
* 安排推流
|
|
|
*/
|
|
*/
|
|
|
|
|
+ private void pushProxyStream(RequestEvent evt, GbStream gbStream, ParentPlatform platform,
|
|
|
|
|
+ CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
|
|
|
|
|
+ int port, Boolean tcpActive, boolean mediaTransmissionTCP,
|
|
|
|
|
+ String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException {
|
|
|
|
|
+ Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream());
|
|
|
|
|
+ if (streamReady) {
|
|
|
|
|
+ // 自平台内容
|
|
|
|
|
+ SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId,
|
|
|
|
|
+ gbStream.getApp(), gbStream.getStream(), channelId,
|
|
|
|
|
+ mediaTransmissionTCP);
|
|
|
|
|
|
|
|
|
|
+ if (sendRtpItem == null) {
|
|
|
|
|
+ logger.warn("服务器端口资源不足");
|
|
|
|
|
+ responseAck(evt, Response.BUSY_HERE);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (tcpActive != null) {
|
|
|
|
|
+ sendRtpItem.setTcpActive(tcpActive);
|
|
|
|
|
+ }
|
|
|
|
|
+ sendRtpItem.setPlayType(InviteStreamType.PUSH);
|
|
|
|
|
+ // 写入redis, 超时时回复
|
|
|
|
|
+ sendRtpItem.setStatus(1);
|
|
|
|
|
+ sendRtpItem.setCallId(callIdHeader.getCallId());
|
|
|
|
|
+ byte[] dialogByteArray = SerializeUtils.serialize(evt.getDialog());
|
|
|
|
|
+ sendRtpItem.setDialog(dialogByteArray);
|
|
|
|
|
+ byte[] transactionByteArray = SerializeUtils.serialize(evt.getServerTransaction());
|
|
|
|
|
+ sendRtpItem.setTransaction(transactionByteArray);
|
|
|
|
|
+ redisCatchStorage.updateSendRTPSever(sendRtpItem);
|
|
|
|
|
+ sendStreamAck(mediaServerItem, sendRtpItem, platform, evt);
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
private void pushStream(RequestEvent evt, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
|
|
private void pushStream(RequestEvent evt, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
|
|
|
CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
|
|
CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
|
|
|
int port, Boolean tcpActive, boolean mediaTransmissionTCP,
|
|
int port, Boolean tcpActive, boolean mediaTransmissionTCP,
|
|
@@ -487,7 +550,6 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
* 通知流上线
|
|
* 通知流上线
|
|
|
*/
|
|
*/
|