From def56793ba7c636fbbcabad38e3ac113a3764087 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 28 六月 2023 16:52:27 +0800
Subject: [PATCH] 增加上级推流和停止推流的通知
---
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 296 +++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 227 insertions(+), 69 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 123c8dd..2fbe6bb 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -11,6 +11,7 @@
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
@@ -33,17 +34,16 @@
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.utils.DateUtil;
-import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
+import javax.sdp.*;
import javax.sip.InvalidArgumentException;
import javax.sip.ResponseEvent;
import javax.sip.SipException;
@@ -52,6 +52,7 @@
import java.text.ParseException;
import java.util.List;
import java.util.UUID;
+import java.util.Vector;
@SuppressWarnings(value = {"rawtypes", "unchecked"})
@Service
@@ -102,10 +103,12 @@
@Autowired
private ZlmHttpHookSubscribe subscribe;
-
- @Qualifier("taskExecutor")
@Autowired
- private ThreadPoolTaskExecutor taskExecutor;
+ private SSRCFactory ssrcFactory;
+
+ @Autowired
+ private RedisTemplate<Object, Object> redisTemplate;
+
@Override
public void play(MediaServerItem mediaServerItem, String deviceId, String channelId,
@@ -179,7 +182,7 @@
if (mediaServerItem.isRtpEnable()) {
streamId = String.format("%s_%s", device.getDeviceId(), channelId);
}
- SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck(), false);
+ SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, device.isSsrcCheck(), false, 0, false, device.getStreamModeForParam());
if (ssrcInfo == null) {
WVPResult wvpResult = new WVPResult();
wvpResult.setCode(ErrorCode.ERROR100.getCode());
@@ -225,7 +228,14 @@
ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
InviteTimeOutCallback timeoutCallback) {
- logger.info("[鐐规挱寮�濮媇 deviceId: {}, channelId: {},鏀舵祦绔彛锛� {}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
+ logger.info("\r\n" +
+ "[鐐规挱寮�濮媇 \r\n" +
+ "deviceId : {}, \r\n" +
+ "channelId : {},\r\n" +
+ "鏀舵祦绔彛 锛歿}, \r\n" +
+ "鏀舵祦妯″紡 锛歿}, \r\n" +
+ "SSRC : {}, \r\n" +
+ "SSRC鏍¢獙 锛歿} ", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
// 瓒呮椂澶勭悊
String timeOutTaskKey = UUID.randomUUID().toString();
dynamicTask.startDelay(timeOutTaskKey, () -> {
@@ -251,7 +261,7 @@
}, userSetting.getPlayTimeout());
//绔彛鑾峰彇澶辫触鐨剆srcInfo 娌℃湁蹇呰鍙戦�佺偣鎾寚浠�
if (ssrcInfo.getPort() <= 0) {
- logger.info("[鐐规挱绔彛鍒嗛厤寮傚父]锛宒eviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo);
+ logger.info("[鐐规挱绔彛鍒嗛厤寮傚父]锛宒eviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, JSON.toJSONString(ssrcInfo));
dynamicTask.stop(timeOutTaskKey);
// 閲婃斁ssrc
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
@@ -272,7 +282,12 @@
onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId);
hookEvent.response(mediaServerItemInuse, response);
logger.info("[鐐规挱鎴愬姛] deviceId: {}, channelId: {}", device.getDeviceId(), channelId);
- String streamUrl = String.format("http://127.0.0.1:%s/%s/%s.live.flv", mediaServerItemInuse.getHttpPort(), "rtp", ssrcInfo.getStream());
+ String streamUrl;
+ if (mediaServerItemInuse.getRtspPort() != 0) {
+ streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServerItemInuse.getRtspPort(), "rtp", ssrcInfo.getStream());
+ }else {
+ streamUrl = String.format("http://127.0.0.1:%s/%s/%s.live.mp4", mediaServerItemInuse.getHttpPort(), "rtp", ssrcInfo.getStream());
+ }
String path = "snap";
String fileName = device.getDeviceId() + "_" + channelId + ".jpg";
// 璇锋眰鎴浘
@@ -287,26 +302,40 @@
// 妫�鏌ユ槸鍚︽湁y瀛楁
if (ssrcIndex >= 0) {
//ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈� TODO 鍚庣画瀵逛笉瑙勮寖鐨勯潪10浣峴src鍏煎
- String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12);
+ String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12).trim();
// 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
if (ssrcInfo.getSsrc().equals(ssrcInResponse)) {
+ if (device.getStreamMode().equalsIgnoreCase("TCP-ACTIVE")) {
+ String substring = contentString.substring(0, contentString.indexOf("y="));
+ try {
+ SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
+ int port = -1;
+ Vector mediaDescriptions = sdp.getMediaDescriptions(true);
+ for (Object description : mediaDescriptions) {
+ MediaDescription mediaDescription = (MediaDescription) description;
+ Media media = mediaDescription.getMedia();
+
+ Vector mediaFormats = media.getMediaFormats(false);
+ if (mediaFormats.contains("96")) {
+ port = media.getMediaPort();
+ break;
+ }
+ }
+ logger.info("[鐐规挱-TCP涓诲姩杩炴帴瀵规柟] deviceId: {}, channelId: {}, 杩炴帴瀵规柟鐨勫湴鍧�锛歿}:{}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, sdp.getConnection().getAddress(), port, device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
+ JSONObject jsonObject = zlmresTfulUtils.connectRtpServer(mediaServerItem, sdp.getConnection().getAddress(), port, ssrcInfo.getStream());
+ logger.info("[鐐规挱-TCP涓诲姩杩炴帴瀵规柟] 缁撴灉锛� {}", jsonObject);
+ } catch (SdpException e) {
+ logger.error("[鐐规挱-TCP涓诲姩杩炴帴瀵规柟] deviceId: {}, channelId: {}, 瑙f瀽200OK鐨凷DP淇℃伅澶辫触", device.getDeviceId(), channelId, e);
+ }
+ }
return;
}
logger.info("[鐐规挱娑堟伅] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse);
if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
logger.info("[鐐规挱娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
- if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
- // ssrc 涓嶅彲鐢�
- // 閲婃斁ssrc
- mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
- streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
- event.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�";
- event.statusCode = 400;
- errorEvent.response(event);
- return;
- }
-
+ // 閲婃斁涓嶈浣跨敤鐨剆src
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
// 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚�
if (!mediaServerItem.isRtpEnable()) {
// 娣诲姞璁㈤槄
@@ -321,10 +350,30 @@
hookEvent.response(mediaServerItemInUse, response);
});
}
+
// 鍏抽棴rtp server
- mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
- // 閲嶆柊寮�鍚痵src server
- mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, ssrcInfo.getPort());
+ mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
+ if (result) {
+ // 閲嶆柊寮�鍚痵src 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("[鍛戒护鍙戦�佸け璐 鍋滄鐐规挱锛� 鍙戦�丅YE: {}", e.getMessage());
+ throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
+ }
+
+ dynamicTask.stop(timeOutTaskKey);
+
+ streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
+ event.msg = "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触";
+ event.statusCode = 500;
+ errorEvent.response(event);
+ }
+ });
+
}
}
@@ -346,7 +395,9 @@
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
- SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null));
+ SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult();
+ eventResult.type = SipSubscribe.EventResultType.cmdSendFailEvent;
+ eventResult.statusCode = -1;
eventResult.msg = "鍛戒护鍙戦�佸け璐�";
errorEvent.response(eventResult);
}
@@ -412,12 +463,29 @@
}
MediaServerItem mediaServerItem;
if (ObjectUtils.isEmpty(device.getMediaServerId()) || "auto".equals(device.getMediaServerId())) {
- mediaServerItem = mediaServerService.getMediaServerForMinimumLoad();
+ mediaServerItem = mediaServerService.getMediaServerForMinimumLoad(null);
} else {
mediaServerItem = mediaServerService.getOne(device.getMediaServerId());
}
if (mediaServerItem == null) {
logger.warn("鐐规挱鏃舵湭鎵惧埌鍙娇鐢ㄧ殑ZLM...");
+ }
+ return mediaServerItem;
+ }
+
+ @Override
+ public MediaServerItem getNewMediaServerItemHasAssist(Device device) {
+ if (device == null) {
+ return null;
+ }
+ MediaServerItem mediaServerItem;
+ if (ObjectUtils.isEmpty(device.getMediaServerId()) || "auto".equals(device.getMediaServerId())) {
+ mediaServerItem = mediaServerService.getMediaServerForMinimumLoad(true);
+ } else {
+ mediaServerItem = mediaServerService.getOne(device.getMediaServerId());
+ }
+ if (mediaServerItem == null) {
+ logger.warn("[鑾峰彇鍙敤鐨刏LM鑺傜偣]鏈壘鍒板彲浣跨敤鐨刏LM...");
}
return mediaServerItem;
}
@@ -431,8 +499,7 @@
return;
}
MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
- SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, device.isSsrcCheck(), true);
-
+ SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, null, device.isSsrcCheck(), true, 0, false, device.getStreamModeForParam());
playBack(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, inviteStreamCallback, callback);
}
@@ -449,7 +516,7 @@
if (device == null) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧锛� " + deviceId + "涓嶅瓨鍦�");
}
-
+ logger.info("[鍥炴斁娑堟伅] deviceId: {}, channelId: {},鏀舵祦绔彛锛� {}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
PlayBackResult<StreamInfo> playBackResult = new PlayBackResult<>();
String playBackTimeOutTaskKey = UUID.randomUUID().toString();
dynamicTask.startDelay(playBackTimeOutTaskKey, () -> {
@@ -520,16 +587,8 @@
if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
logger.info("[鍥炴斁娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
- if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
- // ssrc 涓嶅彲鐢�
- // 閲婃斁ssrc
- mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
- streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
- eventResult.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�";
- eventResult.statusCode = 400;
- errorEvent.response(eventResult);
- return;
- }
+ // 閲婃斁涓嶈浣跨敤鐨剆src
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
// 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚�
if (!mediaServerItem.isRtpEnable()) {
@@ -545,10 +604,31 @@
hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream()));
});
}
+
// 鍏抽棴rtp server
- mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
- // 閲嶆柊寮�鍚痵src server
- mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, ssrcInfo.getPort());
+ mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
+ if (result) {
+ // 閲嶆柊寮�鍚痵src server
+ mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, 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("[鍛戒护鍙戦�佸け璐 鍋滄鐐规挱 鍋滄锛� 鍙戦�丅YE: {}", e.getMessage());
+ throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
+ }
+
+ dynamicTask.stop(playBackTimeOutTaskKey);
+ // 閲婃斁ssrc
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
+ streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
+ errorEvent.response(eventResult);
+ eventResult.msg = "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触";
+ eventResult.statusCode = 500;
+ errorEvent.response(eventResult);
+ }
+ });
}
}
}
@@ -557,7 +637,9 @@
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 鍥炴斁: {}", e.getMessage());
- SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null));
+ SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult();
+ eventResult.type = SipSubscribe.EventResultType.cmdSendFailEvent;
+ eventResult.statusCode = -1;
eventResult.msg = "鍛戒护鍙戦�佸け璐�";
errorEvent.response(eventResult);
}
@@ -566,16 +648,23 @@
@Override
- public void download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
+ public void download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback playBackCallback) {
Device device = storager.queryVideoDevice(deviceId);
if (device == null) {
return;
}
- MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
- SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, device.isSsrcCheck(), true);
-
- download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed, infoCallBack, hookCallBack);
+ MediaServerItem newMediaServerItem = getNewMediaServerItemHasAssist(device);
+ if (newMediaServerItem == null) {
+ PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>();
+ downloadResult.setCode(ErrorCode.ERROR100.getCode());
+ downloadResult.setMsg("鏈壘鍒癮ssist鏈嶅姟");
+ playBackCallback.call(downloadResult);
+ return;
+ }
+ SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, null, device.isSsrcCheck(), true, 0, false, device.getStreamModeForParam());
+ download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed, infoCallBack, playBackCallback);
}
+
@Override
public void download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
@@ -588,7 +677,7 @@
throw new ControllerException(ErrorCode.ERROR400.getCode(), "璁惧锛�" + deviceId + "涓嶅瓨鍦�");
}
PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>();
-
+ logger.info("[褰曞儚涓嬭浇] deviceId: {}, channelId: {},鏀舵祦绔彛锛� {}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
String downLoadTimeOutTaskKey = UUID.randomUUID().toString();
dynamicTask.startDelay(downLoadTimeOutTaskKey, () -> {
logger.warn(String.format("褰曞儚涓嬭浇璇锋眰瓒呮椂锛宒eviceId锛�%s 锛宑hannelId锛�%s", deviceId, channelId));
@@ -616,27 +705,93 @@
hookCallBack.call(downloadResult);
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
};
-
+ InviteStreamCallback hookEvent = (InviteStreamInfo inviteStreamInfo) -> {
+ logger.info("[褰曞儚涓嬭浇]鏀跺埌璁㈤槄娑堟伅锛� " + inviteStreamInfo.getCallId());
+ dynamicTask.stop(downLoadTimeOutTaskKey);
+ StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
+ streamInfo.setStartTime(startTime);
+ streamInfo.setEndTime(endTime);
+ redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId());
+ downloadResult.setCode(ErrorCode.SUCCESS.getCode());
+ downloadResult.setMsg(ErrorCode.SUCCESS.getMsg());
+ downloadResult.setData(streamInfo);
+ downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem());
+ downloadResult.setResponse(inviteStreamInfo.getResponse());
+ hookCallBack.call(downloadResult);
+ };
try {
cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack,
- inviteStreamInfo -> {
- logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + inviteStreamInfo.getResponse().toJSONString());
- dynamicTask.stop(downLoadTimeOutTaskKey);
- StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
- streamInfo.setStartTime(startTime);
- streamInfo.setEndTime(endTime);
- redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId());
- downloadResult.setCode(ErrorCode.SUCCESS.getCode());
- downloadResult.setMsg(ErrorCode.SUCCESS.getMsg());
- downloadResult.setData(streamInfo);
- downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem());
- downloadResult.setResponse(inviteStreamInfo.getResponse());
- hookCallBack.call(downloadResult);
- }, errorEvent);
+ hookEvent, errorEvent, eventResult ->
+ {
+ if (eventResult.type == SipSubscribe.EventResultType.response) {
+ ResponseEvent responseEvent = (ResponseEvent) eventResult.event;
+ String contentString = new String(responseEvent.getResponse().getRawContent());
+ // 鑾峰彇ssrc
+ int ssrcIndex = contentString.indexOf("y=");
+ // 妫�鏌ユ槸鍚︽湁y瀛楁
+ if (ssrcIndex >= 0) {
+ //ssrc瑙勫畾闀垮害涓�10瀛楄妭锛屼笉鍙栦綑涓嬮暱搴︿互閬垮厤鍚庣画杩樻湁鈥渇=鈥濆瓧娈� TODO 鍚庣画瀵逛笉瑙勮寖鐨勯潪10浣峴src鍏煎
+ String ssrcInResponse = contentString.substring(ssrcIndex + 2, ssrcIndex + 12);
+ // 鏌ヨ鍒皊src涓嶄竴鑷翠笖寮�鍚簡ssrc鏍¢獙鍒欓渶瑕侀拡瀵瑰鐞�
+ if (ssrcInfo.getSsrc().equals(ssrcInResponse)) {
+ return;
+ }
+ logger.info("[褰曞儚涓嬭浇] 鏀跺埌invite 200, 鍙戠幇涓嬬骇鑷畾涔変簡ssrc: {}", ssrcInResponse);
+ if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
+ logger.info("[褰曞儚涓嬭浇] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
+
+ // 閲婃斁涓嶈浣跨敤鐨剆src
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
+
+ // 鍗曠鍙fā寮弒treamId涔熸湁鍙樺寲锛岄渶瑕侀噸鏂拌缃洃鍚�
+ if (!mediaServerItem.isRtpEnable()) {
+ // 娣诲姞璁㈤槄
+ HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
+ subscribe.removeSubscribe(hookSubscribe);
+ hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
+ subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response) -> {
+ logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + response.toJSONString());
+ dynamicTask.stop(downLoadTimeOutTaskKey);
+ // hook鍝嶅簲
+ onPublishHandlerForPlayback(mediaServerItemInUse, response, device.getDeviceId(), channelId, hookCallBack);
+ hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream()));
+ });
+ }
+
+ // 鍏抽棴rtp server
+ mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
+ if (result) {
+ // 閲嶆柊寮�鍚痵src server
+ mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), true, 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("[鍛戒护鍙戦�佸け璐 褰曞儚涓嬭浇鍋滄锛� 鍙戦�丅YE: {}", e.getMessage());
+ throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
+ }
+
+ dynamicTask.stop(downLoadTimeOutTaskKey);
+ // 閲婃斁ssrc
+ mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
+
+ streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
+ eventResult.msg = "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触";
+ eventResult.statusCode = 500;
+ errorEvent.response(eventResult);
+ }
+ });
+ }
+ }
+ }
+ });
} catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚涓嬭浇: {}", e.getMessage());
- SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(new CmdSendFailEvent(null));
+ SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult();
+ eventResult.type = SipSubscribe.EventResultType.cmdSendFailEvent;
+ eventResult.statusCode = -1;
eventResult.msg = "鍛戒护鍙戦�佸け璐�";
errorEvent.response(eventResult);
}
@@ -659,7 +814,10 @@
}
if (mediaServerItem.getRecordAssistPort() > 0) {
JSONObject jsonObject = assistRESTfulUtils.fileDuration(mediaServerItem, streamInfo.getApp(), streamInfo.getStream(), null);
- if (jsonObject != null && jsonObject.getInteger("code") == 0) {
+ if (jsonObject == null) {
+ throw new ControllerException(ErrorCode.ERROR100.getCode(), "杩炴帴Assist鏈嶅姟澶辫触");
+ }
+ if (jsonObject.getInteger("code") == 0) {
long duration = jsonObject.getLong("data");
if (duration == 0) {
@@ -807,7 +965,7 @@
throw new ServiceException("streamId涓嶅瓨鍦�");
}
streamInfo.setPause(true);
- RedisUtil.set(key, streamInfo);
+ redisTemplate.opsForValue().set(key, streamInfo);
MediaServerItem mediaServerItem = mediaServerService.getOne(streamInfo.getMediaServerId());
if (null == mediaServerItem) {
logger.warn("mediaServer 涓嶅瓨鍦�!");
@@ -831,7 +989,7 @@
throw new ServiceException("streamId涓嶅瓨鍦�");
}
streamInfo.setPause(false);
- RedisUtil.set(key, streamInfo);
+ redisTemplate.opsForValue().set(key, streamInfo);
MediaServerItem mediaServerItem = mediaServerService.getOne(streamInfo.getMediaServerId());
if (null == mediaServerItem) {
logger.warn("mediaServer 涓嶅瓨鍦�!");
--
Gitblit v1.8.0