Commit b17280522b3569b49c0d524b7ed7fb45ef0e991a

Authored by panlinlin
1 parent f83a192b

增加推流转发到国标,尚不完善

Showing 42 changed files with 720 additions and 509 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStream.java
@@ -12,6 +12,7 @@ public class GbStream extends PlatformGbStream{ @@ -12,6 +12,7 @@ public class GbStream extends PlatformGbStream{
12 private double longitude; 12 private double longitude;
13 private double latitude; 13 private double latitude;
14 private String streamType; 14 private String streamType;
  15 + private boolean status;
15 16
16 public String getApp() { 17 public String getApp() {
17 return app; 18 return app;
@@ -68,4 +69,12 @@ public class GbStream extends PlatformGbStream{ @@ -68,4 +69,12 @@ public class GbStream extends PlatformGbStream{
68 public void setStreamType(String streamType) { 69 public void setStreamType(String streamType) {
69 this.streamType = streamType; 70 this.streamType = streamType;
70 } 71 }
  72 +
  73 + public boolean isStatus() {
  74 + return status;
  75 + }
  76 +
  77 + public void setStatus(boolean status) {
  78 + this.status = status;
  79 + }
71 } 80 }
src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformGbStream.java
@@ -28,4 +28,5 @@ public class PlatformGbStream { @@ -28,4 +28,5 @@ public class PlatformGbStream {
28 public void setPlatformId(String platformId) { 28 public void setPlatformId(String platformId) {
29 this.platformId = platformId; 29 this.platformId = platformId;
30 } 30 }
  31 +
31 } 32 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
@@ -11,7 +11,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; @@ -11,7 +11,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
11 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; 11 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
12 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 12 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
13 import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*; 13 import com.genersoft.iot.vmp.gb28181.transmit.response.impl.*;
14 -import com.genersoft.iot.vmp.vmanager.service.IPlayService; 14 +import com.genersoft.iot.vmp.service.IPlayService;
15 // import org.slf4j.Logger; 15 // import org.slf4j.Logger;
16 // import org.slf4j.LoggerFactory; 16 // import org.slf4j.LoggerFactory;
17 import org.springframework.beans.factory.annotation.Autowired; 17 import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -13,24 +13,20 @@ import javax.sip.message.Response; @@ -13,24 +13,20 @@ import javax.sip.message.Response;
13 13
14 import com.genersoft.iot.vmp.conf.MediaServerConfig; 14 import com.genersoft.iot.vmp.conf.MediaServerConfig;
15 import com.genersoft.iot.vmp.gb28181.bean.*; 15 import com.genersoft.iot.vmp.gb28181.bean.*;
16 -import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;  
17 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; 16 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
18 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; 17 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
19 import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor; 18 import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
20 -import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;  
21 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; 19 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
22 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 20 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
23 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 21 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
24 import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult; 22 import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult;
25 -import com.genersoft.iot.vmp.vmanager.service.IPlayService; 23 +import com.genersoft.iot.vmp.service.IPlayService;
26 import gov.nist.javax.sip.address.AddressImpl; 24 import gov.nist.javax.sip.address.AddressImpl;
27 import gov.nist.javax.sip.address.SipUri; 25 import gov.nist.javax.sip.address.SipUri;
28 import org.slf4j.Logger; 26 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory; 27 import org.slf4j.LoggerFactory;
30 28
31 import java.text.ParseException; 29 import java.text.ParseException;
32 -import java.util.HashMap;  
33 -import java.util.Map;  
34 import java.util.Vector; 30 import java.util.Vector;
35 31
36 /** 32 /**
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -549,7 +549,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor { @@ -549,7 +549,7 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
549 deviceChannel.setLatitude(gbStream.getLatitude()); 549 deviceChannel.setLatitude(gbStream.getLatitude());
550 deviceChannel.setDeviceId(parentPlatform.getDeviceGBId()); 550 deviceChannel.setDeviceId(parentPlatform.getDeviceGBId());
551 deviceChannel.setManufacture("wvp-pro"); 551 deviceChannel.setManufacture("wvp-pro");
552 - deviceChannel.setStatus(1); 552 + deviceChannel.setStatus(gbStream.isStatus()?1:0);
553 // deviceChannel.setParentId(parentPlatform.getDeviceGBId()); 553 // deviceChannel.setParentId(parentPlatform.getDeviceGBId());
554 deviceChannel.setRegisterWay(1); 554 deviceChannel.setRegisterWay(1);
555 deviceChannel.setCivilCode(cmder.getSipConfig().getSipDomain()); 555 deviceChannel.setCivilCode(cmder.getSipConfig().getSipDomain());
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -9,7 +9,7 @@ import com.genersoft.iot.vmp.conf.MediaServerConfig; @@ -9,7 +9,7 @@ import com.genersoft.iot.vmp.conf.MediaServerConfig;
9 import com.genersoft.iot.vmp.gb28181.bean.Device; 9 import com.genersoft.iot.vmp.gb28181.bean.Device;
10 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 10 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
11 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 11 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
12 -import com.genersoft.iot.vmp.vmanager.service.IPlayService; 12 +import com.genersoft.iot.vmp.service.IPlayService;
13 import org.slf4j.Logger; 13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory; 14 import org.slf4j.LoggerFactory;
15 import org.springframework.beans.factory.annotation.Autowired; 15 import org.springframework.beans.factory.annotation.Autowired;
@@ -240,8 +240,9 @@ public class ZLMHttpHookListener { @@ -240,8 +240,9 @@ public class ZLMHttpHookListener {
240 String streamId = json.getString("stream"); 240 String streamId = json.getString("stream");
241 String schema = json.getString("schema"); 241 String schema = json.getString("schema");
242 boolean regist = json.getBoolean("regist"); 242 boolean regist = json.getBoolean("regist");
243 - StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId); 243 +
244 if ("rtp".equals(app) && !regist ) { 244 if ("rtp".equals(app) && !regist ) {
  245 + StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
245 if (streamInfo!=null){ 246 if (streamInfo!=null){
246 redisCatchStorage.stopPlay(streamInfo); 247 redisCatchStorage.stopPlay(streamInfo);
247 storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); 248 storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
@@ -250,8 +251,12 @@ public class ZLMHttpHookListener { @@ -250,8 +251,12 @@ public class ZLMHttpHookListener {
250 redisCatchStorage.stopPlayback(streamInfo); 251 redisCatchStorage.stopPlayback(streamInfo);
251 } 252 }
252 }else { 253 }else {
253 - if (!"rtp".equals(app) && "rtsp".equals(schema)){  
254 - zlmMediaListManager.updateMediaList(); 254 + if (!"rtp".equals(app) && "rtmp".equals(schema)){
  255 + if (regist) {
  256 + zlmMediaListManager.addMedia(app, streamId);
  257 + }else {
  258 + zlmMediaListManager.removeMedia(app, streamId);
  259 + }
255 } 260 }
256 } 261 }
257 JSONObject ret = new JSONObject(); 262 JSONObject ret = new JSONObject();
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookSubscribe.java
@@ -70,6 +70,11 @@ public class ZLMHttpHookSubscribe { @@ -70,6 +70,11 @@ public class ZLMHttpHookSubscribe {
70 return event; 70 return event;
71 } 71 }
72 72
  73 + /**
  74 + * 获取某个类型的所有的订阅
  75 + * @param type
  76 + * @return
  77 + */
73 public List<ZLMHttpHookSubscribe.Event> getSubscribes(HookType type) { 78 public List<ZLMHttpHookSubscribe.Event> getSubscribes(HookType type) {
74 ZLMHttpHookSubscribe.Event event= null; 79 ZLMHttpHookSubscribe.Event event= null;
75 Map<JSONObject, Event> eventMap = allSubscribes.get(type); 80 Map<JSONObject, Event> eventMap = allSubscribes.get(type);
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
1 package com.genersoft.iot.vmp.media.zlm; 1 package com.genersoft.iot.vmp.media.zlm;
2 2
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
4 -import com.alibaba.fastjson.JSONArray;  
5 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
6 import com.alibaba.fastjson.TypeReference; 5 import com.alibaba.fastjson.TypeReference;
7 -import com.genersoft.iot.vmp.common.RealVideo;  
8 -import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;  
9 -import com.genersoft.iot.vmp.gb28181.session.SsrcUtil; 6 +import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  7 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
  8 +import com.genersoft.iot.vmp.gb28181.bean.GbStream;
10 import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; 9 import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
  10 +import com.genersoft.iot.vmp.service.IStreamPushService;
11 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 11 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
12 -import com.genersoft.iot.vmp.storager.impl.RedisCatchStorageImpl; 12 +import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
  13 +import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
  14 +import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
13 import org.slf4j.Logger; 15 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory; 16 import org.slf4j.LoggerFactory;
15 import org.springframework.beans.factory.annotation.Autowired; 17 import org.springframework.beans.factory.annotation.Autowired;
16 -import org.springframework.beans.factory.annotation.Value;  
17 import org.springframework.stereotype.Component; 18 import org.springframework.stereotype.Component;
18 19
19 import java.util.*; 20 import java.util.*;
@@ -29,60 +30,79 @@ public class ZLMMediaListManager { @@ -29,60 +30,79 @@ public class ZLMMediaListManager {
29 @Autowired 30 @Autowired
30 private IRedisCatchStorage redisCatchStorage; 31 private IRedisCatchStorage redisCatchStorage;
31 32
  33 + @Autowired
  34 + private IVideoManagerStorager storager;
  35 +
  36 + @Autowired
  37 + private GbStreamMapper gbStreamMapper;
  38 +
  39 + @Autowired
  40 + private PlatformGbStreamMapper platformGbStreamMapper;
  41 +
  42 + @Autowired
  43 + private IStreamPushService streamPushService;
  44 +
32 45
33 public void updateMediaList() { 46 public void updateMediaList() {
34 - JSONObject mediaList = zlmresTfulUtils.getMediaList();  
35 - if (mediaList == null) return;  
36 - String dataStr = mediaList.getString("data");  
37 -  
38 - Integer code = mediaList.getInteger("code");  
39 - Map<String, RealVideo> result = new HashMap<>();  
40 - if (code == 0 ) {  
41 - if (dataStr != null) {  
42 - List<MediaItem> mediaItems = JSON.parseObject(dataStr, new TypeReference<List<MediaItem>>() {});  
43 - for (MediaItem item : mediaItems) {  
44 - if ("rtp".equals(item.getApp())) {  
45 - continue;  
46 - }  
47 - String key = item.getApp() + "_" + item.getStream();  
48 - RealVideo realVideo = result.get(key);  
49 - if (realVideo == null) {  
50 - realVideo = new RealVideo();  
51 - realVideo.setApp(item.getApp());  
52 - realVideo.setStream(item.getStream());  
53 - realVideo.setAliveSecond(item.getAliveSecond());  
54 - realVideo.setCreateStamp(item.getCreateStamp());  
55 - realVideo.setOriginSock(item.getOriginSock());  
56 - realVideo.setTotalReaderCount(item.getTotalReaderCount());  
57 - realVideo.setOriginType(item.getOriginType());  
58 - realVideo.setOriginTypeStr(item.getOriginTypeStr());  
59 - realVideo.setOriginUrl(item.getOriginUrl());  
60 - realVideo.setCreateStamp(item.getCreateStamp());  
61 - realVideo.setAliveSecond(item.getAliveSecond());  
62 -  
63 - ArrayList<RealVideo.MediaSchema> mediaSchemas = new ArrayList<>();  
64 - realVideo.setSchemas(mediaSchemas);  
65 - realVideo.setTracks(item.getTracks());  
66 - realVideo.setVhost(item.getVhost());  
67 - result.put(key, realVideo);  
68 - }  
69 -  
70 - RealVideo.MediaSchema mediaSchema = new RealVideo.MediaSchema();  
71 - mediaSchema.setSchema(item.getSchema());  
72 - mediaSchema.setBytesSpeed(item.getBytesSpeed());  
73 - realVideo.getSchemas().add(mediaSchema); 47 + storager.clearMediaList();
  48 +
  49 + // 使用异步的当时更新媒体流列表
  50 + zlmresTfulUtils.getMediaList((mediaList ->{
  51 + if (mediaList == null) return;
  52 + String dataStr = mediaList.getString("data");
  53 +
  54 + Integer code = mediaList.getInteger("code");
  55 + Map<String, StreamPushItem> result = new HashMap<>();
  56 + List<StreamPushItem> streamPushItems = null;
  57 + // 获取所有的国标关联
  58 + List<GbStream> gbStreams = gbStreamMapper.selectAll();
  59 + if (code == 0 ) {
  60 + if (dataStr != null) {
  61 + streamPushItems = streamPushService.handleJSON(dataStr);
74 } 62 }
  63 + }else {
  64 + logger.warn("更新视频流失败,错误code: " + code);
  65 + }
75 66
  67 + if (streamPushItems != null) {
  68 + storager.updateMediaList(streamPushItems);
76 } 69 }
77 - }else {  
78 - logger.warn("更新视频流失败,错误code: " + code);  
79 - } 70 + }));
80 71
81 - List<RealVideo> realVideos = new ArrayList<>(result.values());  
82 - Collections.sort(realVideos);  
83 - redisCatchStorage.updateMediaList(realVideos);  
84 } 72 }
85 73
  74 + public void addMedia(String app, String streamId) {
  75 + //使用异步更新推流
  76 + zlmresTfulUtils.getMediaList(app, streamId, "rtmp", json->{
86 77
  78 + if (json == null) return;
  79 + String dataStr = json.getString("data");
87 80
  81 + Integer code = json.getInteger("code");
  82 + Map<String, StreamPushItem> result = new HashMap<>();
  83 + List<StreamPushItem> streamPushItems = null;
  84 + if (code == 0 ) {
  85 + if (dataStr != null) {
  86 + streamPushItems = streamPushService.handleJSON(dataStr);
  87 + }
  88 + }else {
  89 + logger.warn("更新视频流失败,错误code: " + code);
  90 + }
  91 +
  92 + if (streamPushItems != null && streamPushItems.size() == 1) {
  93 + storager.updateMedia(streamPushItems.get(0));
  94 + }
  95 + });
  96 + }
  97 +
  98 +
  99 + public void removeMedia(String app, String streamId) {
  100 + // 查找是否关联了国标, 关联了不删除, 置为离线
  101 + StreamProxyItem streamProxyItem = gbStreamMapper.selectOne(app, streamId);
  102 + if (streamProxyItem == null) {
  103 + storager.removeMedia(app, streamId);
  104 + }else {
  105 + storager.mediaOutline(app, streamId);
  106 + }
  107 + }
88 } 108 }
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
@@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm; @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.zlm;
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
5 import okhttp3.*; 5 import okhttp3.*;
  6 +import org.jetbrains.annotations.NotNull;
6 import org.slf4j.Logger; 7 import org.slf4j.Logger;
7 import org.slf4j.LoggerFactory; 8 import org.slf4j.LoggerFactory;
8 import org.springframework.beans.factory.annotation.Value; 9 import org.springframework.beans.factory.annotation.Value;
@@ -27,7 +28,11 @@ public class ZLMRESTfulUtils { @@ -27,7 +28,11 @@ public class ZLMRESTfulUtils {
27 @Value("${media.secret}") 28 @Value("${media.secret}")
28 private String mediaSecret; 29 private String mediaSecret;
29 30
30 - public JSONObject sendPost(String api, Map<String, Object> param) { 31 + public interface RequestCallback{
  32 + void run(JSONObject response);
  33 + }
  34 +
  35 + public JSONObject sendPost(String api, Map<String, Object> param, RequestCallback callback) {
31 OkHttpClient client = new OkHttpClient(); 36 OkHttpClient client = new OkHttpClient();
32 String url = String.format("http://%s:%s/index/api/%s", mediaIp, mediaPort, api); 37 String url = String.format("http://%s:%s/index/api/%s", mediaIp, mediaPort, api);
33 JSONObject responseJSON = null; 38 JSONObject responseJSON = null;
@@ -47,34 +52,68 @@ public class ZLMRESTfulUtils { @@ -47,34 +52,68 @@ public class ZLMRESTfulUtils {
47 .post(body) 52 .post(body)
48 .url(url) 53 .url(url)
49 .build(); 54 .build();
50 - try {  
51 - Response response = client.newCall(request).execute();  
52 - if (response.isSuccessful()) {  
53 - String responseStr = response.body().string();  
54 - if (responseStr != null) {  
55 - responseJSON = JSON.parseObject(responseStr); 55 + if (callback == null) {
  56 + try {
  57 + Response response = client.newCall(request).execute();
  58 + if (response.isSuccessful()) {
  59 + String responseStr = response.body().string();
  60 + if (responseStr != null) {
  61 + responseJSON = JSON.parseObject(responseStr);
  62 + }
  63 + }
  64 + } catch (ConnectException e) {
  65 + logger.error(String.format("连接ZLM失败: %s, %s", e.getCause().getMessage(), e.getMessage()));
  66 + logger.info("请检查media配置并确认ZLM已启动...");
  67 + }catch (IOException e) {
  68 + e.printStackTrace();
56 } 69 }
  70 + }else {
  71 + client.newCall(request).enqueue(new Callback(){
  72 +
  73 + @Override
  74 + public void onResponse(@NotNull Call call, @NotNull Response response){
  75 + if (response.isSuccessful()) {
  76 + try {
  77 + String responseStr = response.body().string();
  78 + if (responseStr != null) {
  79 + callback.run(JSON.parseObject(responseStr));
  80 + }else {
  81 + callback.run(null);
  82 + }
  83 + } catch (IOException e) {
  84 + e.printStackTrace();
  85 + }
  86 + }
  87 + }
  88 +
  89 + @Override
  90 + public void onFailure(@NotNull Call call, @NotNull IOException e) {
  91 + logger.error(String.format("连接ZLM失败: %s, %s", e.getCause().getMessage(), e.getMessage()));
  92 + logger.info("请检查media配置并确认ZLM已启动...");
  93 + }
  94 + });
57 } 95 }
58 - } catch (ConnectException e) {  
59 - logger.error(String.format("连接ZLM失败: %s, %s", e.getCause().getMessage(), e.getMessage()));  
60 - logger.info("请检查media配置并确认ZLM已启动...");  
61 - }catch (IOException e) {  
62 - e.printStackTrace();  
63 - } 96 +
  97 +
64 98
65 return responseJSON; 99 return responseJSON;
66 } 100 }
67 101
68 - public JSONObject getMediaList(String app, String schema){ 102 + public JSONObject getMediaList(String app, String stream, String schema, RequestCallback callback){
69 Map<String, Object> param = new HashMap<>(); 103 Map<String, Object> param = new HashMap<>();
70 - param.put("app",app);  
71 - param.put("schema",schema); 104 + if (app != null) param.put("app",app);
  105 + if (stream != null) param.put("stream",stream);
  106 + if (schema != null) param.put("schema",schema);
72 param.put("vhost","__defaultVhost__"); 107 param.put("vhost","__defaultVhost__");
73 - return sendPost("getMediaList",param); 108 + return sendPost("getMediaList",param, callback);
  109 + }
  110 +
  111 + public JSONObject getMediaList(String app, String stream){
  112 + return getMediaList(app, stream,null, null);
74 } 113 }
75 114
76 - public JSONObject getMediaList(){  
77 - return sendPost("getMediaList",null); 115 + public JSONObject getMediaList(RequestCallback callback){
  116 + return sendPost("getMediaList",null, callback);
78 } 117 }
79 118
80 public JSONObject getMediaInfo(String app, String schema, String stream){ 119 public JSONObject getMediaInfo(String app, String schema, String stream){
@@ -83,13 +122,13 @@ public class ZLMRESTfulUtils { @@ -83,13 +122,13 @@ public class ZLMRESTfulUtils {
83 param.put("schema",schema); 122 param.put("schema",schema);
84 param.put("stream",stream); 123 param.put("stream",stream);
85 param.put("vhost","__defaultVhost__"); 124 param.put("vhost","__defaultVhost__");
86 - return sendPost("getMediaInfo",param); 125 + return sendPost("getMediaInfo",param, null);
87 } 126 }
88 127
89 public JSONObject getRtpInfo(String stream_id){ 128 public JSONObject getRtpInfo(String stream_id){
90 Map<String, Object> param = new HashMap<>(); 129 Map<String, Object> param = new HashMap<>();
91 param.put("stream_id",stream_id); 130 param.put("stream_id",stream_id);
92 - return sendPost("getRtpInfo",param); 131 + return sendPost("getRtpInfo",param, null);
93 } 132 }
94 133
95 public JSONObject addFFmpegSource(String src_url, String dst_url, String timeout_ms){ 134 public JSONObject addFFmpegSource(String src_url, String dst_url, String timeout_ms){
@@ -99,37 +138,37 @@ public class ZLMRESTfulUtils { @@ -99,37 +138,37 @@ public class ZLMRESTfulUtils {
99 param.put("src_url", src_url); 138 param.put("src_url", src_url);
100 param.put("dst_url", dst_url); 139 param.put("dst_url", dst_url);
101 param.put("timeout_ms", timeout_ms); 140 param.put("timeout_ms", timeout_ms);
102 - return sendPost("addFFmpegSource",param); 141 + return sendPost("addFFmpegSource",param, null);
103 } 142 }
104 143
105 public JSONObject delFFmpegSource(String key){ 144 public JSONObject delFFmpegSource(String key){
106 Map<String, Object> param = new HashMap<>(); 145 Map<String, Object> param = new HashMap<>();
107 param.put("key", key); 146 param.put("key", key);
108 - return sendPost("delFFmpegSource",param); 147 + return sendPost("delFFmpegSource",param, null);
109 } 148 }
110 149
111 public JSONObject getMediaServerConfig(){ 150 public JSONObject getMediaServerConfig(){
112 - return sendPost("getServerConfig",null); 151 + return sendPost("getServerConfig",null, null);
113 } 152 }
114 153
115 public JSONObject setServerConfig(Map<String, Object> param){ 154 public JSONObject setServerConfig(Map<String, Object> param){
116 - return sendPost("setServerConfig",param); 155 + return sendPost("setServerConfig",param, null);
117 } 156 }
118 157
119 public JSONObject openRtpServer(Map<String, Object> param){ 158 public JSONObject openRtpServer(Map<String, Object> param){
120 - return sendPost("openRtpServer",param); 159 + return sendPost("openRtpServer",param, null);
121 } 160 }
122 161
123 public JSONObject closeRtpServer(Map<String, Object> param) { 162 public JSONObject closeRtpServer(Map<String, Object> param) {
124 - return sendPost("closeRtpServer",param); 163 + return sendPost("closeRtpServer",param, null);
125 } 164 }
126 165
127 public JSONObject startSendRtp(Map<String, Object> param) { 166 public JSONObject startSendRtp(Map<String, Object> param) {
128 - return sendPost("startSendRtp",param); 167 + return sendPost("startSendRtp",param, null);
129 } 168 }
130 169
131 public JSONObject stopSendRtp(Map<String, Object> param) { 170 public JSONObject stopSendRtp(Map<String, Object> param) {
132 - return sendPost("stopSendRtp",param); 171 + return sendPost("stopSendRtp",param, null);
133 } 172 }
134 173
135 public JSONObject addStreamProxy(String app, String stream, String url, boolean enable_hls, boolean enable_mp4, String rtp_type) { 174 public JSONObject addStreamProxy(String app, String stream, String url, boolean enable_hls, boolean enable_mp4, String rtp_type) {
@@ -141,7 +180,7 @@ public class ZLMRESTfulUtils { @@ -141,7 +180,7 @@ public class ZLMRESTfulUtils {
141 param.put("enable_hls", enable_hls?1:0); 180 param.put("enable_hls", enable_hls?1:0);
142 param.put("enable_mp4", enable_mp4?1:0); 181 param.put("enable_mp4", enable_mp4?1:0);
143 param.put("rtp_type", rtp_type); 182 param.put("rtp_type", rtp_type);
144 - return sendPost("addStreamProxy",param); 183 + return sendPost("addStreamProxy",param, null);
145 } 184 }
146 185
147 public JSONObject closeStreams(String app, String stream) { 186 public JSONObject closeStreams(String app, String stream) {
@@ -150,6 +189,6 @@ public class ZLMRESTfulUtils { @@ -150,6 +189,6 @@ public class ZLMRESTfulUtils {
150 param.put("app", app); 189 param.put("app", app);
151 param.put("stream", stream); 190 param.put("stream", stream);
152 param.put("force", 1); 191 param.put("force", 1);
153 - return sendPost("close_streams",param); 192 + return sendPost("close_streams",param, null);
154 } 193 }
155 } 194 }
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
@@ -8,7 +8,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; @@ -8,7 +8,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
8 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 8 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
9 //import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 9 //import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
10 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 10 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
11 -import com.genersoft.iot.vmp.vmanager.service.IStreamProxyService; 11 +import com.genersoft.iot.vmp.service.IStreamProxyService;
12 import org.slf4j.Logger; 12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory; 13 import org.slf4j.LoggerFactory;
14 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
@@ -75,9 +75,8 @@ public class ZLMRunner implements CommandLineRunner { @@ -75,9 +75,8 @@ public class ZLMRunner implements CommandLineRunner {
75 75
76 @Override 76 @Override
77 public void run(String... strings) throws Exception { 77 public void run(String... strings) throws Exception {
78 - JSONObject subscribeKey = new JSONObject();  
79 // 订阅 zlm启动事件 78 // 订阅 zlm启动事件
80 - hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,subscribeKey,(response)->{ 79 + hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,null,(response)->{
81 MediaServerConfig mediaServerConfig = JSONObject.toJavaObject(response, MediaServerConfig.class); 80 MediaServerConfig mediaServerConfig = JSONObject.toJavaObject(response, MediaServerConfig.class);
82 zLmRunning(mediaServerConfig); 81 zLmRunning(mediaServerConfig);
83 }); 82 });
@@ -155,7 +154,7 @@ public class ZLMRunner implements CommandLineRunner { @@ -155,7 +154,7 @@ public class ZLMRunner implements CommandLineRunner {
155 logger.info("zlm接入成功..."); 154 logger.info("zlm接入成功...");
156 if (autoConfig) saveZLMConfig(); 155 if (autoConfig) saveZLMConfig();
157 MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo(); 156 MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
158 - if (System.currentTimeMillis() - mediaInfo.getUpdateTime() < 50){ 157 + if (mediaInfo != null && System.currentTimeMillis() - mediaInfo.getUpdateTime() < 50){
159 logger.info("zlm刚刚更新,忽略这次更新"); 158 logger.info("zlm刚刚更新,忽略这次更新");
160 return; 159 return;
161 } 160 }
src/main/java/com/genersoft/iot/vmp/common/RealVideo.java renamed to src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamPushItem.java
1 -package com.genersoft.iot.vmp.common; 1 +package com.genersoft.iot.vmp.media.zlm.dto;
2 2
3 -import com.alibaba.fastjson.JSONObject;  
4 -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; 3 +import com.genersoft.iot.vmp.gb28181.bean.GbStream;
5 import org.jetbrains.annotations.NotNull; 4 import org.jetbrains.annotations.NotNull;
6 5
7 import java.util.List; 6 import java.util.List;
8 7
9 8
10 -public class RealVideo implements Comparable<RealVideo>{ 9 +public class StreamPushItem extends GbStream implements Comparable<StreamPushItem>{
11 10
12 /** 11 /**
13 * 应用名 12 * 应用名
@@ -85,9 +84,10 @@ public class RealVideo implements Comparable&lt;RealVideo&gt;{ @@ -85,9 +84,10 @@ public class RealVideo implements Comparable&lt;RealVideo&gt;{
85 this.vhost = vhost; 84 this.vhost = vhost;
86 } 85 }
87 86
  87 +
88 @Override 88 @Override
89 - public int compareTo(@NotNull RealVideo realVideo) {  
90 - return new Long(this.createStamp - realVideo.getCreateStamp().intValue()).intValue(); 89 + public int compareTo(@NotNull StreamPushItem streamPushItem) {
  90 + return new Long(this.createStamp - streamPushItem.getCreateStamp().intValue()).intValue();
91 } 91 }
92 92
93 public static class MediaSchema { 93 public static class MediaSchema {
src/main/java/com/genersoft/iot/vmp/vmanager/service/IGbStreamService.java renamed to src/main/java/com/genersoft/iot/vmp/service/IGbStreamService.java
1 -package com.genersoft.iot.vmp.vmanager.service; 1 +package com.genersoft.iot.vmp.service;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 3 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
4 -import com.genersoft.iot.vmp.gb28181.bean.PlatformGbStream;  
5 import com.github.pagehelper.PageInfo; 4 import com.github.pagehelper.PageInfo;
6 5
7 import java.util.List; 6 import java.util.List;
src/main/java/com/genersoft/iot/vmp/vmanager/service/IMediaService.java renamed to src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
1 -package com.genersoft.iot.vmp.vmanager.service; 1 +package com.genersoft.iot.vmp.service;
2 2
3 import com.genersoft.iot.vmp.common.StreamInfo; 3 import com.genersoft.iot.vmp.common.StreamInfo;
  4 +import com.genersoft.iot.vmp.gb28181.bean.GbStream;
  5 +import com.genersoft.iot.vmp.gb28181.bean.PlatformGbStream;
4 6
5 /** 7 /**
6 * 媒体信息业务 8 * 媒体信息业务
@@ -22,4 +24,5 @@ public interface IMediaService { @@ -22,4 +24,5 @@ public interface IMediaService {
22 * @return 24 * @return
23 */ 25 */
24 StreamInfo getStreamInfoByAppAndStream(String app, String stream); 26 StreamInfo getStreamInfoByAppAndStream(String app, String stream);
  27 +
25 } 28 }
src/main/java/com/genersoft/iot/vmp/vmanager/service/IPlayService.java renamed to src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
1 -package com.genersoft.iot.vmp.vmanager.service; 1 +package com.genersoft.iot.vmp.service;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; 4 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
src/main/java/com/genersoft/iot/vmp/vmanager/service/IStreamProxyService.java renamed to src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java
1 -package com.genersoft.iot.vmp.vmanager.service; 1 +package com.genersoft.iot.vmp.service;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; 4 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java 0 → 100644
  1 +package com.genersoft.iot.vmp.service;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import com.genersoft.iot.vmp.gb28181.bean.GbStream;
  5 +import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  6 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
  7 +import com.github.pagehelper.PageInfo;
  8 +
  9 +import java.util.List;
  10 +
  11 +public interface IStreamPushService {
  12 +
  13 + List<StreamPushItem> handleJSON(String json);
  14 +
  15 + /**
  16 + * 将应用名和流ID加入国标关联
  17 + * @param stream
  18 + * @return
  19 + */
  20 + boolean saveToGB(GbStream stream);
  21 +
  22 + /**
  23 + * 将应用名和流ID移出国标关联
  24 + * @param stream
  25 + * @return
  26 + */
  27 + boolean removeFromGB(GbStream stream);
  28 +
  29 + /**
  30 + * 获取
  31 + * @param page
  32 + * @param count
  33 + * @return
  34 + */
  35 + PageInfo<StreamPushItem> getPushList(Integer page, Integer count);
  36 +}
src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/GbStreamServiceImpl.java renamed to src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java
1 -package com.genersoft.iot.vmp.vmanager.service.impl; 1 +package com.genersoft.iot.vmp.service.impl;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 3 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
4 -import com.genersoft.iot.vmp.gb28181.bean.PlatformGbStream;  
5 -import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;  
6 import com.genersoft.iot.vmp.storager.dao.GbStreamMapper; 4 import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
7 -import com.genersoft.iot.vmp.storager.dao.PlarfotmGbStreamMapper;  
8 -import com.genersoft.iot.vmp.vmanager.platform.PlatformController;  
9 -import com.genersoft.iot.vmp.vmanager.service.IGbStreamService; 5 +import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
  6 +import com.genersoft.iot.vmp.service.IGbStreamService;
10 import com.github.pagehelper.PageHelper; 7 import com.github.pagehelper.PageHelper;
11 import com.github.pagehelper.PageInfo; 8 import com.github.pagehelper.PageInfo;
12 import org.slf4j.Logger; 9 import org.slf4j.Logger;
@@ -34,7 +31,7 @@ public class GbStreamServiceImpl implements IGbStreamService { @@ -34,7 +31,7 @@ public class GbStreamServiceImpl implements IGbStreamService {
34 private GbStreamMapper gbStreamMapper; 31 private GbStreamMapper gbStreamMapper;
35 32
36 @Autowired 33 @Autowired
37 - private PlarfotmGbStreamMapper plarfotmGbStreamMapper; 34 + private PlatformGbStreamMapper platformGbStreamMapper;
38 35
39 @Override 36 @Override
40 public PageInfo<GbStream> getAll(Integer page, Integer count) { 37 public PageInfo<GbStream> getAll(Integer page, Integer count) {
@@ -57,7 +54,7 @@ public class GbStreamServiceImpl implements IGbStreamService { @@ -57,7 +54,7 @@ public class GbStreamServiceImpl implements IGbStreamService {
57 try { 54 try {
58 for (GbStream gbStream : gbStreams) { 55 for (GbStream gbStream : gbStreams) {
59 gbStream.setPlatformId(platformId); 56 gbStream.setPlatformId(platformId);
60 - plarfotmGbStreamMapper.add(gbStream); 57 + platformGbStreamMapper.add(gbStream);
61 } 58 }
62 dataSourceTransactionManager.commit(transactionStatus); //手动提交 59 dataSourceTransactionManager.commit(transactionStatus); //手动提交
63 result = true; 60 result = true;
@@ -76,7 +73,7 @@ public class GbStreamServiceImpl implements IGbStreamService { @@ -76,7 +73,7 @@ public class GbStreamServiceImpl implements IGbStreamService {
76 TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); 73 TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
77 try { 74 try {
78 for (GbStream gbStream : gbStreams) { 75 for (GbStream gbStream : gbStreams) {
79 - plarfotmGbStreamMapper.delByAppAndStream(gbStream.getApp(), gbStream.getStream()); 76 + platformGbStreamMapper.delByAppAndStream(gbStream.getApp(), gbStream.getStream());
80 } 77 }
81 dataSourceTransactionManager.commit(transactionStatus); //手动提交 78 dataSourceTransactionManager.commit(transactionStatus); //手动提交
82 result = true; 79 result = true;
src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/MediaServiceImpl.java renamed to src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
1 -package com.genersoft.iot.vmp.vmanager.service.impl; 1 +package com.genersoft.iot.vmp.service.impl;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.conf.MediaServerConfig; 5 import com.genersoft.iot.vmp.conf.MediaServerConfig;
  6 +import com.genersoft.iot.vmp.gb28181.bean.GbStream;
6 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 7 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
7 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 8 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
8 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 9 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
9 -import com.genersoft.iot.vmp.vmanager.service.IMediaService;  
10 -import com.genersoft.iot.vmp.vmanager.service.IStreamProxyService; 10 +import com.genersoft.iot.vmp.service.IMediaService;
  11 +import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
11 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
13 14
@@ -23,6 +24,8 @@ public class MediaServiceImpl implements IMediaService { @@ -23,6 +24,8 @@ public class MediaServiceImpl implements IMediaService {
23 @Autowired 24 @Autowired
24 private ZLMRESTfulUtils zlmresTfulUtils; 25 private ZLMRESTfulUtils zlmresTfulUtils;
25 26
  27 +
  28 +
26 @Override 29 @Override
27 public StreamInfo getStreamInfoByAppAndStream(String app, String stream) { 30 public StreamInfo getStreamInfoByAppAndStream(String app, String stream) {
28 MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo(); 31 MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
@@ -51,4 +54,7 @@ public class MediaServiceImpl implements IMediaService { @@ -51,4 +54,7 @@ public class MediaServiceImpl implements IMediaService {
51 } 54 }
52 return streamInfo; 55 return streamInfo;
53 } 56 }
  57 +
  58 +
  59 +
54 } 60 }
src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/PlayServiceImpl.java renamed to src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
1 -package com.genersoft.iot.vmp.vmanager.service.impl; 1 +package com.genersoft.iot.vmp.service.impl;
2 2
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
4 import com.alibaba.fastjson.JSONObject; 4 import com.alibaba.fastjson.JSONObject;
5 import com.genersoft.iot.vmp.common.StreamInfo; 5 import com.genersoft.iot.vmp.common.StreamInfo;
6 -import com.genersoft.iot.vmp.conf.MediaServerConfig;  
7 import com.genersoft.iot.vmp.gb28181.bean.Device; 6 import com.genersoft.iot.vmp.gb28181.bean.Device;
8 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; 7 import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
9 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; 8 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
@@ -15,8 +14,8 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; @@ -15,8 +14,8 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
15 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 14 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
16 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 15 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
17 import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult; 16 import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult;
18 -import com.genersoft.iot.vmp.vmanager.service.IMediaService;  
19 -import com.genersoft.iot.vmp.vmanager.service.IPlayService; 17 +import com.genersoft.iot.vmp.service.IMediaService;
  18 +import com.genersoft.iot.vmp.service.IPlayService;
20 import org.slf4j.Logger; 19 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory; 20 import org.slf4j.LoggerFactory;
22 import org.springframework.beans.factory.annotation.Autowired; 21 import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/genersoft/iot/vmp/vmanager/service/impl/StreamProxyServiceImpl.java renamed to src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
1 -package com.genersoft.iot.vmp.vmanager.service.impl; 1 +package com.genersoft.iot.vmp.service.impl;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.conf.MediaServerConfig; 4 import com.genersoft.iot.vmp.conf.MediaServerConfig;
@@ -7,9 +7,9 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; @@ -7,9 +7,9 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
7 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 7 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
8 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 8 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
9 import com.genersoft.iot.vmp.storager.dao.GbStreamMapper; 9 import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
10 -import com.genersoft.iot.vmp.storager.dao.PlarfotmGbStreamMapper; 10 +import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
11 import com.genersoft.iot.vmp.storager.dao.StreamProxyMapper; 11 import com.genersoft.iot.vmp.storager.dao.StreamProxyMapper;
12 -import com.genersoft.iot.vmp.vmanager.service.IStreamProxyService; 12 +import com.genersoft.iot.vmp.service.IStreamProxyService;
13 import com.github.pagehelper.PageInfo; 13 import com.github.pagehelper.PageInfo;
14 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
15 import org.springframework.stereotype.Service; 15 import org.springframework.stereotype.Service;
@@ -36,7 +36,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { @@ -36,7 +36,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
36 private GbStreamMapper gbStreamMapper; 36 private GbStreamMapper gbStreamMapper;
37 37
38 @Autowired 38 @Autowired
39 - private PlarfotmGbStreamMapper plarfotmGbStreamMapper; 39 + private PlatformGbStreamMapper platformGbStreamMapper;
40 40
41 41
42 @Override 42 @Override
@@ -94,7 +94,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService { @@ -94,7 +94,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
94 videoManagerStorager.deleteStreamProxy(app, stream); 94 videoManagerStorager.deleteStreamProxy(app, stream);
95 // 如果关联了国标那么移除关联 95 // 如果关联了国标那么移除关联
96 gbStreamMapper.del(app, stream); 96 gbStreamMapper.del(app, stream);
97 - plarfotmGbStreamMapper.delByAppAndStream(app, stream); 97 + platformGbStreamMapper.delByAppAndStream(app, stream);
98 // TODO 如果关联的推流, 那么状态设置为离线 98 // TODO 如果关联的推流, 那么状态设置为离线
99 } 99 }
100 } 100 }
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java 0 → 100644
  1 +package com.genersoft.iot.vmp.service.impl;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.JSONObject;
  5 +import com.alibaba.fastjson.TypeReference;
  6 +import com.genersoft.iot.vmp.gb28181.bean.GbStream;
  7 +import com.genersoft.iot.vmp.media.zlm.dto.MediaItem;
  8 +import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  9 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
  10 +import com.genersoft.iot.vmp.service.IStreamPushService;
  11 +import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
  12 +import com.genersoft.iot.vmp.storager.dao.StreamPushMapper;
  13 +import com.github.pagehelper.PageHelper;
  14 +import com.github.pagehelper.PageInfo;
  15 +import org.springframework.beans.factory.annotation.Autowired;
  16 +import org.springframework.stereotype.Service;
  17 +
  18 +import java.util.ArrayList;
  19 +import java.util.HashMap;
  20 +import java.util.List;
  21 +import java.util.Map;
  22 +
  23 +@Service
  24 +public class StreamPushServiceImpl implements IStreamPushService {
  25 +
  26 + @Autowired
  27 + private GbStreamMapper gbStreamMapper;
  28 +
  29 + @Autowired
  30 + private StreamPushMapper streamPushMapper;
  31 +
  32 + @Override
  33 + public List<StreamPushItem> handleJSON(String jsonData) {
  34 + if (jsonData == null) return null;
  35 +
  36 + Map<String, StreamPushItem> result = new HashMap<>();
  37 +
  38 + List<MediaItem> mediaItems = JSON.parseObject(jsonData, new TypeReference<List<MediaItem>>() {});
  39 + for (MediaItem item : mediaItems) {
  40 +
  41 + // 不保存国标推理以及拉流代理的流
  42 + if (item.getOriginType() == 3 || item.getOriginType() == 4 || item.getOriginType() == 5) {
  43 + continue;
  44 + }
  45 + String key = item.getApp() + "_" + item.getStream();
  46 + StreamPushItem streamPushItem = result.get(key);
  47 + if (streamPushItem == null) {
  48 + streamPushItem = new StreamPushItem();
  49 + streamPushItem.setApp(item.getApp());
  50 + streamPushItem.setStream(item.getStream());
  51 + streamPushItem.setAliveSecond(item.getAliveSecond());
  52 + streamPushItem.setCreateStamp(item.getCreateStamp());
  53 + streamPushItem.setOriginSock(item.getOriginSock());
  54 + streamPushItem.setTotalReaderCount(item.getTotalReaderCount());
  55 + streamPushItem.setOriginType(item.getOriginType());
  56 + streamPushItem.setOriginTypeStr(item.getOriginTypeStr());
  57 + streamPushItem.setOriginUrl(item.getOriginUrl());
  58 + streamPushItem.setCreateStamp(item.getCreateStamp());
  59 + streamPushItem.setAliveSecond(item.getAliveSecond());
  60 + streamPushItem.setStatus(true);
  61 + streamPushItem.setVhost(item.getVhost());
  62 + result.put(key, streamPushItem);
  63 + }
  64 + }
  65 +
  66 + return new ArrayList<>(result.values());
  67 + }
  68 +
  69 + @Override
  70 + public PageInfo<StreamPushItem> getPushList(Integer page, Integer count) {
  71 + PageHelper.startPage(page, count);
  72 + List<StreamPushItem> all = streamPushMapper.selectAll();
  73 + return new PageInfo<>(all);
  74 + }
  75 +
  76 + @Override
  77 + public boolean saveToGB(GbStream stream) {
  78 + stream.setStreamType("push");
  79 + stream.setStatus(true);
  80 + int add = gbStreamMapper.add(stream);
  81 + return add > 0;
  82 + }
  83 +
  84 + @Override
  85 + public boolean removeFromGB(GbStream stream) {
  86 + int del = gbStreamMapper.del(stream.getApp(), stream.getStream());
  87 + return del > 0;
  88 + }
  89 +}
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
1 package com.genersoft.iot.vmp.storager; 1 package com.genersoft.iot.vmp.storager;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 -import com.genersoft.iot.vmp.common.RealVideo; 4 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
5 import com.genersoft.iot.vmp.common.StreamInfo; 5 import com.genersoft.iot.vmp.common.StreamInfo;
6 import com.genersoft.iot.vmp.conf.MediaServerConfig; 6 import com.genersoft.iot.vmp.conf.MediaServerConfig;
7 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 7 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
@@ -107,15 +107,4 @@ public interface IRedisCatchStorage { @@ -107,15 +107,4 @@ public interface IRedisCatchStorage {
107 */ 107 */
108 boolean isChannelSendingRTP(String channelId); 108 boolean isChannelSendingRTP(String channelId);
109 109
110 - /**  
111 - * 更新媒体流列表  
112 - * @param mediaList  
113 - */  
114 - void updateMediaList(List<RealVideo> mediaList);  
115 -  
116 - /**  
117 - * 获取当前媒体流列表  
118 - * @return List<RealVideo>  
119 - */  
120 - JSONObject getMediaList(int start, int end);  
121 } 110 }
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -4,6 +4,7 @@ import java.util.List; @@ -4,6 +4,7 @@ import java.util.List;
4 4
5 import com.genersoft.iot.vmp.gb28181.bean.*; 5 import com.genersoft.iot.vmp.gb28181.bean.*;
6 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  7 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
7 import com.genersoft.iot.vmp.vmanager.platform.bean.ChannelReduce; 8 import com.genersoft.iot.vmp.vmanager.platform.bean.ChannelReduce;
8 import com.github.pagehelper.PageInfo; 9 import com.github.pagehelper.PageInfo;
9 10
@@ -319,4 +320,36 @@ public interface IVideoManagerStorager { @@ -319,4 +320,36 @@ public interface IVideoManagerStorager {
319 * @return 320 * @return
320 */ 321 */
321 List<GbStream> queryGbStreamListInPlatform(String platformId); 322 List<GbStream> queryGbStreamListInPlatform(String platformId);
  323 +
  324 + /**
  325 + * 批量更新推流列表
  326 + * @param streamPushItems
  327 + */
  328 + void updateMediaList(List<StreamPushItem> streamPushItems);
  329 +
  330 + /**
  331 + * 更新单个推流
  332 + * @param streamPushItem
  333 + */
  334 + void updateMedia(StreamPushItem streamPushItem);
  335 +
  336 + /**
  337 + * 移除单个推流
  338 + * @param app
  339 + * @param stream
  340 + */
  341 + void removeMedia(String app, String stream);
  342 +
  343 +
  344 + /**
  345 + * 清空推流列表
  346 + */
  347 + void clearMediaList();
  348 +
  349 + /**
  350 + * 设置流离线
  351 + * @param app
  352 + * @param streamId
  353 + */
  354 + void mediaOutline(String app, String streamId);
322 } 355 }
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
@@ -12,9 +12,9 @@ import java.util.List; @@ -12,9 +12,9 @@ import java.util.List;
12 public interface GbStreamMapper { 12 public interface GbStreamMapper {
13 13
14 @Insert("INSERT INTO gb_stream (app, stream, gbId, name, " + 14 @Insert("INSERT INTO gb_stream (app, stream, gbId, name, " +
15 - "longitude, latitude, streamType) VALUES" + 15 + "longitude, latitude, streamType, status) VALUES" +
16 "('${app}', '${stream}', '${gbId}', '${name}', " + 16 "('${app}', '${stream}', '${gbId}', '${name}', " +
17 - "'${longitude}', '${latitude}', '${streamType}')") 17 + "'${longitude}', '${latitude}', '${streamType}', ${status})")
18 int add(GbStream gbStream); 18 int add(GbStream gbStream);
19 19
20 @Update("UPDATE gb_stream " + 20 @Update("UPDATE gb_stream " +
@@ -24,7 +24,8 @@ public interface GbStreamMapper { @@ -24,7 +24,8 @@ public interface GbStreamMapper {
24 "name=#{name}," + 24 "name=#{name}," +
25 "streamType=#{streamType}," + 25 "streamType=#{streamType}," +
26 "longitude=#{longitude}, " + 26 "longitude=#{longitude}, " +
27 - "latitude=#{latitude}, " + 27 + "latitude=#{latitude} " +
  28 + "status=${status} " +
28 "WHERE app=#{app} AND stream=#{stream} AND gbId=#{gbId}") 29 "WHERE app=#{app} AND stream=#{stream} AND gbId=#{gbId}")
29 int update(GbStream gbStream); 30 int update(GbStream gbStream);
30 31
@@ -46,4 +47,9 @@ public interface GbStreamMapper { @@ -46,4 +47,9 @@ public interface GbStreamMapper {
46 "LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream " + 47 "LEFT JOIN platform_gb_stream pgs ON gs.app = pgs.app AND gs.stream = pgs.stream " +
47 "WHERE pgs.platformId = '${platformId}'") 48 "WHERE pgs.platformId = '${platformId}'")
48 List<GbStream> queryGbStreamListInPlatform(String platformId); 49 List<GbStream> queryGbStreamListInPlatform(String platformId);
  50 +
  51 + @Update("UPDATE gb_stream " +
  52 + "SET status=${status} " +
  53 + "WHERE app=#{app} AND stream=#{stream}")
  54 + void setStatus(String app, String stream, boolean status);
49 } 55 }
src/main/java/com/genersoft/iot/vmp/storager/dao/PlarfotmGbStreamMapper.java renamed to src/main/java/com/genersoft/iot/vmp/storager/dao/PlatformGbStreamMapper.java
@@ -11,7 +11,7 @@ import java.util.List; @@ -11,7 +11,7 @@ import java.util.List;
11 11
12 @Mapper 12 @Mapper
13 @Repository 13 @Repository
14 -public interface PlarfotmGbStreamMapper { 14 +public interface PlatformGbStreamMapper {
15 15
16 @Insert("INSERT INTO platform_gb_stream (app, stream, platformId) VALUES" + 16 @Insert("INSERT INTO platform_gb_stream (app, stream, platformId) VALUES" +
17 "('${app}', '${stream}', '${platformId}')") 17 "('${app}', '${stream}', '${platformId}')")
@@ -20,9 +20,9 @@ public interface PlarfotmGbStreamMapper { @@ -20,9 +20,9 @@ public interface PlarfotmGbStreamMapper {
20 @Delete("DELETE FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream}") 20 @Delete("DELETE FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream}")
21 int delByAppAndStream(String app, String stream); 21 int delByAppAndStream(String app, String stream);
22 22
23 - @Delete("DELETE FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream}") 23 + @Delete("DELETE FROM platform_gb_stream WHERE platformId=#{platformId}")
24 int delByPlatformId(String platformId); 24 int delByPlatformId(String platformId);
25 25
26 - @Select("SELECT * FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream} AND platformId=#{platformId}")  
27 - StreamProxyItem selectOne(String app, String stream, String platformId); 26 + @Select("SELECT * FROM platform_gb_stream WHERE app=#{app} AND stream=#{stream}")
  27 + List<StreamProxyItem> selectByAppAndStream(String app, String stream);
28 } 28 }
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java 0 → 100644
  1 +package com.genersoft.iot.vmp.storager.dao;
  2 +
  3 +import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  4 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
  5 +import org.apache.ibatis.annotations.*;
  6 +import org.springframework.stereotype.Repository;
  7 +
  8 +import java.util.List;
  9 +
  10 +@Mapper
  11 +@Repository
  12 +public interface StreamPushMapper {
  13 +
  14 + @Insert("INSERT INTO stream_push (app, stream, totalReaderCount, originType, originTypeStr, " +
  15 + "createStamp, aliveSecond) VALUES" +
  16 + "('${app}', '${stream}', '${totalReaderCount}', '${originType}', '${originTypeStr}', " +
  17 + "'${createStamp}', '${aliveSecond}' )")
  18 + int add(StreamPushItem streamPushItem);
  19 +
  20 + @Update("UPDATE stream_push " +
  21 + "SET app=#{app}," +
  22 + "stream=#{stream}," +
  23 + "totalReaderCount=#{totalReaderCount}, " +
  24 + "originType=#{originType}," +
  25 + "originTypeStr=#{originTypeStr}, " +
  26 + "createStamp=#{createStamp}, " +
  27 + "aliveSecond=#{aliveSecond} " +
  28 + "WHERE app=#{app} AND stream=#{stream}")
  29 + int update(StreamPushItem streamPushItem);
  30 +
  31 + @Delete("DELETE FROM stream_push WHERE app=#{app} AND stream=#{stream}")
  32 + int del(String app, String stream);
  33 +
  34 + @Select("SELECT st.*, pgs.gbId, pgs.status, pgs.name, pgs.longitude, pgs.latitude FROM stream_push st LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream")
  35 + List<StreamPushItem> selectAll();
  36 +
  37 + @Select("SELECT st.*, pgs.gbId, pgs.status, pgs.name, pgs.longitude, pgs.latitude FROM stream_push st LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream WHERE st.enable=${enable}")
  38 + List<StreamPushItem> selectForEnable(boolean enable);
  39 +
  40 + @Select("SELECT st.*, pgs.gbId, pgs.status, pgs.name, pgs.longitude, pgs.latitude FROM stream_push st LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream WHERE st.app=#{app} AND st.stream=#{stream}")
  41 + StreamPushItem selectOne(String app, String stream);
  42 +
  43 + @Insert("<script>" +
  44 + "INSERT INTO stream_push (app, stream, totalReaderCount, originType, originTypeStr, " +
  45 + "createStamp, aliveSecond) " +
  46 + "VALUES <foreach collection='streamPushItems' item='item' index='index' >" +
  47 + "( '${item.app}', '${item.stream}', '${item.totalReaderCount}', '${item.originType}', " +
  48 + "'${item.originTypeStr}','${item.createStamp}', '${item.aliveSecond}' )" +
  49 + " </foreach>" +
  50 + "</script>")
  51 + void addAll(List<StreamPushItem> streamPushItems);
  52 +
  53 + @Delete("DELETE FROM stream_push")
  54 + void clear();
  55 +
  56 +}
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
1 package com.genersoft.iot.vmp.storager.impl; 1 package com.genersoft.iot.vmp.storager.impl;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 -import com.genersoft.iot.vmp.common.RealVideo; 4 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
5 import com.genersoft.iot.vmp.common.StreamInfo; 5 import com.genersoft.iot.vmp.common.StreamInfo;
6 import com.genersoft.iot.vmp.common.VideoManagerConstants; 6 import com.genersoft.iot.vmp.common.VideoManagerConstants;
7 import com.genersoft.iot.vmp.conf.MediaServerConfig; 7 import com.genersoft.iot.vmp.conf.MediaServerConfig;
@@ -261,34 +261,4 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -261,34 +261,4 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
261 } 261 }
262 } 262 }
263 263
264 -  
265 - /**  
266 - * 更新媒体流列表  
267 - * @param mediaList  
268 - */  
269 - @Override  
270 - public void updateMediaList(List<RealVideo> mediaList) {  
271 - String key = VideoManagerConstants.MEDIA_STREAM_PREFIX;  
272 - redis.del(key);  
273 - for (int i = 0; i < mediaList.size(); i++) {  
274 - RealVideo realVideo = mediaList.get(i);  
275 - redis.zAdd(key, realVideo, realVideo.getCreateStamp());  
276 - }  
277 - }  
278 -  
279 -  
280 - /**  
281 - * 获取当前媒体流列表  
282 - * @return List<RealVideo>  
283 - */  
284 - @Override  
285 - public JSONObject getMediaList(int start, int end) {  
286 - String key = VideoManagerConstants.MEDIA_STREAM_PREFIX;  
287 - Set<Object> realVideos = redis.ZRange(key, start, end);  
288 - JSONObject jsonObject = new JSONObject();  
289 - jsonObject.put("list", new ArrayList(realVideos));  
290 - jsonObject.put("total", redis.zSize(key));  
291 -  
292 - return jsonObject;  
293 - }  
294 } 264 }
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -4,6 +4,7 @@ import java.util.*; @@ -4,6 +4,7 @@ import java.util.*;
4 4
5 import com.genersoft.iot.vmp.gb28181.bean.*; 5 import com.genersoft.iot.vmp.gb28181.bean.*;
6 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  7 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
7 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 8 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
8 import com.genersoft.iot.vmp.storager.dao.*; 9 import com.genersoft.iot.vmp.storager.dao.*;
9 import com.genersoft.iot.vmp.vmanager.platform.bean.ChannelReduce; 10 import com.genersoft.iot.vmp.vmanager.platform.bean.ChannelReduce;
@@ -54,6 +55,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -54,6 +55,9 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
54 private StreamProxyMapper streamProxyMapper; 55 private StreamProxyMapper streamProxyMapper;
55 56
56 @Autowired 57 @Autowired
  58 + private StreamPushMapper streamPushMapper;
  59 +
  60 + @Autowired
57 private GbStreamMapper gbStreamMapper; 61 private GbStreamMapper gbStreamMapper;
58 62
59 63
@@ -221,9 +225,10 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -221,9 +225,10 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
221 */ 225 */
222 @Override 226 @Override
223 public synchronized boolean outline(String deviceId) { 227 public synchronized boolean outline(String deviceId) {
  228 + System.out.println("更新设备离线: " + deviceId);
224 Device device = deviceMapper.getDeviceByDeviceId(deviceId); 229 Device device = deviceMapper.getDeviceByDeviceId(deviceId);
  230 + if (device == null) return false;
225 device.setOnline(0); 231 device.setOnline(0);
226 - System.out.println("更新设备离线");  
227 return deviceMapper.update(device) > 0; 232 return deviceMapper.update(device) > 0;
228 } 233 }
229 234
@@ -403,6 +408,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -403,6 +408,7 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
403 TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); 408 TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
404 boolean result = false; 409 boolean result = false;
405 streamProxyItem.setStreamType("proxy"); 410 streamProxyItem.setStreamType("proxy");
  411 + streamProxyItem.setStatus(true);
406 try { 412 try {
407 if (gbStreamMapper.add(streamProxyItem)<0 || streamProxyMapper.add(streamProxyItem) < 0) { 413 if (gbStreamMapper.add(streamProxyItem)<0 || streamProxyMapper.add(streamProxyItem) < 0) {
408 //事务回滚 414 //事务回滚
@@ -504,4 +510,37 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager { @@ -504,4 +510,37 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
504 public StreamProxyItem queryStreamProxy(String app, String stream){ 510 public StreamProxyItem queryStreamProxy(String app, String stream){
505 return streamProxyMapper.selectOne(app, stream); 511 return streamProxyMapper.selectOne(app, stream);
506 } 512 }
  513 +
  514 + @Override
  515 + public void updateMediaList(List<StreamPushItem> streamPushItems) {
  516 + if (streamPushItems == null || streamPushItems.size() == 0) return;
  517 + System.out.printf("updateMediaList: " + streamPushItems.size());
  518 + streamPushMapper.addAll(streamPushItems);
  519 + // TODO 待优化
  520 + for (int i = 0; i < streamPushItems.size(); i++) {
  521 + gbStreamMapper.setStatus(streamPushItems.get(i).getApp(), streamPushItems.get(i).getStream(), true);
  522 + }
  523 + }
  524 +
  525 + @Override
  526 + public void updateMedia(StreamPushItem streamPushItem) {
  527 + streamPushMapper.del(streamPushItem.getApp(), streamPushItem.getStream());
  528 + streamPushMapper.add(streamPushItem);
  529 + gbStreamMapper.setStatus(streamPushItem.getApp(), streamPushItem.getStream(), true);
  530 + }
  531 +
  532 + @Override
  533 + public void removeMedia(String app, String stream) {
  534 + streamPushMapper.del(app, stream);
  535 + }
  536 +
  537 + @Override
  538 + public void clearMediaList() {
  539 + streamPushMapper.clear();
  540 + }
  541 +
  542 + @Override
  543 + public void mediaOutline(String app, String streamId) {
  544 + gbStreamMapper.setStatus(app, streamId, false);
  545 + }
507 } 546 }
src/main/java/com/genersoft/iot/vmp/vmanager/gbStream/GbStreamController.java
1 package com.genersoft.iot.vmp.vmanager.gbStream; 1 package com.genersoft.iot.vmp.vmanager.gbStream;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.JSONArray;  
5 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 3 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
6 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 4 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
7 import com.genersoft.iot.vmp.vmanager.gbStream.bean.GbStreamParam; 5 import com.genersoft.iot.vmp.vmanager.gbStream.bean.GbStreamParam;
8 -import com.genersoft.iot.vmp.vmanager.platform.bean.UpdateChannelParam;  
9 -import com.genersoft.iot.vmp.vmanager.service.IGbStreamService; 6 +import com.genersoft.iot.vmp.service.IGbStreamService;
10 import com.github.pagehelper.PageInfo; 7 import com.github.pagehelper.PageInfo;
11 import org.slf4j.Logger; 8 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory; 9 import org.slf4j.LoggerFactory;
13 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
14 import org.springframework.web.bind.annotation.*; 11 import org.springframework.web.bind.annotation.*;
15 12
16 -import java.util.List;  
17 -  
18 @CrossOrigin 13 @CrossOrigin
19 @RestController 14 @RestController
20 @RequestMapping("/api/gbStream") 15 @RequestMapping("/api/gbStream")
src/main/java/com/genersoft/iot/vmp/vmanager/media/MediaController.java
@@ -2,9 +2,13 @@ package com.genersoft.iot.vmp.vmanager.media; @@ -2,9 +2,13 @@ package com.genersoft.iot.vmp.vmanager.media;
2 2
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 import com.genersoft.iot.vmp.common.StreamInfo;
  5 +import com.genersoft.iot.vmp.gb28181.bean.GbStream;
  6 +import com.genersoft.iot.vmp.gb28181.bean.PlatformGbStream;
  7 +import com.genersoft.iot.vmp.service.IStreamPushService;
5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 8 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
6 -import com.genersoft.iot.vmp.vmanager.service.IMediaService;  
7 -import com.genersoft.iot.vmp.vmanager.service.IStreamProxyService; 9 +import com.genersoft.iot.vmp.service.IMediaService;
  10 +import com.genersoft.iot.vmp.service.IStreamProxyService;
  11 +import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
8 import org.slf4j.Logger; 12 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 13 import org.slf4j.LoggerFactory;
10 import org.springframework.beans.factory.annotation.Autowired; 14 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,25 +24,16 @@ public class MediaController { @@ -20,25 +24,16 @@ public class MediaController {
20 private final static Logger logger = LoggerFactory.getLogger(MediaController.class); 24 private final static Logger logger = LoggerFactory.getLogger(MediaController.class);
21 25
22 @Autowired 26 @Autowired
23 - private IRedisCatchStorage redisCatchStorage; 27 + private IVideoManagerStorager storager;
24 28
25 @Autowired 29 @Autowired
26 - private IStreamProxyService streamProxyService; 30 + private IStreamPushService streamPushService;
27 31
28 @Autowired 32 @Autowired
29 private IMediaService mediaService; 33 private IMediaService mediaService;
30 34
31 35
32 - @RequestMapping(value = "/list")  
33 - @ResponseBody  
34 - public JSONObject list( @RequestParam(required = false)Integer page,  
35 - @RequestParam(required = false)Integer count,  
36 - @RequestParam(required = false)String q,  
37 - @RequestParam(required = false)Boolean online ){  
38 36
39 - JSONObject jsonObject = redisCatchStorage.getMediaList(page - 1, page - 1 + count);  
40 - return jsonObject;  
41 - }  
42 37
43 @RequestMapping(value = "/getStreamInfoByAppAndStream") 38 @RequestMapping(value = "/getStreamInfoByAppAndStream")
44 @ResponseBody 39 @ResponseBody
@@ -46,4 +41,6 @@ public class MediaController { @@ -46,4 +41,6 @@ public class MediaController {
46 return mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream); 41 return mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream);
47 } 42 }
48 43
  44 +
  45 +
49 } 46 }
src/main/java/com/genersoft/iot/vmp/vmanager/platformGbStream/PlatformGbStreamController.java
1 package com.genersoft.iot.vmp.vmanager.platformGbStream; 1 package com.genersoft.iot.vmp.vmanager.platformGbStream;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.GbStream; 3 import com.genersoft.iot.vmp.gb28181.bean.GbStream;
4 -import com.genersoft.iot.vmp.gb28181.bean.PlatformGbStream;  
5 import com.genersoft.iot.vmp.storager.IVideoManagerStorager; 4 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
6 -import com.genersoft.iot.vmp.vmanager.service.IGbStreamService; 5 +import com.genersoft.iot.vmp.service.IGbStreamService;
7 import com.github.pagehelper.PageInfo; 6 import com.github.pagehelper.PageInfo;
8 import org.slf4j.Logger; 7 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 8 import org.slf4j.LoggerFactory;
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
@@ -8,8 +8,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; @@ -8,8 +8,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
8 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 8 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
9 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 9 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
10 import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult; 10 import com.genersoft.iot.vmp.vmanager.play.bean.PlayResult;
11 -import com.genersoft.iot.vmp.vmanager.service.IMediaService;  
12 -import com.genersoft.iot.vmp.vmanager.service.IPlayService; 11 +import com.genersoft.iot.vmp.service.IMediaService;
  12 +import com.genersoft.iot.vmp.service.IPlayService;
13 import org.slf4j.Logger; 13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory; 14 import org.slf4j.LoggerFactory;
15 import org.springframework.beans.factory.annotation.Autowired; 15 import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/genersoft/iot/vmp/vmanager/playback/PlaybackController.java
@@ -5,7 +5,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; @@ -5,7 +5,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
5 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; 5 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
6 //import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 6 //import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
7 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 7 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
8 -import com.genersoft.iot.vmp.vmanager.service.IPlayService; 8 +import com.genersoft.iot.vmp.service.IPlayService;
9 import org.slf4j.Logger; 9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory; 10 import org.slf4j.LoggerFactory;
11 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
@@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.vmanager.streamProxy; @@ -3,7 +3,7 @@ package com.genersoft.iot.vmp.vmanager.streamProxy;
3 import com.alibaba.fastjson.JSONObject; 3 import com.alibaba.fastjson.JSONObject;
4 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; 4 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
6 -import com.genersoft.iot.vmp.vmanager.service.IStreamProxyService; 6 +import com.genersoft.iot.vmp.service.IStreamProxyService;
7 import com.github.pagehelper.PageInfo; 7 import com.github.pagehelper.PageInfo;
8 import org.slf4j.Logger; 8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 9 import org.slf4j.LoggerFactory;
src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java 0 → 100644
  1 +package com.genersoft.iot.vmp.vmanager.streamPush;
  2 +
  3 +import com.alibaba.fastjson.JSONObject;
  4 +import com.genersoft.iot.vmp.gb28181.bean.GbStream;
  5 +import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  6 +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
  7 +import com.genersoft.iot.vmp.service.IStreamPushService;
  8 +import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
  9 +import com.genersoft.iot.vmp.vmanager.media.MediaController;
  10 +import com.github.pagehelper.PageInfo;
  11 +import org.slf4j.Logger;
  12 +import org.slf4j.LoggerFactory;
  13 +import org.springframework.beans.factory.annotation.Autowired;
  14 +import org.springframework.stereotype.Controller;
  15 +import org.springframework.web.bind.annotation.*;
  16 +
  17 +@Controller
  18 +@CrossOrigin
  19 +@RequestMapping(value = "/api/push")
  20 +public class StreamPushController {
  21 +
  22 + private final static Logger logger = LoggerFactory.getLogger(StreamPushController.class);
  23 +
  24 + @Autowired
  25 + private IStreamPushService streamPushService;
  26 +
  27 + @RequestMapping(value = "/list")
  28 + @ResponseBody
  29 + public PageInfo<StreamPushItem> list(@RequestParam(required = false)Integer page,
  30 + @RequestParam(required = false)Integer count,
  31 + @RequestParam(required = false)String q,
  32 + @RequestParam(required = false)Boolean online ){
  33 +
  34 + PageInfo<StreamPushItem> pushList = streamPushService.getPushList(page - 1, page - 1 + count);
  35 + return pushList;
  36 + }
  37 +
  38 + @RequestMapping(value = "/saveToGB")
  39 + @ResponseBody
  40 + public Object saveToGB(@RequestBody GbStream stream){
  41 + if (streamPushService.saveToGB(stream)){
  42 + return "success";
  43 + }else {
  44 + return "fail";
  45 + }
  46 + }
  47 +
  48 + @RequestMapping(value = "/removeFormGB")
  49 + @ResponseBody
  50 + public Object removeFormGB(@RequestBody GbStream stream){
  51 + if (streamPushService.removeFromGB(stream)){
  52 + return "success";
  53 + }else {
  54 + return "fail";
  55 + }
  56 + }
  57 +}
src/main/resources/wvp.sqlite
No preview for this file type
web_src/src/components/PLatformStreamList.vue deleted 100644 → 0
1 -<template>  
2 - <div id="pLatformStreamList">  
3 - <el-container>  
4 - <el-header>  
5 - <uiHeader></uiHeader>  
6 - </el-header>  
7 - <el-main>  
8 - <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;">  
9 - <span style="font-size: 1rem; font-weight: bold;">直播级联列表</span>  
10 - </div>  
11 - <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;font-size: 14px;">  
12 - <el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStreamProxy">添加代理</el-button>  
13 - </div>  
14 - <devicePlayer ref="devicePlayer"></devicePlayer>  
15 - <el-table :data="streamProxyList" border style="width: 100%" :height="winHeight">  
16 - <el-table-column prop="app" label="应用名" align="center" show-overflow-tooltip/>  
17 - <el-table-column prop="stream" label="流ID" align="center" show-overflow-tooltip/>  
18 - <el-table-column prop="gbId" label="国标平台" align="center" show-overflow-tooltip/>  
19 -  
20 - <el-table-column label="转HLS" width="120" align="center">  
21 - <template slot-scope="scope">  
22 - <div slot="reference" class="name-wrapper">  
23 - <el-tag size="medium" v-if="scope.row.enable_hls">已启用</el-tag>  
24 - <el-tag size="medium" type="info" v-if="!scope.row.enable_hls">未启用</el-tag>  
25 - </div>  
26 - </template>  
27 - </el-table-column>  
28 - <el-table-column label="MP4录制" width="120" align="center">  
29 - <template slot-scope="scope">  
30 - <div slot="reference" class="name-wrapper">  
31 - <el-tag size="medium" v-if="scope.row.enable_mp4">已启用</el-tag>  
32 - <el-tag size="medium" type="info" v-if="!scope.row.enable_mp4">未启用</el-tag>  
33 - </div>  
34 - </template>  
35 - </el-table-column>  
36 - <el-table-column label="启用" width="120" align="center">  
37 - <template slot-scope="scope">  
38 - <div slot="reference" class="name-wrapper">  
39 - <el-tag size="medium" v-if="scope.row.enable">已启用</el-tag>  
40 - <el-tag size="medium" type="info" v-if="!scope.row.enable">未启用</el-tag>  
41 - </div>  
42 - </template>  
43 - </el-table-column>  
44 -  
45 - <el-table-column label="操作" width="360" align="center" fixed="right">  
46 - <template slot-scope="scope">  
47 - <el-button-group>  
48 - <el-button size="mini" icon="el-icon-video-play" v-if="scope.row.enable" @click="play(scope.row)">播放</el-button>  
49 - <el-button size="mini" icon="el-icon-close" type="success" v-if="scope.row.enable" @click="stop(scope.row)">停用</el-button>  
50 - <el-button size="mini" icon="el-icon-check" type="primary" v-if="!scope.row.enable" @click="start(scope.row)">启用</el-button>  
51 - <el-button size="mini" icon="el-icon-delete" type="danger" @click="deleteStreamProxy(scope.row)">删除</el-button>  
52 - <!-- <el-button size="mini" icon="el-icon-position" type="primary" >加入国标</el-button> -->  
53 - </el-button-group>  
54 - </template>  
55 - </el-table-column>  
56 - </el-table>  
57 - <el-pagination  
58 - style="float: right"  
59 - @size-change="handleSizeChange"  
60 - @current-change="currentChange"  
61 - :current-page="currentPage"  
62 - :page-size="count"  
63 - :page-sizes="[15, 25, 35, 50]"  
64 - layout="total, sizes, prev, pager, next"  
65 - :total="total">  
66 - </el-pagination>  
67 - <streamProxyEdit ref="streamProxyEdit" ></streamProxyEdit>  
68 - </el-main>  
69 - </el-container>  
70 - </div>  
71 -</template>  
72 -  
73 -<script>  
74 - import streamProxyEdit from './dialog/StreamProxyEdit.vue'  
75 - import devicePlayer from './dialog/devicePlayer.vue'  
76 - import uiHeader from './UiHeader.vue'  
77 - export default {  
78 - name: 'pLatformStreamList',  
79 - components: {  
80 - devicePlayer,  
81 - streamProxyEdit,  
82 - uiHeader  
83 - },  
84 - data() {  
85 - return {  
86 - streamProxyList: [],  
87 - currentPusher: {}, //当前操作设备对象  
88 - updateLooper: 0, //数据刷新轮训标志  
89 - currentDeviceChannelsLenth:0,  
90 - winHeight: window.innerHeight - 200,  
91 - currentPage:1,  
92 - count:15,  
93 - total:0,  
94 - getListLoading: false  
95 - };  
96 - },  
97 - computed: {  
98 - },  
99 - mounted() {  
100 - this.initData();  
101 - // this.updateLooper = setInterval(this.initData, 10000);  
102 - },  
103 - destroyed() {  
104 - this.$destroy('videojs');  
105 - clearTimeout(this.updateLooper);  
106 - },  
107 - methods: {  
108 - initData: function() {  
109 - this.getStreamProxyList();  
110 - },  
111 - currentChange: function(val){  
112 - this.currentPage = val;  
113 - this.getStreamProxyList();  
114 - },  
115 - handleSizeChange: function(val){  
116 - this.count = val;  
117 - this.getStreamProxyList();  
118 - },  
119 - getStreamProxyList: function() {  
120 - let that = this;  
121 - this.getListLoading = true;  
122 - this.$axios.get(`/api/proxy/list`,{  
123 - params: {  
124 - page: that.currentPage,  
125 - count: that.count  
126 - }  
127 - } )  
128 - .then(function (res) {  
129 - console.log(res);  
130 - console.log(res.data.list);  
131 - that.total = res.data.total;  
132 - that.streamProxyList = res.data.list;  
133 - that.getListLoading = false;  
134 - })  
135 - .catch(function (error) {  
136 - console.log(error);  
137 - that.getListLoading = false;  
138 - });  
139 - },  
140 - addStreamProxy: function(){  
141 - this.$refs.streamProxyEdit.openDialog(null, this.initData)  
142 - },  
143 - saveStreamProxy: function(){  
144 - },  
145 - play: function(row){  
146 - let that = this;  
147 - this.getListLoading = true;  
148 - this.$axios.get(`/api/media/getStreamInfoByAppAndStream`,{  
149 - params: {  
150 - app: row.app,  
151 - stream: row.stream  
152 - }  
153 - })  
154 - .then(function (res) {  
155 - that.getListLoading = false;  
156 - that.$refs.devicePlayer.openDialog("streamPlay", null, null, {  
157 - streamInfo: res.data,  
158 - hasAudio: true  
159 - });  
160 - })  
161 - .catch(function (error) {  
162 - console.log(error);  
163 - that.getListLoading = false;  
164 - });  
165 -  
166 - },  
167 - deleteStreamProxy: function(row){  
168 - console.log(1111)  
169 - let that = this;  
170 - this.getListLoading = true;  
171 - this.$axios.get(`/api/proxy/del`,{  
172 - params: {  
173 - app: row.app,  
174 - stream: row.stream  
175 - }  
176 - })  
177 - .then(function (res) {  
178 - that.getListLoading = false;  
179 - that.initData()  
180 - })  
181 - .catch(function (error) {  
182 - console.log(error);  
183 - that.getListLoading = false;  
184 - });  
185 - },  
186 - start: function(row){  
187 - let that = this;  
188 - this.getListLoading = true;  
189 - this.$axios.get(`/api/proxy/start`,{  
190 - params: {  
191 - app: row.app,  
192 - stream: row.stream  
193 - }  
194 - })  
195 - .then(function (res) {  
196 - that.getListLoading = false;  
197 - that.initData()  
198 - })  
199 - .catch(function (error) {  
200 - console.log(error);  
201 - that.getListLoading = false;  
202 - });  
203 - },  
204 - stop: function(row){  
205 - let that = this;  
206 - this.getListLoading = true;  
207 - this.$axios.get(`/api/proxy/stop`,{  
208 - params: {  
209 - app: row.app,  
210 - stream: row.stream  
211 - }  
212 - })  
213 - .then(function (res) {  
214 - that.getListLoading = false;  
215 - that.initData()  
216 - })  
217 - .catch(function (error) {  
218 - console.log(error);  
219 - that.getListLoading = false;  
220 - });  
221 - }  
222 -  
223 - }  
224 - };  
225 -</script>  
226 -  
227 -<style>  
228 - .videoList {  
229 - display: flex;  
230 - flex-wrap: wrap;  
231 - align-content: flex-start;  
232 - }  
233 -  
234 - .video-item {  
235 - position: relative;  
236 - width: 15rem;  
237 - height: 10rem;  
238 - margin-right: 1rem;  
239 - background-color: #000000;  
240 - }  
241 -  
242 - .video-item-img {  
243 - position: absolute;  
244 - top: 0;  
245 - bottom: 0;  
246 - left: 0;  
247 - right: 0;  
248 - margin: auto;  
249 - width: 100%;  
250 - height: 100%;  
251 - }  
252 -  
253 - .video-item-img:after {  
254 - content: "";  
255 - display: inline-block;  
256 - position: absolute;  
257 - z-index: 2;  
258 - top: 0;  
259 - bottom: 0;  
260 - left: 0;  
261 - right: 0;  
262 - margin: auto;  
263 - width: 3rem;  
264 - height: 3rem;  
265 - background-image: url("../assets/loading.png");  
266 - background-size: cover;  
267 - background-color: #000000;  
268 - }  
269 -  
270 - .video-item-title {  
271 - position: absolute;  
272 - bottom: 0;  
273 - color: #000000;  
274 - background-color: #ffffff;  
275 - line-height: 1.5rem;  
276 - padding: 0.3rem;  
277 - width: 14.4rem;  
278 - }  
279 - .cpoy-btn {  
280 - cursor: pointer;  
281 - margin-right: 10px;  
282 - }  
283 -</style>  
web_src/src/components/PushVideoList.vue
@@ -8,10 +8,8 @@ @@ -8,10 +8,8 @@
8 <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;"> 8 <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;">
9 <span style="font-size: 1rem; font-weight: bold;">推流列表</span> 9 <span style="font-size: 1rem; font-weight: bold;">推流列表</span>
10 </div> 10 </div>
11 - <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;font-size: 14px;">  
12 - <el-button icon="el-icon-plus" size="mini" style="margin-right: 1rem;" type="primary" @click="addStreamProxy">添加代理</el-button>  
13 - </div>  
14 <devicePlayer ref="devicePlayer"></devicePlayer> 11 <devicePlayer ref="devicePlayer"></devicePlayer>
  12 + <addStreamTOGB ref="addStreamTOGB"></addStreamTOGB>
15 <el-table :data="pushList" border style="width: 100%" :height="winHeight"> 13 <el-table :data="pushList" border style="width: 100%" :height="winHeight">
16 <el-table-column prop="app" label="APP" width="180" align="center"> 14 <el-table-column prop="app" label="APP" width="180" align="center">
17 </el-table-column> 15 </el-table-column>
@@ -19,6 +17,8 @@ @@ -19,6 +17,8 @@
19 </el-table-column> 17 </el-table-column>
20 <el-table-column prop="totalReaderCount" label="在线人数" width="240" align="center"> 18 <el-table-column prop="totalReaderCount" label="在线人数" width="240" align="center">
21 </el-table-column> 19 </el-table-column>
  20 + <el-table-column prop="gbId" label="国标编码" width="150" align="center">
  21 + </el-table-column>
22 <el-table-column label="开始时间" align="center" > 22 <el-table-column label="开始时间" align="center" >
23 <template slot-scope="scope"> 23 <template slot-scope="scope">
24 <el-button-group> 24 <el-button-group>
@@ -26,12 +26,19 @@ @@ -26,12 +26,19 @@
26 </el-button-group> 26 </el-button-group>
27 </template> 27 </template>
28 </el-table-column> 28 </el-table-column>
  29 + <el-table-column label="正在推流" align="center" >
  30 + <template slot-scope="scope">
  31 + {{!!scope.row.status?'是':'否'}}
  32 + </template>
  33 + </el-table-column>
29 34
30 <el-table-column label="操作" width="360" align="center" fixed="right"> 35 <el-table-column label="操作" width="360" align="center" fixed="right">
31 <template slot-scope="scope"> 36 <template slot-scope="scope">
32 <el-button-group> 37 <el-button-group>
33 <el-button size="mini" icon="el-icon-video-play" @click="playPuhsh(scope.row)">播放</el-button> 38 <el-button size="mini" icon="el-icon-video-play" @click="playPuhsh(scope.row)">播放</el-button>
34 <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="!!scope.row.streamId" @click="stopPuhsh(scope.row)">停止</el-button> 39 <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="!!scope.row.streamId" @click="stopPuhsh(scope.row)">停止</el-button>
  40 + <el-button size="mini" icon="el-icon-position" type="primary" v-if="!!!scope.row.gbId" @click="addToGB(scope.row)">加入国标</el-button>
  41 + <el-button size="mini" icon="el-icon-position" type="primary" v-if="!!scope.row.gbId" @click="removeFromGB(scope.row)">移出国标</el-button>
35 </el-button-group> 42 </el-button-group>
36 </template> 43 </template>
37 </el-table-column> 44 </el-table-column>
@@ -55,11 +62,13 @@ @@ -55,11 +62,13 @@
55 <script> 62 <script>
56 import streamProxyEdit from './dialog/StreamProxyEdit.vue' 63 import streamProxyEdit from './dialog/StreamProxyEdit.vue'
57 import devicePlayer from './dialog/devicePlayer.vue' 64 import devicePlayer from './dialog/devicePlayer.vue'
  65 + import addStreamTOGB from './dialog/addStreamTOGB.vue'
58 import uiHeader from './UiHeader.vue' 66 import uiHeader from './UiHeader.vue'
59 export default { 67 export default {
60 name: 'pushVideoList', 68 name: 'pushVideoList',
61 components: { 69 components: {
62 devicePlayer, 70 devicePlayer,
  71 + addStreamTOGB,
63 streamProxyEdit, 72 streamProxyEdit,
64 uiHeader 73 uiHeader
65 }, 74 },
@@ -80,10 +89,9 @@ @@ -80,10 +89,9 @@
80 }, 89 },
81 mounted() { 90 mounted() {
82 this.initData(); 91 this.initData();
83 - // this.updateLooper = setInterval(this.initData, 10000); 92 + this.updateLooper = setInterval(this.initData, 2000);
84 }, 93 },
85 destroyed() { 94 destroyed() {
86 - this.$destroy('videojs');  
87 clearTimeout(this.updateLooper); 95 clearTimeout(this.updateLooper);
88 }, 96 },
89 methods: { 97 methods: {
@@ -101,7 +109,7 @@ @@ -101,7 +109,7 @@
101 getPushList: function() { 109 getPushList: function() {
102 let that = this; 110 let that = this;
103 this.getDeviceListLoading = true; 111 this.getDeviceListLoading = true;
104 - this.$axios.get(`/api/media/list`,{ 112 + this.$axios.get(`/api/push/list`,{
105 params: { 113 params: {
106 page: that.currentPage, 114 page: that.currentPage,
107 count: that.count 115 count: that.count
@@ -119,12 +127,7 @@ @@ -119,12 +127,7 @@
119 that.getDeviceListLoading = false; 127 that.getDeviceListLoading = false;
120 }); 128 });
121 }, 129 },
122 - addStreamProxy: function(){  
123 - console.log(2222)  
124 - this.$refs.streamProxyEdit.openDialog(null, this.initData)  
125 - },  
126 - saveStreamProxy: function(){  
127 - }, 130 +
128 playPuhsh: function(row){ 131 playPuhsh: function(row){
129 let that = this; 132 let that = this;
130 this.getListLoading = true; 133 this.getListLoading = true;
@@ -149,6 +152,23 @@ @@ -149,6 +152,23 @@
149 stopPuhsh: function(row){ 152 stopPuhsh: function(row){
150 console.log(row) 153 console.log(row)
151 }, 154 },
  155 + addToGB: function(row){
  156 + this.$refs.addStreamTOGB.openDialog({app: row.app, stream: row.stream}, this.initData);
  157 + },
  158 + removeFromGB: function(row){
  159 + var that = this;
  160 + that.$axios.post(`/api/push/removeFormGB`, row)
  161 + .then(function (res) {
  162 + console.log(res);
  163 + console.log(res.data == "success");
  164 + if (res.data == "success") {
  165 + that.initData()
  166 + }
  167 + })
  168 + .catch(function (error) {
  169 + console.log(error);
  170 + });
  171 + },
152 dateFormat: function(/** timestamp=0 **/) { 172 dateFormat: function(/** timestamp=0 **/) {
153 var ts = arguments[0] || 0; 173 var ts = arguments[0] || 0;
154 var t,y,m,d,h,i,s; 174 var t,y,m,d,h,i,s;
web_src/src/components/StreamProxyList.vue
@@ -64,7 +64,6 @@ @@ -64,7 +64,6 @@
64 <el-button size="mini" icon="el-icon-close" type="success" v-if="scope.row.enable" @click="stop(scope.row)">停用</el-button> 64 <el-button size="mini" icon="el-icon-close" type="success" v-if="scope.row.enable" @click="stop(scope.row)">停用</el-button>
65 <el-button size="mini" icon="el-icon-check" type="primary" v-if="!scope.row.enable" @click="start(scope.row)">启用</el-button> 65 <el-button size="mini" icon="el-icon-check" type="primary" v-if="!scope.row.enable" @click="start(scope.row)">启用</el-button>
66 <el-button size="mini" icon="el-icon-delete" type="danger" @click="deleteStreamProxy(scope.row)">删除</el-button> 66 <el-button size="mini" icon="el-icon-delete" type="danger" @click="deleteStreamProxy(scope.row)">删除</el-button>
67 - <!-- <el-button size="mini" icon="el-icon-position" type="primary" >加入国标</el-button> -->  
68 </el-button-group> 67 </el-button-group>
69 </template> 68 </template>
70 </el-table-column> 69 </el-table-column>
web_src/src/components/dialog/addStreamTOGB.vue 0 → 100644
  1 +<template>
  2 + <div id="addStreamProxy" v-loading="isLoging">
  3 + <el-dialog
  4 + title=" 加入"
  5 + width="40%"
  6 + top="2rem"
  7 + :close-on-click-modal="false"
  8 + :visible.sync="showDialog"
  9 + :destroy-on-close="true"
  10 + @close="close()"
  11 + >
  12 + <div id="shared" style="margin-top: 1rem;margin-right: 100px;">
  13 + <el-form ref="streamProxy" :rules="rules" :model="proxyParam" label-width="140px">
  14 + <el-form-item label="名称" prop="name">
  15 + <el-input v-model="proxyParam.name" clearable></el-input>
  16 + </el-form-item>
  17 + <el-form-item label="流应用名" prop="app">
  18 + <el-input v-model="proxyParam.app" clearable :disabled="true"></el-input>
  19 + </el-form-item>
  20 + <el-form-item label="流ID" prop="stream">
  21 + <el-input v-model="proxyParam.stream" clearable :disabled="true"></el-input>
  22 + </el-form-item>
  23 + <el-form-item label="国标编码" prop="gbId">
  24 + <el-input v-model="proxyParam.gbId" placeholder="设置国标编码可推送到国标" clearable></el-input>
  25 + </el-form-item>
  26 + <el-form-item>
  27 + <div style="float: right;">
  28 + <el-button type="primary" @click="onSubmit">保存</el-button>
  29 + <el-button @click="close">取消</el-button>
  30 + </div>
  31 +
  32 + </el-form-item>
  33 + </el-form>
  34 + </div>
  35 + </el-dialog>
  36 + </div>
  37 +</template>
  38 +
  39 +<script>
  40 +export default {
  41 + name: "streamProxyEdit",
  42 + props: {},
  43 + computed: {},
  44 + created() {},
  45 + data() {
  46 + // var deviceGBIdRules = async (rule, value, callback) => {
  47 + // console.log(value);
  48 + // if (value === "") {
  49 + // callback(new Error("请输入设备国标编号"));
  50 + // } else {
  51 + // var exit = await this.deviceGBIdExit(value);
  52 + // console.log(exit);
  53 + // console.log(exit == "true");
  54 + // console.log(exit === "true");
  55 + // if (exit) {
  56 + // callback(new Error("设备国标编号已存在"));
  57 + // } else {
  58 + // callback();
  59 + // }
  60 + // }
  61 + // };
  62 + return {
  63 + listChangeCallback: null,
  64 + showDialog: false,
  65 + isLoging: false,
  66 + proxyParam: {
  67 + name: null,
  68 + app: null,
  69 + stream: null,
  70 + gbId: null,
  71 + },
  72 +
  73 + rules: {
  74 + name: [{ required: true, message: "请输入名称", trigger: "blur" }],
  75 + app: [{ required: true, message: "请输入应用名", trigger: "blur" }],
  76 + stream: [{ required: true, message: "请输入流ID", trigger: "blur" }],
  77 + gbId: [{ required: true, message: "请输入国标编码", trigger: "blur" }],
  78 + },
  79 + };
  80 + },
  81 + methods: {
  82 + openDialog: function (proxyParam, callback) {
  83 + this.showDialog = true;
  84 + this.listChangeCallback = callback;
  85 + if (proxyParam != null) {
  86 + this.proxyParam = proxyParam;
  87 + }
  88 + },
  89 + onSubmit: function () {
  90 + console.log("onSubmit");
  91 + var that = this;
  92 + that.$axios
  93 + .post(`/api/push/saveToGB`, that.proxyParam)
  94 + .then(function (res) {
  95 + console.log(res);
  96 + console.log(res.data == "success");
  97 + if (res.data == "success") {
  98 + that.$message({
  99 + showClose: true,
  100 + message: "保存成功",
  101 + type: "success",
  102 + });
  103 + that.showDialog = false;
  104 + if (that.listChangeCallback != null) {
  105 + that.listChangeCallback();
  106 + }
  107 + }
  108 + })
  109 + .catch(function (error) {
  110 + console.log(error);
  111 + });
  112 + },
  113 + close: function () {
  114 + console.log("关闭加入GB");
  115 + this.showDialog = false;
  116 + this.$refs.streamProxy.resetFields();
  117 + },
  118 + deviceGBIdExit: async function (deviceGbId) {
  119 + var result = false;
  120 + var that = this;
  121 + await that.$axios
  122 + .post(`/api/platforms/exit/${deviceGbId}`)
  123 + .then(function (res) {
  124 + result = res.data;
  125 + })
  126 + .catch(function (error) {
  127 + console.log(error);
  128 + });
  129 + return result;
  130 + },
  131 + checkExpires: function() {
  132 + if (this.platform.enable && this.platform.expires == "0") {
  133 + this.platform.expires = "300";
  134 + }
  135 + }
  136 + },
  137 +};
  138 +</script>
web_src/src/components/dialog/chooseChannelForStream.vue
@@ -10,8 +10,6 @@ @@ -10,8 +10,6 @@
10 </el-table-column> 10 </el-table-column>
11 <el-table-column prop="gbId" label="国标编码" show-overflow-tooltip> 11 <el-table-column prop="gbId" label="国标编码" show-overflow-tooltip>
12 </el-table-column> 12 </el-table-column>
13 - <el-table-column prop="streamType" label="流来源" align="center" show-overflow-tooltip>  
14 - </el-table-column>  
15 <el-table-column label="流来源" width="100" align="center"> 13 <el-table-column label="流来源" width="100" align="center">
16 <template slot-scope="scope"> 14 <template slot-scope="scope">
17 <div slot="reference" class="name-wrapper"> 15 <div slot="reference" class="name-wrapper">
web_src/src/router/index.js
@@ -6,7 +6,6 @@ import deviceList from &#39;../components/DeviceList.vue&#39; @@ -6,7 +6,6 @@ import deviceList from &#39;../components/DeviceList.vue&#39;
6 import channelList from '../components/channelList.vue' 6 import channelList from '../components/channelList.vue'
7 import pushVideoList from '../components/PushVideoList.vue' 7 import pushVideoList from '../components/PushVideoList.vue'
8 import streamProxyList from '../components/StreamProxyList.vue' 8 import streamProxyList from '../components/StreamProxyList.vue'
9 -import pLatformStreamList from '../components/PLatformStreamList.vue'  
10 import devicePosition from '../components/devicePosition.vue' 9 import devicePosition from '../components/devicePosition.vue'
11 import login from '../components/Login.vue' 10 import login from '../components/Login.vue'
12 import parentPlatformList from '../components/ParentPlatformList.vue' 11 import parentPlatformList from '../components/ParentPlatformList.vue'
@@ -35,10 +34,6 @@ export default new VueRouter({ @@ -35,10 +34,6 @@ export default new VueRouter({
35 component: pushVideoList, 34 component: pushVideoList,
36 }, 35 },
37 { 36 {
38 - path: '/pLatformStreamList',  
39 - component: pLatformStreamList,  
40 - },  
41 - {  
42 path: '/streamProxyList', 37 path: '/streamProxyList',
43 component: streamProxyList, 38 component: streamProxyList,
44 }, 39 },