|
@ -16,10 +16,10 @@ import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; |
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
|
|
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
|
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
|
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
|
|
import com.genersoft.iot.vmp.service.IMediaServerService; |
|
|
import com.genersoft.iot.vmp.service.IMediaServerService; |
|
|
|
|
|
import com.genersoft.iot.vmp.service.bean.PlayBackCallback; |
|
|
import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
|
|
import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
|
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
|
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
|
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
|
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
|
|
import com.genersoft.iot.vmp.utils.redis.RedisUtil; |
|
|
|
|
|
import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
|
|
import com.genersoft.iot.vmp.vmanager.bean.WVPResult; |
|
|
import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; |
|
|
import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult; |
|
|
import com.genersoft.iot.vmp.service.IMediaService; |
|
|
import com.genersoft.iot.vmp.service.IMediaService; |
|
@ -53,9 +53,6 @@ public class PlayServiceImpl implements IPlayService { |
|
|
@Autowired |
|
|
@Autowired |
|
|
private IRedisCatchStorage redisCatchStorage; |
|
|
private IRedisCatchStorage redisCatchStorage; |
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private RedisUtil redis; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
@Autowired |
|
|
private DeferredResultHolder resultHolder; |
|
|
private DeferredResultHolder resultHolder; |
|
|
|
|
|
|
|
@ -104,19 +101,21 @@ public class PlayServiceImpl implements IPlayService { |
|
|
logger.warn(String.format("设备点播超时,deviceId:%s ,channelId:%s", deviceId, channelId)); |
|
|
logger.warn(String.format("设备点播超时,deviceId:%s ,channelId:%s", deviceId, channelId)); |
|
|
WVPResult wvpResult = new WVPResult(); |
|
|
WVPResult wvpResult = new WVPResult(); |
|
|
wvpResult.setCode(-1); |
|
|
wvpResult.setCode(-1); |
|
|
SIPDialog dialog = streamSession.getDialog(deviceId, channelId); |
|
|
SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, streamInfo.getStream()); |
|
|
if (dialog != null) { |
|
|
if (dialog != null) { |
|
|
wvpResult.setMsg("收流超时,请稍候重试"); |
|
|
wvpResult.setMsg("收流超时,请稍候重试"); |
|
|
}else { |
|
|
}else { |
|
|
wvpResult.setMsg("点播超时,请稍候重试"); |
|
|
wvpResult.setMsg("点播超时,请稍候重试"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
msg.setData(wvpResult); |
|
|
msg.setData(wvpResult); |
|
|
// 点播超时回复BYE
|
|
|
// 点播超时回复BYE
|
|
|
cmder.streamByeCmd(device.getDeviceId(), channelId); |
|
|
cmder.streamByeCmd(device.getDeviceId(), channelId, streamInfo.getStream()); |
|
|
// 释放rtpserver
|
|
|
// 释放rtpserver
|
|
|
mediaServerService.closeRTPServer(playResult.getDevice(), channelId); |
|
|
mediaServerService.closeRTPServer(playResult.getDevice(), channelId, streamInfo.getStream()); |
|
|
// 回复之前所有的点播请求
|
|
|
// 回复之前所有的点播请求
|
|
|
resultHolder.invokeAllResult(msg); |
|
|
resultHolder.invokeAllResult(msg); |
|
|
|
|
|
// TODO 释放ssrc
|
|
|
}); |
|
|
}); |
|
|
result.onCompletion(()->{ |
|
|
result.onCompletion(()->{ |
|
|
// 点播结束时调用截图接口
|
|
|
// 点播结束时调用截图接口
|
|
@ -154,14 +153,12 @@ public class PlayServiceImpl implements IPlayService { |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
if (streamInfo == null) { |
|
|
if (streamInfo == null) { |
|
|
SSRCInfo ssrcInfo; |
|
|
|
|
|
String streamId = null; |
|
|
String streamId = null; |
|
|
if (mediaServerItem.isRtpEnable()) { |
|
|
if (mediaServerItem.isRtpEnable()) { |
|
|
streamId = String.format("%s_%s", device.getDeviceId(), channelId); |
|
|
streamId = String.format("%s_%s", device.getDeviceId(), channelId); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId); |
|
|
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId); |
|
|
|
|
|
|
|
|
// 发送点播消息
|
|
|
// 发送点播消息
|
|
|
cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInUse, JSONObject response) -> { |
|
|
cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInUse, JSONObject response) -> { |
|
|
logger.info("收到订阅消息: " + response.toJSONString()); |
|
|
logger.info("收到订阅消息: " + response.toJSONString()); |
|
@ -173,7 +170,7 @@ public class PlayServiceImpl implements IPlayService { |
|
|
WVPResult wvpResult = new WVPResult(); |
|
|
WVPResult wvpResult = new WVPResult(); |
|
|
wvpResult.setCode(-1); |
|
|
wvpResult.setCode(-1); |
|
|
// 点播返回sip错误
|
|
|
// 点播返回sip错误
|
|
|
mediaServerService.closeRTPServer(playResult.getDevice(), channelId); |
|
|
mediaServerService.closeRTPServer(playResult.getDevice(), channelId, ssrcInfo.getStream()); |
|
|
wvpResult.setMsg(String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg)); |
|
|
wvpResult.setMsg(String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg)); |
|
|
msg.setData(wvpResult); |
|
|
msg.setData(wvpResult); |
|
|
resultHolder.invokeAllResult(msg); |
|
|
resultHolder.invokeAllResult(msg); |
|
@ -184,7 +181,7 @@ public class PlayServiceImpl implements IPlayService { |
|
|
|
|
|
|
|
|
}); |
|
|
}); |
|
|
} else { |
|
|
} else { |
|
|
String streamId = streamInfo.getStreamId(); |
|
|
String streamId = streamInfo.getStream(); |
|
|
if (streamId == null) { |
|
|
if (streamId == null) { |
|
|
WVPResult wvpResult = new WVPResult(); |
|
|
WVPResult wvpResult = new WVPResult(); |
|
|
wvpResult.setCode(-1); |
|
|
wvpResult.setCode(-1); |
|
@ -213,18 +210,16 @@ public class PlayServiceImpl implements IPlayService { |
|
|
// TODO 点播前是否重置状态
|
|
|
// TODO 点播前是否重置状态
|
|
|
redisCatchStorage.stopPlay(streamInfo); |
|
|
redisCatchStorage.stopPlay(streamInfo); |
|
|
storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); |
|
|
storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); |
|
|
SSRCInfo ssrcInfo; |
|
|
|
|
|
String streamId2 = null; |
|
|
String streamId2 = null; |
|
|
if (mediaServerItem.isRtpEnable()) { |
|
|
if (mediaServerItem.isRtpEnable()) { |
|
|
streamId2 = String.format("%s_%s", device.getDeviceId(), channelId); |
|
|
streamId2 = String.format("%s_%s", device.getDeviceId(), channelId); |
|
|
} |
|
|
} |
|
|
ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId2); |
|
|
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId2); |
|
|
|
|
|
|
|
|
cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { |
|
|
cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { |
|
|
logger.info("收到订阅消息: " + response.toJSONString()); |
|
|
logger.info("收到订阅消息: " + response.toJSONString()); |
|
|
onPublishHandlerForPlay(mediaServerItemInuse, response, deviceId, channelId, uuid); |
|
|
onPublishHandlerForPlay(mediaServerItemInuse, response, deviceId, channelId, uuid); |
|
|
}, (event) -> { |
|
|
}, (event) -> { |
|
|
mediaServerService.closeRTPServer(playResult.getDevice(), channelId); |
|
|
mediaServerService.closeRTPServer(playResult.getDevice(), channelId, ssrcInfo.getStream()); |
|
|
WVPResult wvpResult = new WVPResult(); |
|
|
WVPResult wvpResult = new WVPResult(); |
|
|
wvpResult.setCode(-1); |
|
|
wvpResult.setCode(-1); |
|
|
wvpResult.setMsg(String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg)); |
|
|
wvpResult.setMsg(String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg)); |
|
@ -242,12 +237,12 @@ public class PlayServiceImpl implements IPlayService { |
|
|
RequestMessage msg = new RequestMessage(); |
|
|
RequestMessage msg = new RequestMessage(); |
|
|
msg.setId(uuid); |
|
|
msg.setId(uuid); |
|
|
msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId); |
|
|
msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId); |
|
|
StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId, uuid); |
|
|
StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId); |
|
|
if (streamInfo != null) { |
|
|
if (streamInfo != null) { |
|
|
DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId); |
|
|
DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId); |
|
|
if (deviceChannel != null) { |
|
|
if (deviceChannel != null) { |
|
|
deviceChannel.setStreamId(streamInfo.getStreamId()); |
|
|
deviceChannel.setStreamId(streamInfo.getStream()); |
|
|
storager.startPlay(deviceId, channelId, streamInfo.getStreamId()); |
|
|
storager.startPlay(deviceId, channelId, streamInfo.getStream()); |
|
|
} |
|
|
} |
|
|
redisCatchStorage.startPlay(streamInfo); |
|
|
redisCatchStorage.startPlay(streamInfo); |
|
|
msg.setData(JSON.toJSONString(streamInfo)); |
|
|
msg.setData(JSON.toJSONString(streamInfo)); |
|
@ -284,29 +279,53 @@ public class PlayServiceImpl implements IPlayService { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void onPublishHandlerForPlayBack(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId, String uuid) { |
|
|
public DeferredResult<ResponseEntity<String>> playBack(String deviceId, String channelId, String startTime, String endTime, PlayBackCallback callback) { |
|
|
|
|
|
String uuid = UUID.randomUUID().toString(); |
|
|
|
|
|
String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId; |
|
|
|
|
|
DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L); |
|
|
|
|
|
Device device = storager.queryVideoDevice(deviceId); |
|
|
|
|
|
if (device == null) { |
|
|
|
|
|
result.setResult(new ResponseEntity<>(HttpStatus.BAD_REQUEST)); |
|
|
|
|
|
return result; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
MediaServerItem newMediaServerItem = getNewMediaServerItem(device); |
|
|
|
|
|
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true); |
|
|
|
|
|
resultHolder.put(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId, uuid, result); |
|
|
RequestMessage msg = new RequestMessage(); |
|
|
RequestMessage msg = new RequestMessage(); |
|
|
msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId); |
|
|
|
|
|
msg.setId(uuid); |
|
|
msg.setId(uuid); |
|
|
StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId, uuid); |
|
|
msg.setKey(key); |
|
|
if (streamInfo != null) { |
|
|
result.onTimeout(()->{ |
|
|
|
|
|
msg.setData("回放超时"); |
|
|
|
|
|
callback.call(msg); |
|
|
|
|
|
}); |
|
|
|
|
|
cmder.playbackStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, (MediaServerItem mediaServerItem, JSONObject response) -> { |
|
|
|
|
|
logger.info("收到订阅消息: " + response.toJSONString()); |
|
|
|
|
|
StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId); |
|
|
|
|
|
if (streamInfo == null) { |
|
|
|
|
|
logger.warn("设备回放API调用失败!"); |
|
|
|
|
|
msg.setData("设备回放API调用失败!"); |
|
|
|
|
|
callback.call(msg); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
redisCatchStorage.startPlayback(streamInfo); |
|
|
redisCatchStorage.startPlayback(streamInfo); |
|
|
msg.setData(JSON.toJSONString(streamInfo)); |
|
|
msg.setData(JSON.toJSONString(streamInfo)); |
|
|
resultHolder.invokeResult(msg); |
|
|
callback.call(msg); |
|
|
} else { |
|
|
}, event -> { |
|
|
logger.warn("设备回放API调用失败!"); |
|
|
msg.setData(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg)); |
|
|
msg.setData("设备回放API调用失败!"); |
|
|
callback.call(msg); |
|
|
resultHolder.invokeResult(msg); |
|
|
}); |
|
|
} |
|
|
return result; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void onPublishHandlerForDownload(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, String uuid) { |
|
|
public void onPublishHandlerForDownload(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, String uuid) { |
|
|
RequestMessage msg = new RequestMessage(); |
|
|
RequestMessage msg = new RequestMessage(); |
|
|
msg.setKey(DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId); |
|
|
msg.setKey(DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId); |
|
|
msg.setId(uuid); |
|
|
msg.setId(uuid); |
|
|
StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId, uuid); |
|
|
StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId); |
|
|
if (streamInfo != null) { |
|
|
if (streamInfo != null) { |
|
|
redisCatchStorage.startDownload(streamInfo); |
|
|
redisCatchStorage.startDownload(streamInfo); |
|
|
msg.setData(JSON.toJSONString(streamInfo)); |
|
|
msg.setData(JSON.toJSONString(streamInfo)); |
|
@ -319,7 +338,7 @@ public class PlayServiceImpl implements IPlayService { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public StreamInfo onPublishHandler(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId, String uuid) { |
|
|
public StreamInfo onPublishHandler(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId) { |
|
|
String streamId = resonse.getString("stream"); |
|
|
String streamId = resonse.getString("stream"); |
|
|
JSONArray tracks = resonse.getJSONArray("tracks"); |
|
|
JSONArray tracks = resonse.getJSONArray("tracks"); |
|
|
StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(mediaServerItem,"rtp", streamId, tracks); |
|
|
StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(mediaServerItem,"rtp", streamId, tracks); |
|
|