panlinlin
4 years ago
14 changed files with 1039 additions and 15 deletions
@ -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<RealVideo>{ |
||||
|
|
||||
|
/** |
||||
|
* 应用名 |
||||
|
*/ |
||||
|
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<MediaSchema> 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<MediaItem.MediaTrack> 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<MediaSchema> getSchemas() { |
||||
|
return schemas; |
||||
|
} |
||||
|
|
||||
|
public void setSchemas(List<MediaSchema> 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<MediaItem.MediaTrack> getTracks() { |
||||
|
return tracks; |
||||
|
} |
||||
|
|
||||
|
public void setTracks(List<MediaItem.MediaTrack> tracks) { |
||||
|
this.tracks = tracks; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
@ -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<String, RealVideo> result = new HashMap<>(); |
||||
|
if (code == 0 ) { |
||||
|
if (dataStr != null) { |
||||
|
List<MediaItem> mediaItems = JSON.parseObject(dataStr, new TypeReference<List<MediaItem>>() {}); |
||||
|
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<RealVideo.MediaSchema> 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<RealVideo> realVideos = new ArrayList<>(result.values()); |
||||
|
Collections.sort(realVideos); |
||||
|
redisCatchStorage.updateMediaList(realVideos); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
@ -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<MediaTrack> 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<MediaTrack> getTracks() { |
||||
|
return tracks; |
||||
|
} |
||||
|
|
||||
|
public void setTracks(List<MediaTrack> 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; |
||||
|
} |
||||
|
} |
@ -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<Object> mediaList = redisCatchStorage.getMediaList(start - 1, start - 1 + limit); |
||||
|
JSONObject jsonObject = new JSONObject(); |
||||
|
jsonObject.put("code", 0); |
||||
|
jsonObject.put("data", mediaList); |
||||
|
return jsonObject; |
||||
|
} |
||||
|
} |
@ -0,0 +1,256 @@ |
|||||
|
<template> |
||||
|
<div id="app"> |
||||
|
<el-container> |
||||
|
<el-header> |
||||
|
<uiHeader></uiHeader> |
||||
|
</el-header> |
||||
|
<el-main> |
||||
|
<div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;"> |
||||
|
<span style="font-size: 1rem; font-weight: bold;">推流列表</span> |
||||
|
<div style="position: absolute; right: 1rem; top: 0.3rem;"> |
||||
|
<el-button icon="el-icon-refresh-right" circle size="mini" :loading="getDeviceListLoading" @click="getDeviceList()"></el-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- <devicePlayer ref="devicePlayer"></devicePlayer> --> |
||||
|
<el-table :data="deviceList" border style="width: 100%" :height="winHeight"> |
||||
|
<el-table-column prop="schema" label="协议" width="180" align="center"> |
||||
|
</el-table-column> |
||||
|
<el-table-column prop="streamUrl" label="流地址" width="240" align="center"> |
||||
|
</el-table-column> |
||||
|
<el-table-column prop="online" label="在线人数" width="240" align="center"> |
||||
|
</el-table-column> |
||||
|
<el-table-column prop="startTime" label="开始时间" align="center"> |
||||
|
</el-table-column> |
||||
|
|
||||
|
|
||||
|
<el-table-column label="操作" width="360" align="center" fixed="right"> |
||||
|
<template slot-scope="scope"> |
||||
|
<el-button size="mini" :ref="scope.row.deviceId + 'refbtn' " icon="el-icon-refresh" @click="refDevice(scope.row)">刷新</el-button> |
||||
|
<el-button-group> |
||||
|
<el-button size="mini" icon="el-icon-video-play" @click="sendDevicePush(scope.row)">播放</el-button> |
||||
|
<el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="!!scope.row.streamId" @click="stopDevicePush(scope.row)">停止</el-button> |
||||
|
</el-button-group> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
<el-pagination |
||||
|
style="float: right" |
||||
|
@size-change="handleSizeChange" |
||||
|
@current-change="currentChange" |
||||
|
:current-page="currentPage" |
||||
|
:page-size="count" |
||||
|
:page-sizes="[15, 25, 35, 50]" |
||||
|
layout="total, sizes, prev, pager, next" |
||||
|
:total="total"> |
||||
|
</el-pagination> |
||||
|
|
||||
|
</el-main> |
||||
|
</el-container> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import uiHeader from './UiHeader.vue' |
||||
|
export default { |
||||
|
name: 'app', |
||||
|
components: { |
||||
|
uiHeader |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
deviceList: [], //设备列表 |
||||
|
currentDevice: {}, //当前操作设备对象 |
||||
|
|
||||
|
videoComponentList: [], |
||||
|
updateLooper: 0, //数据刷新轮训标志 |
||||
|
currentDeviceChannelsLenth:0, |
||||
|
winHeight: window.innerHeight - 200, |
||||
|
currentPage:1, |
||||
|
count:15, |
||||
|
total:0, |
||||
|
getDeviceListLoading: false |
||||
|
}; |
||||
|
}, |
||||
|
computed: { |
||||
|
getcurrentDeviceChannels: function() { |
||||
|
let data = this.currentDevice['channelMap']; |
||||
|
let channels = null; |
||||
|
if (data) { |
||||
|
channels = Object.keys(data).map(key => { |
||||
|
return data[key]; |
||||
|
}); |
||||
|
this.currentDeviceChannelsLenth = channels.length; |
||||
|
} |
||||
|
|
||||
|
console.log("数据:" + JSON.stringify(channels)); |
||||
|
return channels; |
||||
|
} |
||||
|
}, |
||||
|
mounted() { |
||||
|
this.initData(); |
||||
|
this.updateLooper = setInterval(this.initData, 10000); |
||||
|
}, |
||||
|
destroyed() { |
||||
|
this.$destroy('videojs'); |
||||
|
clearTimeout(this.updateLooper); |
||||
|
}, |
||||
|
methods: { |
||||
|
initData: function() { |
||||
|
this.getDeviceList(); |
||||
|
}, |
||||
|
currentChange: function(val){ |
||||
|
this.currentPage = val; |
||||
|
this.getDeviceList(); |
||||
|
}, |
||||
|
handleSizeChange: function(val){ |
||||
|
this.count = val; |
||||
|
this.getDeviceList(); |
||||
|
}, |
||||
|
getDeviceList: function() { |
||||
|
let that = this; |
||||
|
this.getDeviceListLoading = true; |
||||
|
this.$axios.get(`/api/devices`,{ |
||||
|
params: { |
||||
|
page: that.currentPage, |
||||
|
count: that.count |
||||
|
} |
||||
|
} ) |
||||
|
.then(function (res) { |
||||
|
console.log(res); |
||||
|
console.log(res.data.list); |
||||
|
that.total = res.data.total; |
||||
|
that.deviceList = res.data.list; |
||||
|
that.getDeviceListLoading = false; |
||||
|
}) |
||||
|
.catch(function (error) { |
||||
|
console.log(error); |
||||
|
that.getDeviceListLoading = false; |
||||
|
}); |
||||
|
|
||||
|
}, |
||||
|
showChannelList: function(row) { |
||||
|
console.log(JSON.stringify(row)) |
||||
|
this.$router.push(`/channelList/${row.deviceId}/0/15/1`); |
||||
|
}, |
||||
|
showDevicePosition: function(row) { |
||||
|
console.log(JSON.stringify(row)) |
||||
|
this.$router.push(`/devicePosition/${row.deviceId}/0/15/1`); |
||||
|
}, |
||||
|
|
||||
|
//gb28181平台对接 |
||||
|
//刷新设备信息 |
||||
|
refDevice: function(itemData) { |
||||
|
///api/devices/{deviceId}/sync |
||||
|
console.log("刷新对应设备:" + itemData.deviceId); |
||||
|
var that = this; |
||||
|
that.$refs[itemData.deviceId + 'refbtn' ].loading = true; |
||||
|
this.$axios({ |
||||
|
method: 'post', |
||||
|
url: '/api/devices/' + itemData.deviceId + '/sync' |
||||
|
}).then(function(res) { |
||||
|
console.log("刷新设备结果:"+JSON.stringify(res)); |
||||
|
if (!res.data.deviceId) { |
||||
|
that.$message({ |
||||
|
showClose: true, |
||||
|
message: res.data, |
||||
|
type: 'error' |
||||
|
}); |
||||
|
}else{ |
||||
|
that.$message({ |
||||
|
showClose: true, |
||||
|
message: '请求成功', |
||||
|
type: 'success' |
||||
|
}); |
||||
|
} |
||||
|
that.initData() |
||||
|
that.$refs[itemData.deviceId + 'refbtn' ].loading = false; |
||||
|
}).catch(function(e) { |
||||
|
console.error(e) |
||||
|
that.$refs[itemData.deviceId + 'refbtn' ].loading = false; |
||||
|
});; |
||||
|
}, |
||||
|
//通知设备上传媒体流 |
||||
|
sendDevicePush: function(itemData) { |
||||
|
// let deviceId = this.currentDevice.deviceId; |
||||
|
// let channelId = itemData.channelId; |
||||
|
// console.log("通知设备推流1:" + deviceId + " : " + channelId); |
||||
|
// let that = this; |
||||
|
// this.$axios({ |
||||
|
// method: 'get', |
||||
|
// url: '/api/play/' + deviceId + '/' + channelId |
||||
|
// }).then(function(res) { |
||||
|
// let ssrc = res.data.ssrc; |
||||
|
// that.$refs.devicePlayer.play(ssrc,deviceId,channelId); |
||||
|
// }).catch(function(e) { |
||||
|
// }); |
||||
|
}, |
||||
|
transportChange: function (row) { |
||||
|
console.log(row); |
||||
|
console.log(`修改传输方式为 ${row.streamMode}:${row.deviceId} `); |
||||
|
let that = this; |
||||
|
this.$axios({ |
||||
|
method: 'get', |
||||
|
url: '/api/devices/' + row.deviceId + '/transport/' + row.streamMode |
||||
|
}).then(function(res) { |
||||
|
|
||||
|
}).catch(function(e) { |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style> |
||||
|
.videoList { |
||||
|
display: flex; |
||||
|
flex-wrap: wrap; |
||||
|
align-content: flex-start; |
||||
|
} |
||||
|
|
||||
|
.video-item { |
||||
|
position: relative; |
||||
|
width: 15rem; |
||||
|
height: 10rem; |
||||
|
margin-right: 1rem; |
||||
|
background-color: #000000; |
||||
|
} |
||||
|
|
||||
|
.video-item-img { |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
bottom: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
margin: auto; |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.video-item-img:after { |
||||
|
content: ""; |
||||
|
display: inline-block; |
||||
|
position: absolute; |
||||
|
z-index: 2; |
||||
|
top: 0; |
||||
|
bottom: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
margin: auto; |
||||
|
width: 3rem; |
||||
|
height: 3rem; |
||||
|
background-image: url("../assets/loading.png"); |
||||
|
background-size: cover; |
||||
|
background-color: #000000; |
||||
|
} |
||||
|
|
||||
|
.video-item-title { |
||||
|
position: absolute; |
||||
|
bottom: 0; |
||||
|
color: #000000; |
||||
|
background-color: #ffffff; |
||||
|
line-height: 1.5rem; |
||||
|
padding: 0.3rem; |
||||
|
width: 14.4rem; |
||||
|
} |
||||
|
</style> |
Loading…
Reference in new issue