From edb033ccd7df53e2444f38c9657946ce15856153 Mon Sep 17 00:00:00 2001 From: panlinlin <648540858@qq.com> Date: Fri, 26 Mar 2021 18:32:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96=E7=9B=B4?= =?UTF-8?q?=E6=92=AD=E6=B5=81=E7=9A=84api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genersoft/iot/vmp/common/RealVideo.java | 206 ++++++++++ .../iot/vmp/common/VideoManagerConstants.java | 2 + .../vmp/media/zlm/ZLMHttpHookListener.java | 9 +- .../vmp/media/zlm/ZLMMediaListManager.java | 87 +++++ .../iot/vmp/media/zlm/ZLMRESTfulUtils.java | 4 + .../iot/vmp/media/zlm/ZLMRunner.java | 6 + .../iot/vmp/media/zlm/dto/MediaItem.java | 369 ++++++++++++++++++ .../iot/vmp/storager/IRedisCatchStorage.java | 13 + .../storager/impl/RedisCatchStorageImpl.java | 31 +- .../iot/vmp/utils/redis/RedisUtil.java | 20 +- .../iot/vmp/web/ApiMediaController.java | 45 +++ web_src/src/components/PushVideoList.vue | 256 ++++++++++++ web_src/src/components/UiHeader.vue | 1 + web_src/src/router/index.js | 5 + 14 files changed, 1039 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/genersoft/iot/vmp/common/RealVideo.java create mode 100644 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java create mode 100644 src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java create mode 100644 src/main/java/com/genersoft/iot/vmp/web/ApiMediaController.java create mode 100644 web_src/src/components/PushVideoList.vue diff --git a/src/main/java/com/genersoft/iot/vmp/common/RealVideo.java b/src/main/java/com/genersoft/iot/vmp/common/RealVideo.java new file mode 100644 index 00000000..b5ed8516 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/common/RealVideo.java @@ -0,0 +1,206 @@ +package com.genersoft.iot.vmp.common; + +import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + + +public class RealVideo implements Comparable{ + + /** + * 应用名 + */ + private String app; + + /** + * 流id + */ + private String stream; + + /** + * 观看总人数,包括hls/rtsp/rtmp/http-flv/ws-flv + */ + private String totalReaderCount; + + /** + * 协议 包括hls/rtsp/rtmp/http-flv/ws-flv + */ + private List schemas; + + /** + * 产生源类型, + * unknown = 0, + * rtmp_push=1, + * rtsp_push=2, + * rtp_push=3, + * pull=4, + * ffmpeg_pull=5, + * mp4_vod=6, + * device_chn=7 + */ + private int originType; + + /** + * 客户端和服务器网络信息,可能为null类型 + */ + private MediaItem.OriginSock originSock; + + /** + * 产生源类型的字符串描述 + */ + private String originTypeStr; + + /** + * 产生源的url + */ + private String originUrl; + + /** + * GMT unix系统时间戳,单位秒 + */ + private Long createStamp; + + /** + * 存活时间,单位秒 + */ + private Long aliveSecond; + + /** + * 音视频轨道 + */ + private List tracks; + + /** + * 音视频轨道 + */ + private String vhost; + + public String getVhost() { + return vhost; + } + + public void setVhost(String vhost) { + this.vhost = vhost; + } + + @Override + public int compareTo(@NotNull RealVideo realVideo) { + return new Long(this.createStamp - realVideo.getCreateStamp().intValue()).intValue(); + } + + public static class MediaSchema { + private String schema; + private Long bytesSpeed; + + public String getSchema() { + return schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } + + public Long getBytesSpeed() { + return bytesSpeed; + } + + public void setBytesSpeed(Long bytesSpeed) { + this.bytesSpeed = bytesSpeed; + } + } + + + public String getApp() { + return app; + } + + public void setApp(String app) { + this.app = app; + } + + public String getStream() { + return stream; + } + + public void setStream(String stream) { + this.stream = stream; + } + + public String getTotalReaderCount() { + return totalReaderCount; + } + + public void setTotalReaderCount(String totalReaderCount) { + this.totalReaderCount = totalReaderCount; + } + + public List getSchemas() { + return schemas; + } + + public void setSchemas(List schemas) { + this.schemas = schemas; + } + + public int getOriginType() { + return originType; + } + + public void setOriginType(int originType) { + this.originType = originType; + } + + public MediaItem.OriginSock getOriginSock() { + return originSock; + } + + public void setOriginSock(MediaItem.OriginSock originSock) { + this.originSock = originSock; + } + + + public String getOriginTypeStr() { + return originTypeStr; + } + + public void setOriginTypeStr(String originTypeStr) { + this.originTypeStr = originTypeStr; + } + + public String getOriginUrl() { + return originUrl; + } + + public void setOriginUrl(String originUrl) { + this.originUrl = originUrl; + } + + public Long getCreateStamp() { + return createStamp; + } + + public void setCreateStamp(Long createStamp) { + this.createStamp = createStamp; + } + + public Long getAliveSecond() { + return aliveSecond; + } + + public void setAliveSecond(Long aliveSecond) { + this.aliveSecond = aliveSecond; + } + + public List getTracks() { + return tracks; + } + + public void setTracks(List tracks) { + this.tracks = tracks; + } + + +} + diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java index 8e9e871c..8af9956c 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java +++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java @@ -10,6 +10,8 @@ public class VideoManagerConstants { public static final String MEDIA_SERVER_PREFIX = "VMP_media_server"; + public static final String MEDIA_STREAM_PREFIX = "VMP_media_stream"; + public static final String DEVICE_PREFIX = "VMP_device_"; public static final String CACHEKEY_PREFIX = "VMP_channel_"; diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 51f61eff..51c6e1bd 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -51,8 +51,8 @@ public class ZLMHttpHookListener { @Autowired private IRedisCatchStorage redisCatchStorage; - // @Autowired - // private ZLMRESTfulUtils zlmresTfulUtils; + @Autowired + private ZLMMediaListManager zlmMediaListManager; @Autowired private ZLMHttpHookSubscribe subscribe; @@ -237,6 +237,7 @@ public class ZLMHttpHookListener { // 流消失移除redis play String app = json.getString("app"); String streamId = json.getString("stream"); + String schema = json.getString("schema"); boolean regist = json.getBoolean("regist"); StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId); if ("rtp".equals(app) && !regist ) { @@ -247,6 +248,10 @@ public class ZLMHttpHookListener { streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId); redisCatchStorage.stopPlayback(streamInfo); } + }else { + if (!"rtp".equals(app) && "rtsp".equals(schema)){ + zlmMediaListManager.updateMediaList(); + } } JSONObject ret = new JSONObject(); ret.put("code", 0); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java new file mode 100644 index 00000000..b17151af --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java @@ -0,0 +1,87 @@ +package com.genersoft.iot.vmp.media.zlm; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.genersoft.iot.vmp.common.RealVideo; +import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; +import com.genersoft.iot.vmp.gb28181.session.SsrcUtil; +import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.impl.RedisCatchStorageImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.*; + +@Component +public class ZLMMediaListManager { + + private Logger logger = LoggerFactory.getLogger("ZLMMediaListManager"); + + @Autowired + private ZLMRESTfulUtils zlmresTfulUtils; + + @Autowired + private IRedisCatchStorage redisCatchStorage; + + + public void updateMediaList() { + JSONObject mediaList = zlmresTfulUtils.getMediaList(); + String dataStr = mediaList.getString("data"); + + Integer code = mediaList.getInteger("code"); + Map result = new HashMap<>(); + if (code == 0 ) { + if (dataStr != null) { + List mediaItems = JSON.parseObject(dataStr, new TypeReference>() {}); + for (MediaItem item : mediaItems) { + if ("rtp".equals(item.getApp())) { + continue; + } + String key = item.getApp() + "_" + item.getStream(); + RealVideo realVideo = result.get(key); + if (realVideo == null) { + realVideo = new RealVideo(); + realVideo.setApp(item.getApp()); + realVideo.setStream(item.getStream()); + realVideo.setAliveSecond(item.getAliveSecond()); + realVideo.setCreateStamp(item.getCreateStamp()); + realVideo.setOriginSock(item.getOriginSock()); + realVideo.setTotalReaderCount(item.getTotalReaderCount()); + realVideo.setOriginType(item.getOriginType()); + realVideo.setOriginTypeStr(item.getOriginTypeStr()); + realVideo.setOriginUrl(item.getOriginUrl()); + realVideo.setCreateStamp(item.getCreateStamp()); + realVideo.setAliveSecond(item.getAliveSecond()); + + ArrayList mediaSchemas = new ArrayList<>(); + realVideo.setSchemas(mediaSchemas); + realVideo.setTracks(item.getTracks()); + realVideo.setVhost(item.getVhost()); + result.put(key, realVideo); + } + + RealVideo.MediaSchema mediaSchema = new RealVideo.MediaSchema(); + mediaSchema.setSchema(item.getSchema()); + mediaSchema.setBytesSpeed(item.getBytesSpeed()); + realVideo.getSchemas().add(mediaSchema); + } + + } + }else { + logger.warn("更新视频流失败,错误code: " + code); + } + + List realVideos = new ArrayList<>(result.values()); + Collections.sort(realVideos); + redisCatchStorage.updateMediaList(realVideos); + } + + + +} diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java index 42670a71..ad17feea 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java @@ -73,6 +73,10 @@ public class ZLMRESTfulUtils { return sendPost("getMediaList",param); } + public JSONObject getMediaList(){ + return sendPost("getMediaList",null); + } + public JSONObject getMediaInfo(String app, String schema, String stream){ Map param = new HashMap<>(); param.put("app",app); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java index 490bfd8e..e65fae03 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java @@ -60,6 +60,9 @@ public class ZLMRunner implements CommandLineRunner { @Autowired private ZLMRESTfulUtils zlmresTfulUtils; + @Autowired + private ZLMMediaListManager zlmMediaListManager; + @Override public void run(String... strings) throws Exception { // 获取zlm信息 @@ -70,6 +73,8 @@ public class ZLMRunner implements CommandLineRunner { if (autoConfig) saveZLMConfig(); mediaServerConfig = getMediaServerConfig(); redisCatchStorage.updateMediaInfo(mediaServerConfig); + // 更新流列表 + zlmMediaListManager.updateMediaList(); } } @@ -130,4 +135,5 @@ public class ZLMRunner implements CommandLineRunner { logger.info("设置zlm失败: " + responseJSON.getString("msg")); } } + } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java new file mode 100644 index 00000000..51a89b2f --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaItem.java @@ -0,0 +1,369 @@ +package com.genersoft.iot.vmp.media.zlm.dto; + +import com.alibaba.fastjson.JSONObject; + +import java.util.List; + +public class MediaItem { + + /** + * 应用名 + */ + private String app; + + /** + * 流id + */ + private String stream; + + /** + * 观看总人数,包括hls/rtsp/rtmp/http-flv/ws-flv + */ + private String totalReaderCount; + + /** + * 协议 包括hls/rtsp/rtmp/http-flv/ws-flv + */ + private String schema; + + + /** + * 产生源类型, + * unknown = 0, + * rtmp_push=1, + * rtsp_push=2, + * rtp_push=3, + * pull=4, + * ffmpeg_pull=5, + * mp4_vod=6, + * device_chn=7 + */ + private int originType; + + /** + * 客户端和服务器网络信息,可能为null类型 + */ + private OriginSock originSock; + + /** + * 产生源类型的字符串描述 + */ + private String originTypeStr; + + /** + * 产生源的url + */ + private String originUrl; + + /** + * GMT unix系统时间戳,单位秒 + */ + private Long createStamp; + + /** + * 存活时间,单位秒 + */ + private Long aliveSecond; + + /** + * 数据产生速度,单位byte/s + */ + private Long bytesSpeed; + + /** + * 音视频轨道 + */ + private List tracks; + + /** + * 音视频轨道 + */ + private String vhost; + + + public static class MediaTrack { + /** + * 音频通道数 + */ + private int channels; + + /** + * H264 = 0, H265 = 1, AAC = 2, G711A = 3, G711U = 4 + */ + private int codecId; + + /** + * 编码类型名称 CodecAAC CodecH264 + */ + private String codecIdName; + + /** + * Video = 0, Audio = 1 + */ + private int codecType; + + /** + * 轨道是否准备就绪 + */ + private boolean ready; + + /** + * 音频采样位数 + */ + private int sampleBit; + + /** + * 音频采样率 + */ + private int sampleRate; + + /** + * 视频fps + */ + private int fps; + + /** + * 视频高 + */ + private int height; + + /** + * 视频宽 + */ + private int width; + + public int getChannels() { + return channels; + } + + public void setChannels(int channels) { + this.channels = channels; + } + + public int getCodecId() { + return codecId; + } + + public void setCodecId(int codecId) { + this.codecId = codecId; + } + + public String getCodecIdName() { + return codecIdName; + } + + public void setCodecIdName(String codecIdName) { + this.codecIdName = codecIdName; + } + + public int getCodecType() { + return codecType; + } + + public void setCodecType(int codecType) { + this.codecType = codecType; + } + + public boolean isReady() { + return ready; + } + + public void setReady(boolean ready) { + this.ready = ready; + } + + public int getSampleBit() { + return sampleBit; + } + + public void setSampleBit(int sampleBit) { + this.sampleBit = sampleBit; + } + + public int getSampleRate() { + return sampleRate; + } + + public void setSampleRate(int sampleRate) { + this.sampleRate = sampleRate; + } + + public int getFps() { + return fps; + } + + public void setFps(int fps) { + this.fps = fps; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + } + + public static class OriginSock{ + private String identifier; + private String local_ip; + private int local_port; + private String peer_ip; + private int peer_port; + + public String getIdentifier() { + return identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getLocal_ip() { + return local_ip; + } + + public void setLocal_ip(String local_ip) { + this.local_ip = local_ip; + } + + public int getLocal_port() { + return local_port; + } + + public void setLocal_port(int local_port) { + this.local_port = local_port; + } + + public String getPeer_ip() { + return peer_ip; + } + + public void setPeer_ip(String peer_ip) { + this.peer_ip = peer_ip; + } + + public int getPeer_port() { + return peer_port; + } + + public void setPeer_port(int peer_port) { + this.peer_port = peer_port; + } + } + + public String getApp() { + return app; + } + + public void setApp(String app) { + this.app = app; + } + + public String getStream() { + return stream; + } + + public void setStream(String stream) { + this.stream = stream; + } + + public String getTotalReaderCount() { + return totalReaderCount; + } + + public void setTotalReaderCount(String totalReaderCount) { + this.totalReaderCount = totalReaderCount; + } + + + public int getOriginType() { + return originType; + } + + public void setOriginType(int originType) { + this.originType = originType; + } + + + public String getOriginTypeStr() { + return originTypeStr; + } + + public void setOriginTypeStr(String originTypeStr) { + this.originTypeStr = originTypeStr; + } + + public String getOriginUrl() { + return originUrl; + } + + public void setOriginUrl(String originUrl) { + this.originUrl = originUrl; + } + + public Long getCreateStamp() { + return createStamp; + } + + public void setCreateStamp(Long createStamp) { + this.createStamp = createStamp; + } + + public Long getAliveSecond() { + return aliveSecond; + } + + public void setAliveSecond(Long aliveSecond) { + this.aliveSecond = aliveSecond; + } + + public List getTracks() { + return tracks; + } + + public void setTracks(List tracks) { + this.tracks = tracks; + } + + public String getSchema() { + return schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } + + public void setOriginSock(OriginSock originSock) { + this.originSock = originSock; + } + + public Long getBytesSpeed() { + return bytesSpeed; + } + + public void setBytesSpeed(Long bytesSpeed) { + this.bytesSpeed = bytesSpeed; + } + + public String getVhost() { + return vhost; + } + + public void setVhost(String vhost) { + this.vhost = vhost; + } + + public OriginSock getOriginSock() { + return originSock; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java index 90611846..c9f5fff8 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java @@ -1,11 +1,13 @@ package com.genersoft.iot.vmp.storager; +import com.genersoft.iot.vmp.common.RealVideo; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.MediaServerConfig; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; +import java.util.List; import java.util.Map; public interface IRedisCatchStorage { @@ -102,4 +104,15 @@ public interface IRedisCatchStorage { */ boolean isChannelSendingRTP(String channelId); + /** + * 更新媒体流列表 + * @param mediaList + */ + void updateMediaList(List mediaList); + + /** + * 获取当前媒体流列表 + * @return List + */ + List getMediaList(int start, int end); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java index 3feb347e..c5e31d62 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.storager.impl; +import com.genersoft.iot.vmp.common.RealVideo; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.MediaServerConfig; @@ -10,9 +11,7 @@ import com.genersoft.iot.vmp.utils.redis.RedisUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Component public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -251,4 +250,30 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { } } + + /** + * 更新媒体流列表 + * @param mediaList + */ + @Override + public void updateMediaList(List mediaList) { + String key = VideoManagerConstants.MEDIA_STREAM_PREFIX; + redis.del(key); + for (int i = 0; i < mediaList.size(); i++) { + RealVideo realVideo = mediaList.get(i); + redis.zAdd(key, realVideo, realVideo.getCreateStamp()); + } + } + + + /** + * 获取当前媒体流列表 + * @return List + */ + @Override + public List getMediaList(int start, int end) { + String key = VideoManagerConstants.MEDIA_STREAM_PREFIX; + Set realVideos = redis.ZRange(key, start, end); + return new ArrayList(realVideos); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java index f83d5f3e..5db3c7f4 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java @@ -396,7 +396,7 @@ public class RedisUtil { * @param value * @param score */ - public void zAdd(String key, String value, double score) { + public void zAdd(Object key, Object value, double score) { redisTemplate.opsForZSet().add(key, value, score); } @@ -406,7 +406,7 @@ public class RedisUtil { * @param key * @param value */ - public void zRemove(String key, String value) { + public void zRemove(Object key, Object value) { redisTemplate.opsForZSet().remove(key, value); } @@ -417,7 +417,7 @@ public class RedisUtil { * @param value * @param score */ - public Double zIncrScore(String key, String value, double score) { + public Double zIncrScore(Object key, Object value, double score) { return redisTemplate.opsForZSet().incrementScore(key, value, score); } @@ -428,7 +428,7 @@ public class RedisUtil { * @param value * @return */ - public Double zScore(String key, String value) { + public Double zScore(Object key, Object value) { return redisTemplate.opsForZSet().score(key, value); } @@ -439,7 +439,7 @@ public class RedisUtil { * @param value * @return */ - public Long zRank(String key, String value) { + public Long zRank(Object key, Object value) { return redisTemplate.opsForZSet().rank(key, value); } @@ -449,7 +449,7 @@ public class RedisUtil { * @param key * @return */ - public Long zSize(String key) { + public Long zSize(Object key) { return redisTemplate.opsForZSet().zCard(key); } @@ -463,7 +463,7 @@ public class RedisUtil { * @param end * @return */ - public Set ZRange(String key, int start, int end) { + public Set ZRange(Object key, int start, int end) { return redisTemplate.opsForZSet().range(key, start, end); } /** @@ -474,7 +474,7 @@ public class RedisUtil { * @param end * @return */ - public Set> zRangeWithScore(String key, int start, int end) { + public Set> zRangeWithScore(Object key, int start, int end) { return redisTemplate.opsForZSet().rangeWithScores(key, start, end); } /** @@ -487,7 +487,7 @@ public class RedisUtil { * @param end * @return */ - public Set zRevRange(String key, int start, int end) { + public Set zRevRange(Object key, int start, int end) { return redisTemplate.opsForZSet().reverseRange(key, start, end); } /** @@ -498,7 +498,7 @@ public class RedisUtil { * @param max * @return */ - public Set zSortRange(String key, int min, int max) { + public Set zSortRange(Object key, int min, int max) { return redisTemplate.opsForZSet().rangeByScore(key, min, max); } diff --git a/src/main/java/com/genersoft/iot/vmp/web/ApiMediaController.java b/src/main/java/com/genersoft/iot/vmp/web/ApiMediaController.java new file mode 100644 index 00000000..84910c5c --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/web/ApiMediaController.java @@ -0,0 +1,45 @@ +package com.genersoft.iot.vmp.web; + +import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.common.RealVideo; +import com.genersoft.iot.vmp.conf.SipConfig; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +/** + * 兼容LiveGBS的API:系统接口 + */ +@Controller +@CrossOrigin +@RequestMapping(value = "/api/v1/media") +public class ApiMediaController { + + private final static Logger logger = LoggerFactory.getLogger(ApiMediaController.class); + + @Autowired + private IRedisCatchStorage redisCatchStorage; + + + @RequestMapping(value = "/list") + @ResponseBody + public JSONObject list( @RequestParam(required = false)Integer start, + @RequestParam(required = false)Integer limit, + @RequestParam(required = false)String q, + @RequestParam(required = false)Boolean online ){ + + List mediaList = redisCatchStorage.getMediaList(start - 1, start - 1 + limit); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", 0); + jsonObject.put("data", mediaList); + return jsonObject; + } +} diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue new file mode 100644 index 00000000..60a5c9ee --- /dev/null +++ b/web_src/src/components/PushVideoList.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/web_src/src/components/UiHeader.vue b/web_src/src/components/UiHeader.vue index 1d3f76ab..fa1c4424 100644 --- a/web_src/src/components/UiHeader.vue +++ b/web_src/src/components/UiHeader.vue @@ -3,6 +3,7 @@ 控制台 设备列表 + 推流列表 国标级联 退出 diff --git a/web_src/src/router/index.js b/web_src/src/router/index.js index 43d2110b..fc55dd53 100644 --- a/web_src/src/router/index.js +++ b/web_src/src/router/index.js @@ -4,6 +4,7 @@ import VueRouter from 'vue-router' import control from '../components/control.vue' import deviceList from '../components/DeviceList.vue' import channelList from '../components/channelList.vue' +import pushVideoList from '../components/PushVideoList.vue' import devicePosition from '../components/devicePosition.vue' import login from '../components/Login.vue' import parentPlatformList from '../components/ParentPlatformList.vue' @@ -27,6 +28,10 @@ export default new VueRouter({ path: '/deviceList', component: deviceList, }, + { + path: '/pushVideoList', + component: pushVideoList, + }, { path: '/login', name: '登录',