|
@@ -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.IPlayService;
|
|
|
|
|
-import com.genersoft.iot.vmp.service.IStreamProxyService;
|
|
|
|
|
-import com.genersoft.iot.vmp.service.IStreamPushService;
|
|
|
|
|
|
|
+import com.genersoft.iot.vmp.service.*;
|
|
|
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 {
|
|
|
|
|
- sendRtpItem.setPlayType(InviteStreamType.PLAY);
|
|
|
|
|
- sendRtpItem.setPlayType(InviteStreamType.PLAY);
|
|
|
|
|
-// SsrcTransaction playTransaction = sessionManager.getSsrcTransaction(device.getDeviceId(), channelId, "play", null);
|
|
|
|
|
- StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId);
|
|
|
|
|
- if (streamInfo != null) {
|
|
|
|
|
- Boolean streamReady = zlmServerFactory.isStreamReady(mediaServerItem, streamInfo.getApp(), streamInfo.getStream());
|
|
|
|
|
- if (!streamReady) {
|
|
|
|
|
- redisCatchStorage.stopPlay(streamInfo);
|
|
|
|
|
- storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
|
|
|
|
|
- streamInfo = null;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ } else if ("Download".equalsIgnoreCase(sessionName)) {
|
|
|
|
|
+ // 获取指定的下载速度
|
|
|
|
|
+ Vector sdpMediaDescriptions = sdp.getMediaDescriptions(true);
|
|
|
|
|
+ MediaDescription mediaDescription = null;
|
|
|
|
|
+ String downloadSpeed = "1";
|
|
|
|
|
+ if (sdpMediaDescriptions.size() > 0) {
|
|
|
|
|
+ mediaDescription = (MediaDescription) sdpMediaDescriptions.get(0);
|
|
|
}
|
|
}
|
|
|
- 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, 超时时回复
|
|
|
|
|
- redisCatchStorage.updateSendRTPSever(sendRtpItem);
|
|
|
|
|
- MediaServerItem finalMediaServerItem = mediaServerItem;
|
|
|
|
|
- playService.play(mediaServerItem, ssrcInfo, device, channelId, hookEvent, errorEvent, (code, msg) -> {
|
|
|
|
|
|
|
+ if (mediaDescription != null) {
|
|
|
|
|
+ downloadSpeed = mediaDescription.getAttribute("downloadspeed");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ sendRtpItem.setPlayType(InviteStreamType.DOWNLOAD);
|
|
|
|
|
+ SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, null, device.isSsrcCheck(), true, 0, false, device.getStreamModeForParam());
|
|
|
|
|
+ sendRtpItem.setStreamId(ssrcInfo.getStream());
|
|
|
|
|
+ // 写入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);
|
|
|
- });
|
|
|
|
|
- } else {
|
|
|
|
|
- // 当前系统作为下级平台使用,当上级平台点播时不携带ssrc时,并且设备在当前系统中已经点播了。这个时候需要重新给生成一个ssrc,不使用默认的"0000000000"。
|
|
|
|
|
- sendRtpItem.setSsrc(ssrc);
|
|
|
|
|
- sendRtpItem.setStreamId(playTransaction.getStream());
|
|
|
|
|
- // 写入redis, 超时时回复
|
|
|
|
|
- redisCatchStorage.updateSendRTPSever(sendRtpItem);
|
|
|
|
|
- JSONObject jsonObject = new JSONObject();
|
|
|
|
|
- jsonObject.put("app", sendRtpItem.getApp());
|
|
|
|
|
- jsonObject.put("stream", sendRtpItem.getStreamId());
|
|
|
|
|
- hookEvent.response(mediaServerItem, jsonObject);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ errorEvent.run(code, msg, data);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ errorEvent.run(code, msg, data);
|
|
|
|
|
+ }
|
|
|
|
|
+ }));
|
|
|
|
|
+ sendRtpItem.setPlayType(InviteStreamType.PLAY);
|
|
|
|
|
+ String streamId = String.format("%s_%s", device.getDeviceId(), channelId);
|
|
|
|
|
+ sendRtpItem.setStreamId(streamId);
|
|
|
|
|
+ sendRtpItem.setSsrc(ssrcInfo.getSsrc());
|
|
|
|
|
+ redisCatchStorage.updateSendRTPSever(sendRtpItem);
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
} else if (gbStream != null) {
|
|
} else if (gbStream != null) {
|
|
|
|
|
|