优化国标级联录像预览
This commit is contained in:
@@ -48,7 +48,7 @@ public interface IMediaServerService {
|
||||
|
||||
SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId, boolean isPlayback);
|
||||
|
||||
void closeRTPServer(Device device, String channelId, String ssrc);
|
||||
void closeRTPServer(String deviceId, String channelId, String ssrc);
|
||||
|
||||
void clearRTPServer(MediaServerItem mediaServerItem);
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
package com.genersoft.iot.vmp.service.bean;
|
||||
|
||||
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
|
||||
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
|
||||
|
||||
public interface PlayBackCallback {
|
||||
|
||||
void call(RequestMessage msg);
|
||||
void call(PlayBackResult<RequestMessage> msg);
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.genersoft.iot.vmp.service.bean;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
||||
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
||||
|
||||
import javax.sip.RequestEvent;
|
||||
|
||||
public class PlayBackResult<T> {
|
||||
private int code;
|
||||
private T data;
|
||||
private MediaServerItem mediaServerItem;
|
||||
private JSONObject response;
|
||||
private SipSubscribe.EventResult event;
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public void setCode(int code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public T getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(T data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public MediaServerItem getMediaServerItem() {
|
||||
return mediaServerItem;
|
||||
}
|
||||
|
||||
public void setMediaServerItem(MediaServerItem mediaServerItem) {
|
||||
this.mediaServerItem = mediaServerItem;
|
||||
}
|
||||
|
||||
public JSONObject getResponse() {
|
||||
return response;
|
||||
}
|
||||
|
||||
public void setResponse(JSONObject response) {
|
||||
this.response = response;
|
||||
}
|
||||
|
||||
public SipSubscribe.EventResult getEvent() {
|
||||
return event;
|
||||
}
|
||||
|
||||
public void setEvent(SipSubscribe.EventResult event) {
|
||||
this.event = event;
|
||||
}
|
||||
}
|
||||
@@ -160,16 +160,16 @@ public class MediaServerServiceImpl implements IMediaServerService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeRTPServer(Device device, String channelId, String stream) {
|
||||
String mediaServerId = streamSession.getMediaServerId(device.getDeviceId(), channelId, stream);
|
||||
String ssrc = streamSession.getSSRC(device.getDeviceId(), channelId, stream);
|
||||
public void closeRTPServer(String deviceId, String channelId, String stream) {
|
||||
String mediaServerId = streamSession.getMediaServerId(deviceId, channelId, stream);
|
||||
String ssrc = streamSession.getSSRC(deviceId, channelId, stream);
|
||||
MediaServerItem mediaServerItem = this.getOne(mediaServerId);
|
||||
if (mediaServerItem != null) {
|
||||
String streamId = String.format("%s_%s", device.getDeviceId(), channelId);
|
||||
String streamId = String.format("%s_%s", deviceId, channelId);
|
||||
zlmrtpServerFactory.closeRTPServer(mediaServerItem, streamId);
|
||||
releaseSsrc(mediaServerItem, ssrc);
|
||||
}
|
||||
streamSession.remove(device.getDeviceId(), channelId, stream);
|
||||
streamSession.remove(deviceId, channelId, stream);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,6 +17,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
|
||||
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
||||
import com.genersoft.iot.vmp.service.IMediaServerService;
|
||||
import com.genersoft.iot.vmp.service.bean.PlayBackCallback;
|
||||
import com.genersoft.iot.vmp.service.bean.PlayBackResult;
|
||||
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
||||
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||
@@ -115,11 +116,8 @@ public class PlayServiceImpl implements IPlayService {
|
||||
msg.setData(wvpResult);
|
||||
// 点播超时回复BYE
|
||||
cmder.streamByeCmd(device.getDeviceId(), channelId, streamInfo.getStream());
|
||||
// 释放rtpserver
|
||||
mediaServerService.closeRTPServer(playResult.getDevice(), channelId, streamInfo.getStream());
|
||||
// 回复之前所有的点播请求
|
||||
resultHolder.invokeAllResult(msg);
|
||||
// TODO 释放ssrc
|
||||
});
|
||||
result.onCompletion(()->{
|
||||
// 点播结束时调用截图接口
|
||||
@@ -173,7 +171,10 @@ public class PlayServiceImpl implements IPlayService {
|
||||
WVPResult wvpResult = new WVPResult();
|
||||
wvpResult.setCode(-1);
|
||||
// 点播返回sip错误
|
||||
mediaServerService.closeRTPServer(playResult.getDevice(), channelId, ssrcInfo.getStream());
|
||||
mediaServerService.closeRTPServer(playResult.getDevice().getDeviceId(), channelId, ssrcInfo.getStream());
|
||||
// 释放ssrc
|
||||
mediaServerService.releaseSsrc(mediaServerItem, ssrcInfo.getSsrc());
|
||||
streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
|
||||
wvpResult.setMsg(String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg));
|
||||
msg.setData(wvpResult);
|
||||
resultHolder.invokeAllResult(msg);
|
||||
@@ -222,7 +223,10 @@ public class PlayServiceImpl implements IPlayService {
|
||||
logger.info("收到订阅消息: " + response.toJSONString());
|
||||
onPublishHandlerForPlay(mediaServerItemInuse, response, deviceId, channelId, uuid);
|
||||
}, (event) -> {
|
||||
mediaServerService.closeRTPServer(playResult.getDevice(), channelId, ssrcInfo.getStream());
|
||||
mediaServerService.closeRTPServer(playResult.getDevice().getDeviceId(), channelId, ssrcInfo.getStream());
|
||||
// 释放ssrc
|
||||
mediaServerService.releaseSsrc(mediaServerItem, ssrcInfo.getSsrc());
|
||||
streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
|
||||
WVPResult wvpResult = new WVPResult();
|
||||
wvpResult.setCode(-1);
|
||||
wvpResult.setMsg(String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg));
|
||||
@@ -240,7 +244,7 @@ public class PlayServiceImpl implements IPlayService {
|
||||
RequestMessage msg = new RequestMessage();
|
||||
msg.setId(uuid);
|
||||
msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId);
|
||||
StreamInfo streamInfo = onPublishHandler(mediaServerItem, resonse, deviceId, channelId);
|
||||
StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId);
|
||||
if (streamInfo != null) {
|
||||
DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
|
||||
if (deviceChannel != null) {
|
||||
@@ -298,9 +302,12 @@ public class PlayServiceImpl implements IPlayService {
|
||||
RequestMessage msg = new RequestMessage();
|
||||
msg.setId(uuid);
|
||||
msg.setKey(key);
|
||||
PlayBackResult<RequestMessage> playBackResult = new PlayBackResult<>();
|
||||
result.onTimeout(()->{
|
||||
msg.setData("回放超时");
|
||||
callback.call(msg);
|
||||
playBackResult.setCode(-1);
|
||||
playBackResult.setData(msg);
|
||||
callback.call(playBackResult);
|
||||
});
|
||||
cmder.playbackStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, (MediaServerItem mediaServerItem, JSONObject response) -> {
|
||||
logger.info("收到订阅消息: " + response.toJSONString());
|
||||
@@ -308,15 +315,24 @@ public class PlayServiceImpl implements IPlayService {
|
||||
if (streamInfo == null) {
|
||||
logger.warn("设备回放API调用失败!");
|
||||
msg.setData("设备回放API调用失败!");
|
||||
callback.call(msg);
|
||||
playBackResult.setCode(-1);
|
||||
playBackResult.setData(msg);
|
||||
callback.call(playBackResult);
|
||||
return;
|
||||
}
|
||||
redisCatchStorage.startPlayback(streamInfo);
|
||||
msg.setData(JSON.toJSONString(streamInfo));
|
||||
callback.call(msg);
|
||||
playBackResult.setCode(0);
|
||||
playBackResult.setData(msg);
|
||||
playBackResult.setMediaServerItem(mediaServerItem);
|
||||
playBackResult.setResponse(response);
|
||||
callback.call(playBackResult);
|
||||
}, event -> {
|
||||
msg.setData(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg));
|
||||
callback.call(msg);
|
||||
playBackResult.setCode(-1);
|
||||
playBackResult.setData(msg);
|
||||
playBackResult.setEvent(event);
|
||||
callback.call(playBackResult);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user