恢复级联点播

pull/1036/head
648540858 2023-08-25 09:14:38 +08:00
parent 4ae8c5ac3e
commit 760b14eaaa
1 changed files with 49 additions and 41 deletions

View File

@ -18,10 +18,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory;
import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
import com.genersoft.iot.vmp.media.zlm.dto.*; import com.genersoft.iot.vmp.media.zlm.dto.*;
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam; import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.*;
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.bean.ErrorCallback; import com.genersoft.iot.vmp.service.bean.ErrorCallback;
import com.genersoft.iot.vmp.service.bean.InviteErrorCode; import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
@ -79,6 +76,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
@Autowired @Autowired
private IRedisCatchStorage redisCatchStorage; private IRedisCatchStorage redisCatchStorage;
@Autowired
private IInviteStreamService inviteStreamService;
@Autowired @Autowired
private SSRCFactory ssrcFactory; private SSRCFactory ssrcFactory;
@ -479,47 +479,55 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
errorEvent.run(code, msg, data); errorEvent.run(code, msg, data);
} }
}); });
} else { } else if ("Download".equalsIgnoreCase(sessionName)) {
sendRtpItem.setPlayType(InviteStreamType.PLAY); // 获取指定的下载速度
sendRtpItem.setPlayType(InviteStreamType.PLAY); Vector sdpMediaDescriptions = sdp.getMediaDescriptions(true);
// SsrcTransaction playTransaction = sessionManager.getSsrcTransaction(device.getDeviceId(), channelId, "play", null); MediaDescription mediaDescription = null;
StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId); String downloadSpeed = "1";
if (streamInfo != null) { if (sdpMediaDescriptions.size() > 0) {
Boolean streamReady = zlmServerFactory.isStreamReady(mediaServerItem, streamInfo.getApp(), streamInfo.getStream()); mediaDescription = (MediaDescription) sdpMediaDescriptions.get(0);
if (!streamReady) { }
redisCatchStorage.stopPlay(streamInfo); if (mediaDescription != null) {
storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); downloadSpeed = mediaDescription.getAttribute("downloadspeed");
streamInfo = null;
}
} }
if (streamInfo == null) {
String streamId = null;
if (mediaServerItem.isRtpEnable()) {
streamId = String.format("%s_%s", device.getDeviceId(), channelId);
}
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, device.isSsrcCheck(), false, 0, false, device.getStreamModeForParam());
logger.info(JSONObject.toJSONString(ssrcInfo));
sendRtpItem.setStreamId(ssrcInfo.getStream());
sendRtpItem.setSsrc(ssrc);
// 写入redis 超时时回复 sendRtpItem.setPlayType(InviteStreamType.DOWNLOAD);
redisCatchStorage.updateSendRTPSever(sendRtpItem); SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, null, device.isSsrcCheck(), true, 0, false, device.getStreamModeForParam());
MediaServerItem finalMediaServerItem = mediaServerItem; sendRtpItem.setStreamId(ssrcInfo.getStream());
playService.play(mediaServerItem, ssrcInfo, device, channelId, hookEvent, errorEvent, (code, msg) -> { // 写入redis 超时时回复
redisCatchStorage.updateSendRTPSever(sendRtpItem);
playService.download(mediaServerItem, ssrcInfo, device.getDeviceId(), channelId, DateUtil.formatter.format(start),
DateUtil.formatter.format(end), Integer.parseInt(downloadSpeed),
(code, msg, data) -> {
if (code == InviteErrorCode.SUCCESS.getCode()) {
hookEvent.run(code, msg, data);
} else if (code == InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode() || code == InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode()) {
logger.info("[录像下载]超时, 用户:{} 通道:{}", username, channelId);
redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null);
errorEvent.run(code, msg, data);
} else {
errorEvent.run(code, msg, data);
}
});
} else {
SSRCInfo ssrcInfo = playService.play(mediaServerItem, device.getDeviceId(), channelId, ssrc, ((code, msg, data) -> {
if (code == InviteErrorCode.SUCCESS.getCode()) {
hookEvent.run(code, msg, data);
} else if (code == InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode() || code == InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode()) {
logger.info("[上级点播]超时, 用户:{} 通道:{}", username, channelId); logger.info("[上级点播]超时, 用户:{} 通道:{}", username, channelId);
redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null); redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null);
}); errorEvent.run(code, msg, data);
} else { } else {
// 当前系统作为下级平台使用当上级平台点播时不携带ssrc时并且设备在当前系统中已经点播了。这个时候需要重新给生成一个ssrc不使用默认的"0000000000"。 errorEvent.run(code, msg, data);
sendRtpItem.setSsrc(ssrc); }
sendRtpItem.setStreamId(playTransaction.getStream()); }));
// 写入redis 超时时回复 sendRtpItem.setPlayType(InviteStreamType.PLAY);
redisCatchStorage.updateSendRTPSever(sendRtpItem); String streamId = String.format("%s_%s", device.getDeviceId(), channelId);
JSONObject jsonObject = new JSONObject(); sendRtpItem.setStreamId(streamId);
jsonObject.put("app", sendRtpItem.getApp()); sendRtpItem.setSsrc(ssrcInfo.getSsrc());
jsonObject.put("stream", sendRtpItem.getStreamId()); redisCatchStorage.updateSendRTPSever(sendRtpItem);
hookEvent.response(mediaServerItem, jsonObject);
}
} }
} else if (gbStream != null) { } else if (gbStream != null) {