From 6c9d6f0054fe7928524c5fa16ebeae6094366222 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 29 十一月 2022 13:16:20 +0800
Subject: [PATCH] Merge branch 'wvp-28181-2.0'
---
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 229 +++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 188 insertions(+), 41 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index a314554..88d7e14 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -7,9 +7,10 @@
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
+import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
-import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
import com.genersoft.iot.vmp.media.zlm.dto.HookType;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
@@ -49,7 +50,13 @@
private SIPCommander cmder;
@Autowired
- private SIPCommanderFroPlatform commanderFroPlatform;
+ private ISIPCommanderForPlatform commanderFroPlatform;
+
+ @Autowired
+ private AudioBroadcastManager audioBroadcastManager;
+
+ @Autowired
+ private ZLMRTPServerFactory zlmrtpServerFactory;
@Autowired
private IPlayService playService;
@@ -282,9 +289,9 @@
JSONObject json = (JSONObject) JSON.toJSON(param);
- taskExecutor.execute(()->{
+ taskExecutor.execute(()-> {
ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_stream_changed, json);
- if (subscribe != null ) {
+ if (subscribe != null) {
MediaServerItem mediaInfo = mediaServerService.getOne(param.getMediaServerId());
if (mediaInfo != null) {
subscribe.response(mediaInfo, json);
@@ -300,43 +307,166 @@
StreamAuthorityInfo streamAuthorityInfo = redisCatchStorage.getStreamAuthorityInfo(param.getApp(), param.getStream());
if (streamAuthorityInfo == null) {
streamAuthorityInfo = StreamAuthorityInfo.getInstanceByHook(param);
- }else {
+ } else {
streamAuthorityInfo.setOriginType(param.getOriginType());
streamAuthorityInfo.setOriginTypeStr(param.getOriginTypeStr());
}
redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo);
}
- }else {
+ } else {
redisCatchStorage.removeStreamAuthorityInfo(param.getApp(), param.getStream());
}
+ });
- if ("rtsp".equals(param.getSchema())){
- if (param.isRegist()) {
- mediaServerService.addCount(param.getMediaServerId());
- }else {
- mediaServerService.removeCount(param.getMediaServerId());
+ if ("rtsp".equals(param.getSchema())){
+ logger.info("on_stream_changed锛氭敞鍐�->{}, app->{}, stream->{}", param.isRegist(), param.getApp(), param.getStream());
+ if (param.isRegist()) {
+ mediaServerService.addCount(param.getMediaServerId());
+ }else {
+ mediaServerService.removeCount(param.getMediaServerId());
+ }
+ if (param.getOriginType() == OriginType.PULL.ordinal()
+ || param.getOriginType() == OriginType.FFMPEG_PULL.ordinal()) {
+ // 璁剧疆鎷夋祦浠g悊涓婄嚎/绂荤嚎
+ streamProxyService.updateStatus(param.isRegist(), param.getApp(), param.getStream());
+ }
+ if ("rtp".equals(param.getApp()) && !param.isRegist() ) {
+ StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(param.getStream());
+ if (streamInfo!=null){
+ redisCatchStorage.stopPlay(streamInfo);
+ storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
+ }else{
+ streamInfo = redisCatchStorage.queryPlayback(null, null, param.getStream(), null);
+ if (streamInfo != null) {
+ redisCatchStorage.stopPlayback(streamInfo.getDeviceID(), streamInfo.getChannelId(),
+ streamInfo.getStream(), null);
+ }
}
- if (param.getOriginType() == OriginType.PULL.ordinal()
- || param.getOriginType() == OriginType.FFMPEG_PULL.ordinal()) {
- // 璁剧疆鎷夋祦浠g悊涓婄嚎/绂荤嚎
- streamProxyService.updateStatus(param.isRegist(), param.getApp(), param.getStream());
- }
- if ("rtp".equals(param.getApp()) && !param.isRegist() ) {
- StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(param.getStream());
- if (streamInfo!=null){
- redisCatchStorage.stopPlay(streamInfo);
- storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
- }else{
- streamInfo = redisCatchStorage.queryPlayback(null, null, param.getStream(), null);
- if (streamInfo != null) {
- redisCatchStorage.stopPlayback(streamInfo.getDeviceID(), streamInfo.getChannelId(),
- streamInfo.getStream(), null);
+ }else if ("broadcast".equals(param.getApp())){
+ // 璇煶瀵硅鎺ㄦ祦 stream闇�瑕佹弧瓒虫牸寮廳eviceId_channelId
+ if (param.isRegist() && param.getStream().indexOf("_") > 0) {
+ String[] streamArray = param.getStream().split("_");
+ if (streamArray.length == 2) {
+ String deviceId = streamArray[0];
+ String channelId = streamArray[1];
+ Device device = deviceService.getDevice(deviceId);
+ if (device != null) {
+ DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
+ if (deviceChannel != null) {
+ if (audioBroadcastManager.exit(deviceId, channelId)) {
+ // 鐩存帴鎺ㄦ祦
+ SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, null, param.getStream(), null);
+ if (sendRtpItem == null) {
+ // TODO 鍙兘鏁版嵁閿欒锛岄噸鏂板紑鍚闊抽�氶亾
+ }else {
+ String is_Udp = sendRtpItem.isTcp() ? "0" : "1";
+ MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
+ logger.info("rtp/{}寮�濮嬪悜涓婄骇鎺ㄦ祦, 鐩爣={}:{}锛孲SRC={}", sendRtpItem.getStreamId(), sendRtpItem.getIp(), sendRtpItem.getPort(), sendRtpItem.getSsrc());
+ Map<String, Object> sendParam = new HashMap<>(12);
+ sendParam.put("vhost","__defaultVhost__");
+ sendParam.put("app",sendRtpItem.getApp());
+ sendParam.put("stream",sendRtpItem.getStreamId());
+ sendParam.put("ssrc", sendRtpItem.getSsrc());
+ sendParam.put("src_port", sendRtpItem.getLocalPort());
+ sendParam.put("pt", sendRtpItem.getPt());
+ sendParam.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
+ sendParam.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0");
+
+ JSONObject jsonObject;
+ if (sendRtpItem.isTcpActive()) {
+ jsonObject = zlmrtpServerFactory.startSendRtpPassive(mediaInfo, sendParam);
+ } else {
+ sendParam.put("is_udp", is_Udp);
+ sendParam.put("dst_url", sendRtpItem.getIp());
+ sendParam.put("dst_port", sendRtpItem.getPort());
+ jsonObject = zlmrtpServerFactory.startSendRtpStream(mediaInfo, sendParam);
+ }
+ if (jsonObject != null && jsonObject.getInteger("code") == 0) {
+ logger.info("[璇煶瀵硅] 鑷姩鎺ㄦ祦鎴愬姛, device: {}, channel: {}", deviceId, channelId);
+ }else {
+ logger.info("[璇煶瀵硅] 鎺ㄦ祦澶辫触, 缁撴灉锛� {}", jsonObject);
+ }
+
+ }
+ }else {
+ // 寮�鍚闊冲璁查�氶亾
+ try {
+ playService.audioBroadcastCmd(device, channelId, 60, (msg)->{
+ logger.info("[璇煶瀵硅] 閫氶亾寤虹珛鎴愬姛, device: {}, channel: {}", deviceId, channelId);
+ });
+ } catch (InvalidArgumentException | ParseException | SipException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 璇煶瀵硅: {}", e.getMessage());
+ }
+ }
+
+ }
}
}
- }else {
- if (!"rtp".equals(param.getApp())){
- String type = OriginType.values()[param.getOriginType()].getType();
- MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
+ }
+
+ }else if ("talk".equals(param.getApp())){
+ // 璇煶瀵硅鎺ㄦ祦 stream闇�瑕佹弧瓒虫牸寮廳eviceId_channelId
+ if (param.isRegist() && param.getStream().indexOf("_") > 0) {
+ String[] streamArray = param.getStream().split("_");
+ if (streamArray.length == 2) {
+ String deviceId = streamArray[0];
+ String channelId = streamArray[1];
+ Device device = deviceService.getDevice(deviceId);
+ if (device != null) {
+ DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
+ if (deviceChannel != null) {
+ if (audioBroadcastManager.exit(deviceId, channelId)) {
+ // 鐩存帴鎺ㄦ祦
+ SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, null, param.getStream(), null);
+ if (sendRtpItem == null) {
+ // TODO 鍙兘鏁版嵁閿欒锛岄噸鏂板紑鍚闊抽�氶亾
+ }else {
+ MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
+ logger.info("rtp/{}寮�濮嬪悜涓婄骇鎺ㄦ祦, 鐩爣={}:{}锛孲SRC={}", sendRtpItem.getStreamId(), sendRtpItem.getIp(), sendRtpItem.getPort(), sendRtpItem.getSsrc());
+ Map<String, Object> sendParam = new HashMap<>(12);
+ sendParam.put("vhost","__defaultVhost__");
+ sendParam.put("app",sendRtpItem.getApp());
+ sendParam.put("stream",sendRtpItem.getStreamId());
+ sendParam.put("ssrc", sendRtpItem.getSsrc());
+ sendParam.put("src_port", sendRtpItem.getLocalPort());
+ sendParam.put("pt", sendRtpItem.getPt());
+ sendParam.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
+ sendParam.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0");
+
+ JSONObject jsonObject;
+ if (sendRtpItem.isTcpActive()) {
+ jsonObject = zlmrtpServerFactory.startSendRtpPassive(mediaInfo, sendParam);
+ } else {
+ sendParam.put("is_udp", sendRtpItem.isTcp() ? "0" : "1");
+ sendParam.put("dst_url", sendRtpItem.getIp());
+ sendParam.put("dst_port", sendRtpItem.getPort());
+ jsonObject = zlmrtpServerFactory.startSendRtpStream(mediaInfo, sendParam);
+ }
+ if (jsonObject != null && jsonObject.getInteger("code") == 0) {
+ logger.info("[璇煶瀵硅] 鑷姩鎺ㄦ祦鎴愬姛, device: {}, channel: {}", deviceId, channelId);
+ }
+ }
+ }else {
+ // 寮�鍚闊冲璁查�氶亾
+ MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
+ playService.talk(mediaServerItem, device, channelId, (mediaServer, jsonObject)->{
+ System.out.println("寮�濮嬫帹娴�");
+ }, eventResult -> {
+ System.out.println(eventResult.msg);
+ }, ()->{
+ System.out.println("瓒呮椂");
+ });
+ }
+
+ }
+ }
+ }
+ }
+
+ }else{
+ if (!"rtp".equals(param.getApp())){
+ String type = OriginType.values()[param.getOriginType()].getType();
+ MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
if (mediaServerItem != null){
if (param.isRegist()) {
@@ -346,7 +476,7 @@
callId = streamAuthorityInfo.getCallId();
}
StreamInfo streamInfoByAppAndStream = mediaService.getStreamInfoByAppAndStream(mediaServerItem,
- param.getApp(), param.getStream(), tracks, callId);
+ param.getApp(), param.getStream(), param.getTracks(), callId);
param.setStreamInfo(streamInfoByAppAndStream);
redisCatchStorage.addStream(mediaServerItem, type, param.getApp(), param.getStream(), param);
if (param.getOriginType() == OriginType.RTSP_PUSH.ordinal()
@@ -357,7 +487,8 @@
}
}else {
// 鍏煎娴佹敞閿�鏃剁被鍨嬩粠redis璁板綍鑾峰彇
- OnStreamChangedHookParam onStreamChangedHookParam = redisCatchStorage.getStreamInfo(param.getApp(), param.getStream(), param.getMediaServerId());
+ OnStreamChangedHookParam onStreamChangedHookParam = redisCatchStorage.getStreamInfo(
+ param.getApp(), param.getStream(), param.getMediaServerId());
if (onStreamChangedHookParam != null) {
type = OriginType.values()[onStreamChangedHookParam.getOriginType()].getType();
redisCatchStorage.removeStream(mediaServerItem.getId(), type, param.getApp(), param.getStream());
@@ -390,21 +521,33 @@
ParentPlatform platform = storager.queryParentPlatByServerGBId(platformId);
Device device = deviceService.getDevice(platformId);
- try {
- if (platform != null) {
- commanderFroPlatform.streamByeCmd(platform, sendRtpItem);
- }else {
- cmder.streamByeCmd(device, sendRtpItem.getChannelId(), param.getStream(), sendRtpItem.getCallId());
+ try {
+ if (platform != null) {
+ commanderFroPlatform.streamByeCmd(platform, sendRtpItem);
+ }else {
+ if (sendRtpItem.isOnlyAudio()) {
+ AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(sendRtpItem.getDeviceId(), sendRtpItem.getChannelId());
+ if (audioBroadcastCatch != null) {
+// playService.stopAudioBroadcast(device.getDeviceId(), sendRtpItem.getChannelId());
+ if ("talk".equals(param.getApp())) {
+// cmder.streamByeCmd(device, sendRtpItem.getChannelId(), audioBroadcastCatch.getSipTransactionInfo(), null);
+ }else {
+// cmder.streamByeCmd(device, sendRtpItem.getChannelId(), audioBroadcastCatch.getSipTransactionInfo(), null);
+ }
+ }
}
- } catch (SipException | InvalidArgumentException | ParseException | SsrcTransactionNotFoundException e) {
- logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage());
+
+
+
}
+ } catch (SipException | InvalidArgumentException | ParseException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage());
}
}
}
}
}
- });
+ }
JSONObject ret = new JSONObject();
ret.put("code", 0);
@@ -436,6 +579,9 @@
if (sendRtpItems.size() > 0) {
for (SendRtpItem sendRtpItem : sendRtpItems) {
ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId());
+ if (parentPlatform == null) {
+ continue;
+ }
try {
commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId());
} catch (SipException | InvalidArgumentException | ParseException e) {
@@ -505,6 +651,7 @@
// 淇敼鏁版嵁
streamProxyService.stop(param.getApp(), param.getStream());
}else {
+ // 鏃犱汉瑙傜湅涓嶅仛澶勭悊
ret.put("close", false);
}
return ret;
@@ -630,7 +777,7 @@
@ResponseBody
@PostMapping(value = "/on_rtp_server_timeout", produces = "application/json;charset=UTF-8")
public JSONObject onRtpServerTimeout(HttpServletRequest request, @RequestBody OnRtpServerTimeoutHookParam param){
- logger.info("[ZLM HOOK] rtpServer鏀舵祦瓒呮椂锛歿}->{}({})", param.getMediaServerId(), param.getStream_id(), param.getSsrc());
+ logger.info("[ZLM HOOK] rtpServer rtp瓒呮椂锛歿}->{}({})", param.getMediaServerId(), param.getStream_id(), param.getSsrc());
JSONObject ret = new JSONObject();
ret.put("code", 0);
--
Gitblit v1.8.0