优化国标点播下级平台,ssrc更新的时因为旧的端口释放慢导致点播失败的问题,使用新的接口直接更新ssrc
This commit is contained in:
parent
c9757ca645
commit
37a455017d
@ -25,6 +25,8 @@ public class ZLMRESTfulUtils {
|
|||||||
|
|
||||||
private OkHttpClient client;
|
private OkHttpClient client;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public interface RequestCallback{
|
public interface RequestCallback{
|
||||||
void run(JSONObject response);
|
void run(JSONObject response);
|
||||||
}
|
}
|
||||||
@ -354,4 +356,11 @@ public class ZLMRESTfulUtils {
|
|||||||
param.put("stream_id", stream_id);
|
param.put("stream_id", stream_id);
|
||||||
return sendPost(mediaServerItem, "connectRtpServer",param, null);
|
return sendPost(mediaServerItem, "connectRtpServer",param, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JSONObject updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc) {
|
||||||
|
Map<String, Object> param = new HashMap<>(1);
|
||||||
|
param.put("ssrc", ssrc);
|
||||||
|
param.put("stream_id", streamId);
|
||||||
|
return sendPost(mediaServerItem, "updateRtpServerSSRC",param, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -386,4 +386,19 @@ public class ZLMRTPServerFactory {
|
|||||||
public void closeAllSendRtpStream() {
|
public void closeAllSendRtpStream() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc) {
|
||||||
|
boolean result = false;
|
||||||
|
JSONObject jsonObject = zlmresTfulUtils.updateRtpServerSSRC(mediaServerItem, streamId, ssrc);
|
||||||
|
if (jsonObject == null) {
|
||||||
|
logger.error("[更新RTPServer] 失败: 请检查ZLM服务");
|
||||||
|
} else if (jsonObject.getInteger("code") == 0) {
|
||||||
|
result= true;
|
||||||
|
logger.info("[更新RTPServer] 成功");
|
||||||
|
} else {
|
||||||
|
logger.error("[更新RTPServer] 失败: {}, streamId:{},ssrc:{}->\r\n{}",jsonObject.getString("msg"),
|
||||||
|
streamId, ssrc, jsonObject);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,7 @@ public interface IMediaServerService {
|
|||||||
void closeRTPServer(MediaServerItem mediaServerItem, String streamId);
|
void closeRTPServer(MediaServerItem mediaServerItem, String streamId);
|
||||||
|
|
||||||
void closeRTPServer(MediaServerItem mediaServerItem, String streamId, CommonCallback<Boolean> callback);
|
void closeRTPServer(MediaServerItem mediaServerItem, String streamId, CommonCallback<Boolean> callback);
|
||||||
|
Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc);
|
||||||
|
|
||||||
void closeRTPServer(String mediaServerId, String streamId);
|
void closeRTPServer(String mediaServerId, String streamId);
|
||||||
|
|
||||||
|
@ -180,6 +180,11 @@ public class MediaServerServiceImpl implements IMediaServerService {
|
|||||||
closeRTPServer(mediaServerItem, streamId);
|
closeRTPServer(mediaServerItem, streamId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc) {
|
||||||
|
return zlmrtpServerFactory.updateRtpServerSSRC(mediaServerItem, streamId, ssrc);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void releaseSsrc(String mediaServerItemId, String ssrc) {
|
public void releaseSsrc(String mediaServerItemId, String ssrc) {
|
||||||
MediaServerItem mediaServerItem = getOne(mediaServerItemId);
|
MediaServerItem mediaServerItem = getOne(mediaServerItemId);
|
||||||
|
@ -143,7 +143,7 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
if (rtpInfo.getBoolean("exist")) {
|
if (rtpInfo.getBoolean("exist")) {
|
||||||
int localPort = rtpInfo.getInteger("local_port");
|
int localPort = rtpInfo.getInteger("local_port");
|
||||||
if (localPort == 0) {
|
if (localPort == 0) {
|
||||||
logger.warn("[点播],点播时发现rtpServerC存在,但是尚未开始推流");
|
logger.warn("[点播],点播时发现rtpServer存在,但是尚未开始推流");
|
||||||
// 此时说明rtpServer已经创建但是流还没有推上来
|
// 此时说明rtpServer已经创建但是流还没有推上来
|
||||||
WVPResult wvpResult = new WVPResult();
|
WVPResult wvpResult = new WVPResult();
|
||||||
wvpResult.setCode(ErrorCode.ERROR100.getCode());
|
wvpResult.setCode(ErrorCode.ERROR100.getCode());
|
||||||
@ -228,7 +228,7 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
|
ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
|
||||||
InviteTimeOutCallback timeoutCallback) {
|
InviteTimeOutCallback timeoutCallback) {
|
||||||
|
|
||||||
logger.info("[点播开始] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
|
logger.info("[点播开始] deviceId: {}, channelId: {},收流端口:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
|
||||||
// 超时处理
|
// 超时处理
|
||||||
String timeOutTaskKey = UUID.randomUUID().toString();
|
String timeOutTaskKey = UUID.randomUUID().toString();
|
||||||
dynamicTask.startDelay(timeOutTaskKey, () -> {
|
dynamicTask.startDelay(timeOutTaskKey, () -> {
|
||||||
@ -352,30 +352,50 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
hookEvent.response(mediaServerItemInUse, response);
|
hookEvent.response(mediaServerItemInUse, response);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// 关闭rtp server
|
|
||||||
mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
|
|
||||||
if (result) {
|
|
||||||
// 重新开启ssrc server
|
|
||||||
mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, ssrcInfo.getPort(), true, device.getStreamModeForParam());
|
|
||||||
}else {
|
|
||||||
try {
|
|
||||||
logger.warn("[停止点播] {}/{}", device.getDeviceId(), channelId);
|
|
||||||
cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null, null);
|
|
||||||
} catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
|
|
||||||
logger.error("[命令发送失败] 停止点播, 发送BYE: {}", e.getMessage());
|
|
||||||
throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
dynamicTask.stop(timeOutTaskKey);
|
Boolean result = mediaServerService.updateRtpServerSSRC(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse);
|
||||||
// 释放ssrc
|
if (!result) {
|
||||||
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
try {
|
||||||
|
logger.warn("[停止点播] {}/{}", device.getDeviceId(), channelId);
|
||||||
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null, null);
|
||||||
event.msg = "下级自定义了ssrc,重新设置收流信息失败";
|
} catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
|
||||||
event.statusCode = 500;
|
logger.error("[命令发送失败] 停止点播, 发送BYE: {}", e.getMessage());
|
||||||
errorEvent.response(event);
|
throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
dynamicTask.stop(timeOutTaskKey);
|
||||||
|
// 释放ssrc
|
||||||
|
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
||||||
|
|
||||||
|
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
||||||
|
event.msg = "下级自定义了ssrc,重新设置收流信息失败";
|
||||||
|
event.statusCode = 500;
|
||||||
|
errorEvent.response(event);
|
||||||
|
}
|
||||||
|
// // 关闭rtp server
|
||||||
|
// mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
|
||||||
|
// if (result) {
|
||||||
|
// // 重新开启ssrc server
|
||||||
|
// mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, ssrcInfo.getPort(), true, device.getStreamModeForParam());
|
||||||
|
// }else {
|
||||||
|
// try {
|
||||||
|
// logger.warn("[停止点播] {}/{}", device.getDeviceId(), channelId);
|
||||||
|
// cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null, null);
|
||||||
|
// } catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
|
||||||
|
// logger.error("[命令发送失败] 停止点播, 发送BYE: {}", e.getMessage());
|
||||||
|
// throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// dynamicTask.stop(timeOutTaskKey);
|
||||||
|
// // 释放ssrc
|
||||||
|
// mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
||||||
|
//
|
||||||
|
// streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
||||||
|
// event.msg = "下级自定义了ssrc,重新设置收流信息失败";
|
||||||
|
// event.statusCode = 500;
|
||||||
|
// errorEvent.response(event);
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -519,7 +539,7 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
if (device == null) {
|
if (device == null) {
|
||||||
throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备: " + deviceId + "不存在");
|
throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备: " + deviceId + "不存在");
|
||||||
}
|
}
|
||||||
logger.info("[回放消息] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
|
logger.info("[回放消息] deviceId: {}, channelId: {},收流端口:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
|
||||||
PlayBackResult<StreamInfo> playBackResult = new PlayBackResult<>();
|
PlayBackResult<StreamInfo> playBackResult = new PlayBackResult<>();
|
||||||
String playBackTimeOutTaskKey = UUID.randomUUID().toString();
|
String playBackTimeOutTaskKey = UUID.randomUUID().toString();
|
||||||
dynamicTask.startDelay(playBackTimeOutTaskKey, () -> {
|
dynamicTask.startDelay(playBackTimeOutTaskKey, () -> {
|
||||||
@ -689,7 +709,7 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
throw new ControllerException(ErrorCode.ERROR400.getCode(), "设备:" + deviceId + "不存在");
|
throw new ControllerException(ErrorCode.ERROR400.getCode(), "设备:" + deviceId + "不存在");
|
||||||
}
|
}
|
||||||
PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>();
|
PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>();
|
||||||
logger.info("[录像下载] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
|
logger.info("[录像下载] deviceId: {}, channelId: {},收流端口:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
|
||||||
String downLoadTimeOutTaskKey = UUID.randomUUID().toString();
|
String downLoadTimeOutTaskKey = UUID.randomUUID().toString();
|
||||||
dynamicTask.startDelay(downLoadTimeOutTaskKey, () -> {
|
dynamicTask.startDelay(downLoadTimeOutTaskKey, () -> {
|
||||||
logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId));
|
logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId));
|
||||||
|
Loading…
Reference in New Issue
Block a user