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