From 5b0b17d7410785aef2bedb22447bd458a3713300 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 04 十二月 2021 17:27:23 +0800
Subject: [PATCH] 添加第三方服务参与的推流直接转发到国标功能
---
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java | 18 ++
web_src/src/components/dialog/platformEdit.vue | 80 +++++++---
src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java | 13 +
web_src/src/components/StreamProxyList.vue | 1
src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java | 18 ++
src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java | 10 +
web_src/src/components/PushVideoList.vue | 34 +++-
src/main/resources/wvp.sqlite | 0
src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java | 10 +
src/main/resources/all-application.yml | 2
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java | 39 +++++
src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java | 5
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java | 4
src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java | 23 +++
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java | 2
src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java | 3
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 11 +
sql/mysql.sql | 1
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java | 8 +
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java | 51 +++++++
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java | 5
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java | 54 +++----
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java | 9 +
23 files changed, 324 insertions(+), 77 deletions(-)
diff --git a/sql/mysql.sql b/sql/mysql.sql
index 38cc881..64fed12 100644
--- a/sql/mysql.sql
+++ b/sql/mysql.sql
@@ -173,6 +173,7 @@
ptz int null,
rtcp int null,
status bit null,
+ shareAllLiveStream int null,
primary key (id, serverGBId)
);
diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
index da58e10..3b47ff0 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -55,5 +55,8 @@
public static final String MEDIA_TRANSACTION_USED_PREFIX = "VMP_MEDIA_TRANSACTION_";
//************************** redis 娑堟伅*********************************
- public static final String WVP_MSG_STREAM_CHANGE__PREFIX = "WVP_MSG_STREAM_CHANGE_";
+ public static final String WVP_MSG_STREAM_CHANGE_PREFIX = "WVP_MSG_STREAM_CHANGE_";
+
+ //************************** 绗笁鏂� ****************************************
+ public static final String WVP_STREAM_GB_ID_PREFIX = "memberNo_";
}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java b/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
index 13831b4..140295e 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
@@ -29,6 +29,8 @@
private String serverId = "000000";
+ private String thirdPartyGBIdReg = "[\\s\\S]*";
+
private List<String> interfaceAuthenticationExcludes = new ArrayList<>();
public Boolean getSavePositionHistory() {
@@ -114,4 +116,12 @@
public void setServerId(String serverId) {
this.serverId = serverId;
}
+
+ public String getThirdPartyGBIdReg() {
+ return thirdPartyGBIdReg;
+ }
+
+ public void setThirdPartyGBIdReg(String thirdPartyGBIdReg) {
+ this.thirdPartyGBIdReg = thirdPartyGBIdReg;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
index 96fcd36..fabae8a 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/ParentPlatform.java
@@ -104,6 +104,11 @@
*/
private int channelCount;
+ /**
+ * 鍏变韩鎵�鏈夌殑鐩存挱娴�
+ */
+ private boolean shareAllLiveStream;
+
public Integer getId() {
return id;
}
@@ -264,4 +269,12 @@
this.channelCount = channelCount;
}
+
+ public boolean isShareAllLiveStream() {
+ return shareAllLiveStream;
+ }
+
+ public void setShareAllLiveStream(boolean shareAllLiveStream) {
+ this.shareAllLiveStream = shareAllLiveStream;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index 1cb4af5..2635a5f 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -31,6 +31,7 @@
import javax.sip.message.Request;
import javax.sip.message.Response;
import java.text.ParseException;
+import java.util.List;
import java.util.Vector;
/**
@@ -105,7 +106,8 @@
if (platform != null) {
// 鏌ヨ骞冲彴涓嬫槸鍚︽湁璇ラ�氶亾
DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId);
- GbStream gbStream = storager.queryStreamInParentPlatform(requesterId, channelId);
+ List<GbStream> gbStreams = storager.queryStreamInParentPlatform(requesterId, channelId);
+ GbStream gbStream = gbStreams.size() > 0? gbStreams.get(0):null;
MediaServerItem mediaServerItem = null;
// 涓嶆槸閫氶亾鍙兘鏄洿鎾祦
if (channel != null && gbStream == null ) {
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
index 49fe098..baf0b3c 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
@@ -1,21 +1,28 @@
package com.genersoft.iot.vmp.media.zlm;
import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.conf.UserSetup;
+import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
import com.genersoft.iot.vmp.service.IStreamPushService;
+import com.genersoft.iot.vmp.service.bean.ThirdPartyGB;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
+import com.genersoft.iot.vmp.storager.dao.StreamPushMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
@Component
public class ZLMMediaListManager {
@@ -41,7 +48,13 @@
private IStreamPushService streamPushService;
@Autowired
+ private StreamPushMapper streamPushMapper;
+
+ @Autowired
private ZLMHttpHookSubscribe subscribe;
+
+ @Autowired
+ private UserSetup userSetup;
public void updateMediaList(MediaServerItem mediaServerItem) {
@@ -89,7 +102,43 @@
}
public void addMedia(MediaItem mediaItem) {
- storager.updateMedia(streamPushService.transform(mediaItem));
+ // 鏌ユ壘姝ょ洿鎾祦鏄惁瀛樺湪redis棰勮gbId
+ StreamPushItem transform = streamPushService.transform(mediaItem);
+ // 浠巗treamId鍙栧嚭鏌ヨ鍏抽敭鍊�
+ Pattern pattern = Pattern.compile(userSetup.getThirdPartyGBIdReg());
+ Matcher matcher = pattern.matcher(mediaItem.getStream());// 鎸囧畾瑕佸尮閰嶇殑瀛楃涓�
+ String queryKey = null;
+ if (matcher.find()) { //姝ゅfind锛堬級姣忔琚皟鐢ㄥ悗锛屼細鍋忕Щ鍒颁笅涓�涓尮閰�
+ queryKey = matcher.group();
+ }
+ if (queryKey != null) {
+ ThirdPartyGB thirdPartyGB = redisCatchStorage.queryMemberNoGBId(queryKey);
+ if (thirdPartyGB != null && !StringUtils.isEmpty(thirdPartyGB.getNationalStandardNo())) {
+ transform.setGbId(thirdPartyGB.getNationalStandardNo());
+ transform.setName(thirdPartyGB.getName());
+ }
+ }
+ storager.updateMedia(transform);
+ if (!StringUtils.isEmpty(transform.getGbId())) {
+ // 濡傛灉杩欎釜鍥芥爣ID宸茬粡缁欎簡鍏朵粬鎺ㄦ祦涓旀祦宸茬绾匡紝鍒欑Щ闄ゅ叾浠栨帹娴�
+ List<GbStream> gbStreams = gbStreamMapper.selectByGBId(transform.getGbId());
+ if (gbStreams.size() > 0) {
+ for (GbStream gbStream : gbStreams) {
+ // 鍑虹幇浣跨敤鐩稿悓鍥芥爣Id鐨勮棰戞祦鏃讹紝浣跨敤鏂版祦鏇挎崲鏃ф祦锛�
+ gbStreamMapper.del(gbStream.getApp(), gbStream.getStream());
+ platformGbStreamMapper.delByAppAndStream(gbStream.getApp(), gbStream.getStream());
+ if (!gbStream.isStatus()) {
+ streamPushMapper.del(gbStream.getApp(), gbStream.getStream());
+ }
+ }
+ }
+ if (gbStreamMapper.selectOne(transform.getApp(), transform.getStream()) != null) {
+ gbStreamMapper.update(transform);
+ }else {
+ gbStreamMapper.add(transform);
+ }
+
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
index 2b45ce7..7733254 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -37,4 +37,13 @@
StreamPushItem transform(MediaItem item);
StreamPushItem getPush(String app, String streamId);
+
+ /**
+ * 鍋滄涓�璺帹娴�
+ * @param app 搴旂敤鍚�
+ * @param streamId 娴両D
+ * @return
+ */
+ boolean stop(String app, String streamId);
+
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java b/src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java
new file mode 100644
index 0000000..9d6b06a
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/service/bean/ThirdPartyGB.java
@@ -0,0 +1,23 @@
+package com.genersoft.iot.vmp.service.bean;
+
+public class ThirdPartyGB {
+
+ private String name;
+ private String nationalStandardNo;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getNationalStandardNo() {
+ return nationalStandardNo;
+ }
+
+ public void setNationalStandardNo(String nationalStandardNo) {
+ this.nationalStandardNo = nationalStandardNo;
+ }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
index 3ffc68e..2961bc6 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
@@ -79,44 +79,38 @@
StringBuffer result = new StringBuffer();
boolean streamLive = false;
param.setMediaServerId(mediaInfo.getId());
+ boolean saveResult;
// 鏇存柊
if (videoManagerStorager.queryStreamProxy(param.getApp(), param.getStream()) != null) {
- if (videoManagerStorager.updateStreamProxy(param)) {
- result.append("淇濆瓨鎴愬姛");
- if (param.isEnable()){
- JSONObject jsonObject = addStreamProxyToZlm(param);
- if (jsonObject == null) {
- result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
- param.setEnable(false);
- videoManagerStorager.updateStreamProxy(param);
- }else {
- StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(
- mediaInfo, param.getApp(), param.getStream(), null);
- wvpResult.setData(streamInfo);
- }
- }
- }
+ saveResult = videoManagerStorager.updateStreamProxy(param);
}else { // 鏂板
- if (videoManagerStorager.addStreamProxy(param)){
- result.append("淇濆瓨鎴愬姛");
- streamLive = true;
- if (param.isEnable()) {
- JSONObject jsonObject = addStreamProxyToZlm(param);
- if (jsonObject == null) {
- streamLive = false;
- result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
- param.setEnable(false);
- videoManagerStorager.updateStreamProxy(param);
- }else {
+ saveResult = videoManagerStorager.addStreamProxy(param);
+ }
+ if (saveResult) {
+ result.append("淇濆瓨鎴愬姛");
+ if (param.isEnable()) {
+ JSONObject jsonObject = addStreamProxyToZlm(param);
+ if (jsonObject == null) {
+ streamLive = false;
+ result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
+ param.setEnable(false);
+ videoManagerStorager.updateStreamProxy(param);
+ }else {
+ Integer code = jsonObject.getInteger("code");
+ if (code == 0) {
StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(
mediaInfo, param.getApp(), param.getStream(), null);
wvpResult.setData(streamInfo);
+ }else {
+ result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
+ param.setEnable(false);
+ videoManagerStorager.updateStreamProxy(param);
}
- }
- }else {
- result.append("淇濆瓨澶辫触");
- }
+ }
+ }
+ }else {
+ result.append("淇濆瓨澶辫触");
}
if (param.getPlatformGbId() != null && streamLive) {
List<GbStream> gbStreams = new ArrayList<>();
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
index 634f670..41db0fe 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -12,6 +12,7 @@
import com.genersoft.iot.vmp.service.IStreamPushService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
+import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
import com.genersoft.iot.vmp.storager.dao.StreamPushMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
@@ -31,6 +32,9 @@
@Autowired
private StreamPushMapper streamPushMapper;
+
+ @Autowired
+ private PlatformGbStreamMapper platformGbStreamMapper;
@Autowired
private ZLMRESTfulUtils zlmresTfulUtils;
@@ -116,4 +120,18 @@
return streamPushMapper.selectOne(app, streamId);
}
+
+ @Override
+ public boolean stop(String app, String streamId) {
+ StreamPushItem streamPushItem = streamPushMapper.selectOne(app, streamId);
+ int delStream = streamPushMapper.del(app, streamId);
+ gbStreamMapper.del(app, streamId);
+ platformGbStreamMapper.delByAppAndStream(app, streamId);
+ if (delStream > 0) {
+ MediaServerItem mediaServerItem = mediaServerService.getOne(streamPushItem.getMediaServerId());
+ zlmresTfulUtils.closeStreams(mediaServerItem,app, streamId);
+ }
+ return true;
+ }
+
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
index 3314fb2..0458941 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -6,6 +6,7 @@
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+import com.genersoft.iot.vmp.service.bean.ThirdPartyGB;
import java.util.List;
import java.util.Map;
@@ -152,4 +153,11 @@
boolean startDownload(StreamInfo streamInfo);
StreamInfo queryDownloadByStreamId(String streamId);
+
+ /**
+ * 鏌ユ壘绗笁鏂圭郴缁熺暀涓嬬殑鍥芥爣棰勮鍊�
+ * @param queryKey
+ * @return
+ */
+ ThirdPartyGB queryMemberNoGBId(String queryKey);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
index 570718b..39dc5ad 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -327,7 +327,7 @@
* @param channelId
* @return
*/
- GbStream queryStreamInParentPlatform(String platformId, String channelId);
+ List<GbStream> queryStreamInParentPlatform(String platformId, String channelId);
/**
* 鑾峰彇骞冲彴鍏宠仈鐨勭洿鎾祦
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
index ebf4239..84c04a1 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
@@ -40,10 +40,13 @@
@Select("SELECT * FROM gb_stream WHERE app=#{app} AND stream=#{stream}")
StreamProxyItem selectOne(String app, String stream);
+ @Select("SELECT * FROM gb_stream WHERE gbId=#{gbId}")
+ List<GbStream> selectByGBId(String gbId);
+
@Select("SELECT gs.*, pgs.platformId FROM gb_stream gs " +
"LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream " +
"WHERE gs.gbId = '${gbId}' AND pgs.platformId = '${platformId}'")
- GbStream queryStreamInPlatform(String platformId, String gbId);
+ List<GbStream> queryStreamInPlatform(String platformId, String gbId);
@Select("SELECT gs.*, pgs.platformId FROM gb_stream gs " +
"LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream " +
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
index bb81171..c92711a 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java
@@ -15,10 +15,10 @@
@Insert("INSERT INTO parent_platform (enable, name, serverGBId, serverGBDomain, serverIP, serverPort, deviceGBId, deviceIp, " +
" devicePort, username, password, expires, keepTimeout, transport, characterSet, ptz, rtcp, " +
- " status) " +
+ " status, shareAllLiveStream) " +
" VALUES (${enable}, '${name}', '${serverGBId}', '${serverGBDomain}', '${serverIP}', ${serverPort}, '${deviceGBId}', '${deviceIp}', " +
" '${devicePort}', '${username}', '${password}', '${expires}', '${keepTimeout}', '${transport}', '${characterSet}', ${ptz}, ${rtcp}, " +
- " ${status})")
+ " ${status}, ${shareAllLiveStream})")
int addParentPlatform(ParentPlatform parentPlatform);
@Update("UPDATE parent_platform " +
@@ -39,7 +39,8 @@
"characterSet=#{characterSet}, " +
"ptz=#{ptz}, " +
"rtcp=#{rtcp}, " +
- "status=#{status} " +
+ "status=#{status}, " +
+ "shareAllLiveStream=#{shareAllLiveStream} " +
"WHERE id=#{id}")
int updateParentPlatform(ParentPlatform parentPlatform);
@@ -70,4 +71,7 @@
@Update("UPDATE parent_platform SET status=#{online} WHERE serverGBId=#{platformGbID}" )
int updateParentPlatformStatus(String platformGbID, boolean online);
+
+ @Select("SELECT * FROM parent_platform WHERE shareAllLiveStream=true")
+ List<ParentPlatform> selectAllAhareAllLiveStream();
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java
index 6243f32..a51eda2 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java
@@ -24,4 +24,7 @@
@Select("SELECT * FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream}")
List<StreamProxyItem> selectByAppAndStream(String app, String stream);
+
+ @Select("SELECT * FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream} AND platformId=#{serverGBId}")
+ StreamProxyItem selectOne(String app, String stream, String serverGBId);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index c008d1e..984b994 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -6,6 +6,7 @@
import com.genersoft.iot.vmp.conf.UserSetup;
import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+import com.genersoft.iot.vmp.service.bean.ThirdPartyGB;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
@@ -13,6 +14,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -324,7 +326,7 @@
@Override
public void sendStreamChangeMsg(String type, JSONObject jsonObject) {
- String key = VideoManagerConstants.WVP_MSG_STREAM_CHANGE__PREFIX + type;
+ String key = VideoManagerConstants.WVP_MSG_STREAM_CHANGE_PREFIX + type;
logger.debug("[redis 娴佸彉鍖栦簨浠禲 {}: {}", key, jsonObject.toString());
redis.convertAndSend(key, jsonObject);
}
@@ -350,4 +352,11 @@
if (playLeys == null || playLeys.size() == 0) return null;
return (StreamInfo)redis.get(playLeys.get(0).toString());
}
+
+ @Override
+ public ThirdPartyGB queryMemberNoGBId(String queryKey) {
+ String key = VideoManagerConstants.WVP_STREAM_GB_ID_PREFIX + queryKey;
+ JSONObject jsonObject = (JSONObject)redis.get(key);
+ return JSONObject.toJavaObject(jsonObject, ThirdPartyGB.class);
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
index 9ad44d4..916f8a5 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -5,6 +5,7 @@
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
+import com.genersoft.iot.vmp.service.IGbStreamService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import com.genersoft.iot.vmp.storager.dao.*;
@@ -19,6 +20,7 @@
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -69,6 +71,16 @@
@Autowired
private GbStreamMapper gbStreamMapper;
+;
+
+ @Autowired
+ private PlatformGbStreamMapper platformGbStreamMapper;
+
+ @Autowired
+ private IGbStreamService gbStreamService;
+
+ @Autowired
+ private ParentPlatformMapper parentPlatformMapper;
@Autowired
private VideoStreamSessionManager streamSession;
@@ -356,6 +368,15 @@
// 鏇存柊缂撳瓨
parentPlatformCatch.setParentPlatform(parentPlatform);
redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
+ // 鍏变韩鎵�鏈夎棰戞祦锛岄渶瑕佸皢鐜版湁瑙嗛娴佹坊鍔犲埌姝ゅ钩鍙�
+ List<GbStream> gbStreams = gbStreamMapper.selectAll();
+ if (gbStreams.size() > 0) {
+ if (parentPlatform.isShareAllLiveStream()) {
+ gbStreamService.addPlatformInfo(gbStreams, parentPlatform.getServerGBId());
+ }else {
+ gbStreamService.delPlatformInfo(gbStreams);
+ }
+ }
return result > 0;
}
@@ -561,7 +582,7 @@
* @return
*/
@Override
- public GbStream queryStreamInParentPlatform(String platformId, String gbId) {
+ public List<GbStream> queryStreamInParentPlatform(String platformId, String gbId) {
return gbStreamMapper.queryStreamInPlatform(platformId, gbId);
}
@@ -602,6 +623,22 @@
streamPushMapper.del(streamPushItem.getApp(), streamPushItem.getStream());
streamPushMapper.add(streamPushItem);
gbStreamMapper.setStatus(streamPushItem.getApp(), streamPushItem.getStream(), true);
+ if(!StringUtils.isEmpty(streamPushItem.getGbId() )){
+ // 鏌ユ壘寮�鍚簡鍏ㄩ儴鐩存挱娴佸叡浜殑涓婄骇骞冲彴
+ List<ParentPlatform> parentPlatforms = parentPlatformMapper.selectAllAhareAllLiveStream();
+ if (parentPlatforms.size() > 0) {
+ for (ParentPlatform parentPlatform : parentPlatforms) {
+ streamPushItem.setPlatformId(parentPlatform.getServerGBId());
+ String stream = streamPushItem.getStream();
+ StreamProxyItem streamProxyItems = platformGbStreamMapper.selectOne(streamPushItem.getApp(), stream, parentPlatform.getServerGBId());
+ if (streamProxyItems == null) {
+ platformGbStreamMapper.add(streamPushItem);
+ }
+
+ }
+ }
+ }
+
}
@Override
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
index c266ff6..5fcb6bd 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
@@ -3,6 +3,7 @@
import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
import com.genersoft.iot.vmp.service.IStreamPushService;
+import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -71,4 +72,21 @@
return "fail";
}
}
+
+
+ @ApiOperation("涓涓�涓帹娴�")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "app", value = "搴旂敤鍚�", required = true, dataTypeClass = String.class),
+ @ApiImplicitParam(name = "streamId", value = "娴両D", required = true, dataTypeClass = String.class),
+ })
+ @PostMapping(value = "/stop")
+ @ResponseBody
+ public Object removeFormGB(@RequestParam(required = true)String app, @RequestParam(required = true)String streamId){
+ if (streamPushService.stop(app, streamId)){
+ return "success";
+ }else {
+ return "fail";
+ }
+ }
+
}
diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml
index 752008b..c00ee2a 100644
--- a/src/main/resources/all-application.yml
+++ b/src/main/resources/all-application.yml
@@ -160,6 +160,8 @@
record-push-live: true
# 鏄惁灏嗘棩蹇楀瓨鍌ㄨ繘鏁版嵁搴�
logInDatebase: true
+ # 绗笁鏂瑰尮閰嶏紝鐢ㄤ簬浠巗tream閽熻幏鍙栨湁鏁堜俊鎭�
+ thirdPartyGBIdReg: [\s\S]*
# 鍦ㄧ嚎鏂囨。锛� swagger-ui锛堢敓浜х幆澧冨缓璁叧闂級
swagger-ui:
diff --git a/src/main/resources/wvp.sqlite b/src/main/resources/wvp.sqlite
index f969514..a1df173 100644
--- a/src/main/resources/wvp.sqlite
+++ b/src/main/resources/wvp.sqlite
Binary files differ
diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue
index 9f1a7db..2f3ab2b 100644
--- a/web_src/src/components/PushVideoList.vue
+++ b/web_src/src/components/PushVideoList.vue
@@ -36,7 +36,7 @@
<template slot-scope="scope">
<el-button-group>
<el-button size="mini" icon="el-icon-video-play" @click="playPuhsh(scope.row)">鎾斁</el-button>
- <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="!!scope.row.streamId" @click="stopPuhsh(scope.row)">鍋滄</el-button>
+ <el-button size="mini" icon="el-icon-switch-button" type="danger" @click="stopPuhsh(scope.row)">绉婚櫎</el-button>
<el-button size="mini" icon="el-icon-position" type="primary" v-if="!!!scope.row.gbId" @click="addToGB(scope.row)">鍔犲叆鍥芥爣</el-button>
<el-button size="mini" icon="el-icon-position" type="primary" v-if="!!scope.row.gbId" @click="removeFromGB(scope.row)">绉诲嚭鍥芥爣</el-button>
</el-button-group>
@@ -151,7 +151,21 @@
});
},
stopPuhsh: function(row){
- console.log(row)
+ var that = this;
+ that.$axios({
+ method:"post",
+ url:"/api/push/stop",
+ params: {
+ app: row.app,
+ streamId: row.stream
+ }
+ }).then((res)=>{
+ if (res.data == "success") {
+ that.initData()
+ }
+ }).catch(function (error) {
+ console.log(error);
+ });
},
addToGB: function(row){
this.$refs.addStreamTOGB.openDialog({app: row.app, stream: row.stream, mediaServerId: row.mediaServerId}, this.initData);
@@ -159,16 +173,16 @@
removeFromGB: function(row){
var that = this;
that.$axios({
- method:"delete",
- url:"/api/push/remove_form_gb",
- data:row
- }).then((res)=>{
- if (res.data == "success") {
+ method:"delete",
+ url:"/api/push/remove_form_gb",
+ data:row
+ }).then((res)=>{
+ if (res.data == "success") {
that.initData()
}
- }).catch(function (error) {
- console.log(error);
- });
+ }).catch(function (error) {
+ console.log(error);
+ });
},
dateFormat: function(/** timestamp=0 **/) {
var ts = arguments[0] || 0;
diff --git a/web_src/src/components/StreamProxyList.vue b/web_src/src/components/StreamProxyList.vue
index 27dab67..64e994a 100644
--- a/web_src/src/components/StreamProxyList.vue
+++ b/web_src/src/components/StreamProxyList.vue
@@ -50,6 +50,7 @@
</div>
</template>
</el-table-column>
+ <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" align="center" width="150" show-overflow-tooltip/>
<el-table-column label="杞琀LS" width="120" align="center">
<template slot-scope="scope">
<div slot="reference" class="name-wrapper">
diff --git a/web_src/src/components/dialog/platformEdit.vue b/web_src/src/components/dialog/platformEdit.vue
index cc51652..fad0444 100644
--- a/web_src/src/components/dialog/platformEdit.vue
+++ b/web_src/src/components/dialog/platformEdit.vue
@@ -17,7 +17,7 @@
<el-input v-model="platform.name"></el-input>
</el-form-item>
<el-form-item label="SIP鏈嶅姟鍥芥爣缂栫爜" prop="serverGBId">
- <el-input v-model="platform.serverGBId" clearable></el-input>
+ <el-input v-model="platform.serverGBId" clearable @input="serverGBIdChange"></el-input>
</el-form-item>
<el-form-item label="SIP鏈嶅姟鍥芥爣鍩�" prop="serverGBDomain">
<el-input v-model="platform.serverGBDomain" clearable></el-input>
@@ -29,7 +29,7 @@
<el-input v-model="platform.serverPort" clearable type="number"></el-input>
</el-form-item>
<el-form-item label="璁惧鍥芥爣缂栧彿" prop="deviceGBId">
- <el-input v-model="platform.deviceGBId" clearable></el-input>
+ <el-input v-model="platform.deviceGBId" clearable @input="deviceGBIdChange"></el-input>
</el-form-item>
<el-form-item label="鏈湴IP" prop="deviceIp">
<el-input v-model="platform.deviceIp" :disabled="true"></el-input>
@@ -76,7 +76,7 @@
<el-form-item label="鍏朵粬閫夐」">
<el-checkbox label="鍚敤" v-model="platform.enable" @change="checkExpires"></el-checkbox>
<el-checkbox label="浜戝彴鎺у埗" v-model="platform.ptz"></el-checkbox>
- <el-checkbox label="RTCP淇濇椿" v-model="platform.rtcp"></el-checkbox>
+ <el-checkbox label="鍏变韩鎵�鏈夌洿鎾祦" v-model="platform.shareAllLiveStream"></el-checkbox>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">{{
@@ -97,28 +97,6 @@
name: "platformEdit",
props: {},
computed: {},
- created() {
- this.platform = {
- id: null,
- enable: true,
- ptz: true,
- rtcp: false,
- name: null,
- serverGBId: null,
- serverGBDomain: null,
- serverIP: null,
- serverPort: null,
- deviceGBId: null,
- deviceIp: null,
- devicePort: null,
- username: null,
- password: null,
- expires: 300,
- keepTimeout: 60,
- transport: "UDP",
- characterSet: "GB2312",
- }
- },
data() {
var deviceGBIdRules = async (rule, value, callback) => {
console.log(value);
@@ -158,6 +136,7 @@
keepTimeout: 60,
transport: "UDP",
characterSet: "GB2312",
+ shareAllLiveStream: false,
},
rules: {
name: [{ required: true, message: "璇疯緭鍏ュ钩鍙板悕绉�", trigger: "blur" }],
@@ -198,11 +177,38 @@
console.log(error);
});
}else {
- this.platform = platform;
+ this.platform.id = platform.id;
+ this.platform.enable = platform.enable;
+ this.platform.ptz = platform.ptz;
+ this.platform.rtcp = platform.rtcp;
+ this.platform.name = platform.name;
+ this.platform.serverGBId = platform.serverGBId;
+ this.platform.serverGBDomain = platform.serverGBDomain;
+ this.platform.serverIP = platform.serverIP;
+ this.platform.serverPort = platform.serverPort;
+ this.platform.deviceGBId = platform.deviceGBId;
+ this.platform.deviceIp = platform.deviceIp;
+ this.platform.devicePort = platform.devicePort;
+ this.platform.username = platform.username;
+ this.platform.password = platform.password;
+ this.platform.expires = platform.expires;
+ this.platform.keepTimeout = platform.keepTimeout;
+ this.platform.transport = platform.transport;
+ this.platform.characterSet = platform.characterSet;
+ this.platform.shareAllLiveStream = platform.shareAllLiveStream;
this.onSubmit_text = "淇濆瓨";
}
this.showDialog = true;
this.listChangeCallback = callback;
+ },
+ serverGBIdChange: function () {
+ if (this.platform.serverGBId.length > 10) {
+ this.platform.serverGBDomain = this.platform.serverGBId.substr(0, 10);
+ }
+ },
+ deviceGBIdChange: function () {
+
+ this.platform.username = this.platform.deviceGBId ;
},
onSubmit: function () {
console.log("onSubmit");
@@ -228,10 +234,30 @@
});
},
close: function () {
- console.log("鍏抽棴娣诲姞瑙嗛骞冲彴");
this.showDialog = false;
this.$refs.platform1.resetFields();
this.$refs.platform2.resetFields();
+ this.platform = {
+ id: null,
+ enable: true,
+ ptz: true,
+ rtcp: false,
+ name: null,
+ serverGBId: null,
+ serverGBDomain: null,
+ serverIP: null,
+ serverPort: null,
+ deviceGBId: null,
+ deviceIp: null,
+ devicePort: null,
+ username: null,
+ password: null,
+ expires: 300,
+ keepTimeout: 60,
+ transport: "UDP",
+ characterSet: "GB2312",
+ shareAllLiveStream: false,
+ }
},
deviceGBIdExit: async function (deviceGbId) {
var result = false;
--
Gitblit v1.8.0