Merge branch 'wvp-28181-2.0' of https://github.com/648540858/wvp-GB28181-pro into wvp-28181-2.0
commit
d99092ff19
|
@ -444,6 +444,7 @@ CREATE TABLE `stream_proxy` (
|
||||||
`enable_hls` bit(1) DEFAULT NULL,
|
`enable_hls` bit(1) DEFAULT NULL,
|
||||||
`enable_mp4` bit(1) DEFAULT NULL,
|
`enable_mp4` bit(1) DEFAULT NULL,
|
||||||
`enable` bit(1) NOT NULL,
|
`enable` bit(1) NOT NULL,
|
||||||
|
`status` bit(1) NOT NULL,
|
||||||
`enable_remove_none_reader` bit(1) NOT NULL,
|
`enable_remove_none_reader` bit(1) NOT NULL,
|
||||||
`createTime` varchar(50) NOT NULL,
|
`createTime` varchar(50) NOT NULL,
|
||||||
PRIMARY KEY (`app`,`stream`)
|
PRIMARY KEY (`app`,`stream`)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE stream_proxy ADD status bit(1) not null;
|
|
@ -225,6 +225,7 @@ public class SIPRequestHeaderProvider {
|
||||||
public Request createInfoRequest(Device device, StreamInfo streamInfo, String content, Long cseq)
|
public Request createInfoRequest(Device device, StreamInfo streamInfo, String content, Long cseq)
|
||||||
throws PeerUnavailableException, ParseException, InvalidArgumentException {
|
throws PeerUnavailableException, ParseException, InvalidArgumentException {
|
||||||
Request request = null;
|
Request request = null;
|
||||||
|
if (streamInfo == null) return null;
|
||||||
Dialog dialog = streamSession.getDialog(streamInfo.getDeviceID(), streamInfo.getChannelId());
|
Dialog dialog = streamSession.getDialog(streamInfo.getDeviceID(), streamInfo.getChannelId());
|
||||||
|
|
||||||
SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(),
|
SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(),
|
||||||
|
|
|
@ -1589,6 +1589,9 @@ public class SIPCommander implements ISIPCommander {
|
||||||
content.append("CSeq: " + cseq + "\r\n");
|
content.append("CSeq: " + cseq + "\r\n");
|
||||||
content.append("PauseTime: now\r\n");
|
content.append("PauseTime: now\r\n");
|
||||||
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq);
|
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq);
|
||||||
|
if (request == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
logger.info(request.toString());
|
logger.info(request.toString());
|
||||||
ClientTransaction clientTransaction = null;
|
ClientTransaction clientTransaction = null;
|
||||||
if ("TCP".equals(device.getTransport())) {
|
if ("TCP".equals(device.getTransport())) {
|
||||||
|
@ -1617,6 +1620,7 @@ public class SIPCommander implements ISIPCommander {
|
||||||
content.append("CSeq: " + cseq + "\r\n");
|
content.append("CSeq: " + cseq + "\r\n");
|
||||||
content.append("Range: npt=now-\r\n");
|
content.append("Range: npt=now-\r\n");
|
||||||
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq);
|
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq);
|
||||||
|
if (request == null) return;
|
||||||
logger.info(request.toString());
|
logger.info(request.toString());
|
||||||
ClientTransaction clientTransaction = null;
|
ClientTransaction clientTransaction = null;
|
||||||
if ("TCP".equals(device.getTransport())) {
|
if ("TCP".equals(device.getTransport())) {
|
||||||
|
@ -1645,6 +1649,7 @@ public class SIPCommander implements ISIPCommander {
|
||||||
content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n");
|
content.append("Range: npt=" + Math.abs(seekTime) + "-\r\n");
|
||||||
|
|
||||||
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq);
|
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq);
|
||||||
|
if (request == null) return;
|
||||||
logger.info(request.toString());
|
logger.info(request.toString());
|
||||||
ClientTransaction clientTransaction = null;
|
ClientTransaction clientTransaction = null;
|
||||||
if ("TCP".equals(device.getTransport())) {
|
if ("TCP".equals(device.getTransport())) {
|
||||||
|
@ -1672,6 +1677,7 @@ public class SIPCommander implements ISIPCommander {
|
||||||
content.append("CSeq: " + cseq + "\r\n");
|
content.append("CSeq: " + cseq + "\r\n");
|
||||||
content.append("Scale: " + String.format("%.1f",speed) + "\r\n");
|
content.append("Scale: " + String.format("%.1f",speed) + "\r\n");
|
||||||
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq);
|
Request request = headerProvider.createInfoRequest(device, streamInfo, content.toString(), cseq);
|
||||||
|
if (request == null) return;
|
||||||
logger.info(request.toString());
|
logger.info(request.toString());
|
||||||
ClientTransaction clientTransaction = null;
|
ClientTransaction clientTransaction = null;
|
||||||
if ("TCP".equals(device.getTransport())) {
|
if ("TCP".equals(device.getTransport())) {
|
||||||
|
|
|
@ -332,6 +332,11 @@ public class ZLMHttpHookListener {
|
||||||
}else {
|
}else {
|
||||||
mediaServerService.removeCount(mediaServerId);
|
mediaServerService.removeCount(mediaServerId);
|
||||||
}
|
}
|
||||||
|
if (item.getOriginType() == OriginType.PULL.ordinal()
|
||||||
|
|| item.getOriginType() == OriginType.FFMPEG_PULL.ordinal()) {
|
||||||
|
// 设置拉流代理上线/离线
|
||||||
|
streamProxyService.updateStatus(regist, app, streamId);
|
||||||
|
}
|
||||||
if ("rtp".equals(app) && !regist ) {
|
if ("rtp".equals(app) && !regist ) {
|
||||||
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
|
||||||
if (streamInfo!=null){
|
if (streamInfo!=null){
|
||||||
|
@ -355,6 +360,7 @@ public class ZLMHttpHookListener {
|
||||||
|| item.getOriginType() == OriginType.RTC_PUSH.ordinal() ) {
|
|| item.getOriginType() == OriginType.RTC_PUSH.ordinal() ) {
|
||||||
streamPushItem = zlmMediaListManager.addPush(item);
|
streamPushItem = zlmMediaListManager.addPush(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<GbStream> gbStreams = new ArrayList<>();
|
List<GbStream> gbStreams = new ArrayList<>();
|
||||||
if (streamPushItem == null || streamPushItem.getGbId() == null) {
|
if (streamPushItem == null || streamPushItem.getGbId() == null) {
|
||||||
GbStream gbStream = storager.getGbStream(app, streamId);
|
GbStream gbStream = storager.getGbStream(app, streamId);
|
||||||
|
|
|
@ -151,4 +151,5 @@ public class StreamProxyItem extends GbStream {
|
||||||
public void setEnable_remove_none_reader(boolean enable_remove_none_reader) {
|
public void setEnable_remove_none_reader(boolean enable_remove_none_reader) {
|
||||||
this.enable_remove_none_reader = enable_remove_none_reader;
|
this.enable_remove_none_reader = enable_remove_none_reader;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,16 @@ public interface IStreamProxyService {
|
||||||
*/
|
*/
|
||||||
boolean start(String app, String stream);
|
boolean start(String app, String stream);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新状态
|
||||||
|
* @param status 状态
|
||||||
|
* @param app
|
||||||
|
* @param stream
|
||||||
|
*/
|
||||||
|
int updateStatus(boolean status, String app, String stream);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 停用用视频代理
|
* 停用用视频代理
|
||||||
* @param app
|
* @param app
|
||||||
|
|
|
@ -14,8 +14,11 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
|
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
|
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
||||||
|
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
|
||||||
import com.genersoft.iot.vmp.service.IMediaServerService;
|
import com.genersoft.iot.vmp.service.IMediaServerService;
|
||||||
|
import com.genersoft.iot.vmp.service.IStreamProxyService;
|
||||||
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
||||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||||
import com.genersoft.iot.vmp.storager.dao.MediaServerMapper;
|
import com.genersoft.iot.vmp.storager.dao.MediaServerMapper;
|
||||||
import com.genersoft.iot.vmp.utils.redis.JedisUtil;
|
import com.genersoft.iot.vmp.utils.redis.JedisUtil;
|
||||||
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
|
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
|
||||||
|
@ -70,6 +73,12 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
|
||||||
@Autowired
|
@Autowired
|
||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IStreamProxyService streamProxyService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EventPublisher publisher;
|
private EventPublisher publisher;
|
||||||
|
|
||||||
|
@ -231,6 +240,7 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
|
||||||
public List<MediaServerItem> getAllOnline() {
|
public List<MediaServerItem> getAllOnline() {
|
||||||
String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId();
|
String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetup.getServerId();
|
||||||
Set<String> mediaServerIdSet = redisUtil.zRevRange(key, 0, -1);
|
Set<String> mediaServerIdSet = redisUtil.zRevRange(key, 0, -1);
|
||||||
|
|
||||||
List<MediaServerItem> result = new ArrayList<>();
|
List<MediaServerItem> result = new ArrayList<>();
|
||||||
if (mediaServerIdSet != null && mediaServerIdSet.size() > 0) {
|
if (mediaServerIdSet != null && mediaServerIdSet.size() > 0) {
|
||||||
for (String mediaServerId : mediaServerIdSet) {
|
for (String mediaServerId : mediaServerIdSet) {
|
||||||
|
@ -238,6 +248,7 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
|
||||||
result.add((MediaServerItem) redisUtil.get(serverKey));
|
result.add((MediaServerItem) redisUtil.get(serverKey));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Collections.reverse(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -374,6 +385,7 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
|
||||||
resetOnlineServerItem(serverItem);
|
resetOnlineServerItem(serverItem);
|
||||||
updateMediaServerKeepalive(serverItem.getId(), null);
|
updateMediaServerKeepalive(serverItem.getId(), null);
|
||||||
setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable()));
|
setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable()));
|
||||||
|
|
||||||
publisher.zlmOnlineEventPublish(serverItem.getId());
|
publisher.zlmOnlineEventPublish(serverItem.getId());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,9 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private IRedisCatchStorage redisCatchStorage;
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserSetup userSetup;
|
private UserSetup userSetup;
|
||||||
|
|
||||||
|
@ -278,7 +281,27 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void zlmServerOnline(String mediaServerId) {
|
public void zlmServerOnline(String mediaServerId) {
|
||||||
zlmServerOffline(mediaServerId);
|
// 移除开启了无人观看自动移除的流
|
||||||
|
List<StreamProxyItem> streamProxyItemList = streamProxyMapper.selecAutoRemoveItemByMediaServerId(mediaServerId);
|
||||||
|
if (streamProxyItemList.size() > 0) {
|
||||||
|
gbStreamMapper.batchDel(streamProxyItemList);
|
||||||
|
}
|
||||||
|
streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId);
|
||||||
|
|
||||||
|
// 恢复流代理, 只查找这个这个流媒体
|
||||||
|
List<StreamProxyItem> streamProxyListForEnable = storager.getStreamProxyListForEnableInMediaServer(
|
||||||
|
mediaServerId, true, false);
|
||||||
|
for (StreamProxyItem streamProxyDto : streamProxyListForEnable) {
|
||||||
|
logger.info("恢复流代理," + streamProxyDto.getApp() + "/" + streamProxyDto.getStream());
|
||||||
|
JSONObject jsonObject = addStreamProxyToZlm(streamProxyDto);
|
||||||
|
if (jsonObject == null) {
|
||||||
|
// 设置为离线
|
||||||
|
logger.info("恢复流代理失败" + streamProxyDto.getApp() + "/" + streamProxyDto.getStream());
|
||||||
|
updateStatus(false, streamProxyDto.getApp(), streamProxyDto.getStream());
|
||||||
|
}else {
|
||||||
|
updateStatus(true, streamProxyDto.getApp(), streamProxyDto.getStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -289,8 +312,8 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
|
||||||
gbStreamMapper.batchDel(streamProxyItemList);
|
gbStreamMapper.batchDel(streamProxyItemList);
|
||||||
}
|
}
|
||||||
streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId);
|
streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId);
|
||||||
// 其他的流设置未启用
|
// 其他的流设置离线
|
||||||
streamProxyMapper.updateStatus(false, mediaServerId);
|
streamProxyMapper.updateStatusByMediaServerId(false, mediaServerId);
|
||||||
String type = "PULL";
|
String type = "PULL";
|
||||||
|
|
||||||
// 发送redis消息
|
// 发送redis消息
|
||||||
|
@ -314,4 +337,9 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
|
||||||
public void clean() {
|
public void clean() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int updateStatus(boolean status, String app, String stream) {
|
||||||
|
return streamProxyMapper.updateStatus(status, app, stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -398,10 +398,11 @@ public interface IVideoManagerStorager {
|
||||||
/**
|
/**
|
||||||
* 根据媒体ID获取启用/不启用的代理列表
|
* 根据媒体ID获取启用/不启用的代理列表
|
||||||
* @param id 媒体ID
|
* @param id 媒体ID
|
||||||
* @param b 启用/不启用
|
* @param enable 启用/不启用
|
||||||
|
* @param status 状态
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean b);
|
List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean enable, boolean status);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据通道ID获取其所在设备
|
* 根据通道ID获取其所在设备
|
||||||
|
|
|
@ -11,9 +11,9 @@ import java.util.List;
|
||||||
public interface StreamProxyMapper {
|
public interface StreamProxyMapper {
|
||||||
|
|
||||||
@Insert("INSERT INTO stream_proxy (type, app, stream,mediaServerId, url, src_url, dst_url, " +
|
@Insert("INSERT INTO stream_proxy (type, app, stream,mediaServerId, url, src_url, dst_url, " +
|
||||||
"timeout_ms, ffmpeg_cmd_key, rtp_type, enable_hls, enable_mp4, enable, enable_remove_none_reader, createTime) VALUES" +
|
"timeout_ms, ffmpeg_cmd_key, rtp_type, enable_hls, enable_mp4, enable, status, enable_remove_none_reader, createTime) VALUES" +
|
||||||
"('${type}','${app}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " +
|
"('${type}','${app}', '${stream}', '${mediaServerId}','${url}', '${src_url}', '${dst_url}', " +
|
||||||
"'${timeout_ms}', '${ffmpeg_cmd_key}', '${rtp_type}', ${enable_hls}, ${enable_mp4}, ${enable}, " +
|
"'${timeout_ms}', '${ffmpeg_cmd_key}', '${rtp_type}', ${enable_hls}, ${enable_mp4}, ${enable}, ${status}, " +
|
||||||
"${enable_remove_none_reader}, '${createTime}' )")
|
"${enable_remove_none_reader}, '${createTime}' )")
|
||||||
int add(StreamProxyItem streamProxyDto);
|
int add(StreamProxyItem streamProxyDto);
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ public interface StreamProxyMapper {
|
||||||
"rtp_type=#{rtp_type}, " +
|
"rtp_type=#{rtp_type}, " +
|
||||||
"enable_hls=#{enable_hls}, " +
|
"enable_hls=#{enable_hls}, " +
|
||||||
"enable=#{enable}, " +
|
"enable=#{enable}, " +
|
||||||
|
"status=#{status}, " +
|
||||||
"enable_remove_none_reader=#{enable_remove_none_reader}, " +
|
"enable_remove_none_reader=#{enable_remove_none_reader}, " +
|
||||||
"enable_mp4=#{enable_mp4} " +
|
"enable_mp4=#{enable_mp4} " +
|
||||||
"WHERE app=#{app} AND stream=#{stream}")
|
"WHERE app=#{app} AND stream=#{stream}")
|
||||||
|
@ -49,8 +50,8 @@ public interface StreamProxyMapper {
|
||||||
|
|
||||||
@Select("SELECT st.*, pgs.gbId, pgs.name, pgs.longitude, pgs.latitude FROM stream_proxy st " +
|
@Select("SELECT st.*, pgs.gbId, pgs.name, pgs.longitude, pgs.latitude FROM stream_proxy st " +
|
||||||
"LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " +
|
"LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " +
|
||||||
"WHERE st.enable=${enable} and st.mediaServerId = '${id}' order by st.createTime desc")
|
"WHERE st.enable=${enable} and st.status=${status} and st.mediaServerId = '${id}' order by st.createTime desc")
|
||||||
List<StreamProxyItem> selectForEnableInMediaServer(String id, boolean enable);
|
List<StreamProxyItem> selectForEnableInMediaServer(String id, boolean enable, boolean status);
|
||||||
|
|
||||||
@Select("SELECT st.*, pgs.gbId, pgs.name, pgs.longitude, pgs.latitude FROM stream_proxy st " +
|
@Select("SELECT st.*, pgs.gbId, pgs.name, pgs.longitude, pgs.latitude FROM stream_proxy st " +
|
||||||
"LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " +
|
"LEFT JOIN gb_stream pgs on st.app = pgs.app AND st.stream = pgs.stream " +
|
||||||
|
@ -58,9 +59,14 @@ public interface StreamProxyMapper {
|
||||||
List<StreamProxyItem> selectInMediaServer(String id);
|
List<StreamProxyItem> selectInMediaServer(String id);
|
||||||
|
|
||||||
@Update("UPDATE stream_proxy " +
|
@Update("UPDATE stream_proxy " +
|
||||||
"SET enable=#{status} " +
|
"SET status=#{status} " +
|
||||||
"WHERE mediaServerId=#{mediaServerId}")
|
"WHERE mediaServerId=#{mediaServerId}")
|
||||||
void updateStatus(boolean status, String mediaServerId);
|
void updateStatusByMediaServerId(boolean status, String mediaServerId);
|
||||||
|
|
||||||
|
@Update("UPDATE stream_proxy " +
|
||||||
|
"SET status=${status} " +
|
||||||
|
"WHERE app=#{app} AND stream=#{stream}")
|
||||||
|
int updateStatus(boolean status, String app, String stream);
|
||||||
|
|
||||||
@Delete("DELETE FROM stream_proxy WHERE enable_remove_none_reader=true AND mediaServerId=#{mediaServerId}")
|
@Delete("DELETE FROM stream_proxy WHERE enable_remove_none_reader=true AND mediaServerId=#{mediaServerId}")
|
||||||
void deleteAutoRemoveItemByMediaServerId(String mediaServerId);
|
void deleteAutoRemoveItemByMediaServerId(String mediaServerId);
|
||||||
|
|
|
@ -860,8 +860,8 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean enable) {
|
public List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean enable, boolean status) {
|
||||||
return streamProxyMapper.selectForEnableInMediaServer(id, enable);
|
return streamProxyMapper.selectForEnableInMediaServer(id, enable, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1021,7 +1021,8 @@ public class VideoManagerStoragerImpl implements IVideoManagerStorager {
|
||||||
deviceChannel.setParental(1);
|
deviceChannel.setParental(1);
|
||||||
deviceChannel.setParentId(catalog.getParentId());
|
deviceChannel.setParentId(catalog.getParentId());
|
||||||
deviceChannel.setRegisterWay(1);
|
deviceChannel.setRegisterWay(1);
|
||||||
deviceChannel.setCivilCode(sipConfig.getDomain());
|
// 行政区划应该是Domain的前八位
|
||||||
|
deviceChannel.setCivilCode(sipConfig.getDomain().substring(0, sipConfig.getDomain().length() - 2));
|
||||||
deviceChannel.setModel("live");
|
deviceChannel.setModel("live");
|
||||||
deviceChannel.setOwner("wvp-pro");
|
deviceChannel.setOwner("wvp-pro");
|
||||||
deviceChannel.setSecrecy("0");
|
deviceChannel.setSecrecy("0");
|
||||||
|
|
|
@ -152,10 +152,10 @@ public class PtzController {
|
||||||
msg.setData("获取设备预置位超时");
|
msg.setData("获取设备预置位超时");
|
||||||
resultHolder.invokeResult(msg);
|
resultHolder.invokeResult(msg);
|
||||||
});
|
});
|
||||||
resultHolder.put(key, uuid, result);
|
|
||||||
if (resultHolder.exist(key, null)) {
|
if (resultHolder.exist(key, null)) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
resultHolder.put(key, uuid, result);
|
||||||
cmder.presetQuery(device, channelId, event -> {
|
cmder.presetQuery(device, channelId, event -> {
|
||||||
RequestMessage msg = new RequestMessage();
|
RequestMessage msg = new RequestMessage();
|
||||||
msg.setId(uuid);
|
msg.setId(uuid);
|
||||||
|
|
|
@ -261,8 +261,8 @@
|
||||||
},
|
},
|
||||||
"async-validator": {
|
"async-validator": {
|
||||||
"version": "1.8.5",
|
"version": "1.8.5",
|
||||||
"resolved": "https://registry.nlark.com/async-validator/download/async-validator-1.8.5.tgz",
|
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
|
||||||
"integrity": "sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=",
|
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"babel-runtime": "6.x"
|
"babel-runtime": "6.x"
|
||||||
}
|
}
|
||||||
|
@ -3091,8 +3091,8 @@
|
||||||
},
|
},
|
||||||
"deepmerge": {
|
"deepmerge": {
|
||||||
"version": "1.5.2",
|
"version": "1.5.2",
|
||||||
"resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz?cache=0&sync_timestamp=1572279556265&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdeepmerge%2Fdownload%2Fdeepmerge-1.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
|
||||||
"integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
|
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
|
||||||
},
|
},
|
||||||
"define-properties": {
|
"define-properties": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
|
@ -3381,9 +3381,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"element-ui": {
|
"element-ui": {
|
||||||
"version": "2.15.1",
|
"version": "2.15.6",
|
||||||
"resolved": "https://registry.npm.taobao.org/element-ui/download/element-ui-2.15.1.tgz?cache=0&sync_timestamp=1614082623756&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felement-ui%2Fdownload%2Felement-ui-2.15.1.tgz",
|
"resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.6.tgz",
|
||||||
"integrity": "sha1-raAKpuMsAndKLndWPdhGaPgTzf8=",
|
"integrity": "sha512-rcYXEKd/j2G0AgficAOk1Zd1AsnHRkhmrK4yLHmNOiimU2JfsywgfKUjMoFuT6pQx0luhovj8lFjpE4Fnt58Iw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"async-validator": "~1.8.1",
|
"async-validator": "~1.8.1",
|
||||||
"babel-helper-vue-jsx-merge-props": "^2.0.0",
|
"babel-helper-vue-jsx-merge-props": "^2.0.0",
|
||||||
|
@ -5990,7 +5990,7 @@
|
||||||
},
|
},
|
||||||
"normalize-wheel": {
|
"normalize-wheel": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
|
||||||
"integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
|
"integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
|
||||||
},
|
},
|
||||||
"npm-run-path": {
|
"npm-run-path": {
|
||||||
|
@ -9380,8 +9380,8 @@
|
||||||
},
|
},
|
||||||
"resize-observer-polyfill": {
|
"resize-observer-polyfill": {
|
||||||
"version": "1.5.1",
|
"version": "1.5.1",
|
||||||
"resolved": "https://registry.nlark.com/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
|
||||||
"integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ="
|
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
|
||||||
},
|
},
|
||||||
"resolve": {
|
"resolve": {
|
||||||
"version": "1.17.0",
|
"version": "1.17.0",
|
||||||
|
@ -10316,8 +10316,8 @@
|
||||||
},
|
},
|
||||||
"throttle-debounce": {
|
"throttle-debounce": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
|
||||||
"integrity": "sha1-UYU9o3vmihVctugns1FKPEIuic0="
|
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
|
||||||
},
|
},
|
||||||
"through2": {
|
"through2": {
|
||||||
"version": "2.0.5",
|
"version": "2.0.5",
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
"axios": "^0.24.0",
|
"axios": "^0.24.0",
|
||||||
"core-js": "^2.6.5",
|
"core-js": "^2.6.5",
|
||||||
"echarts": "^4.9.0",
|
"echarts": "^4.9.0",
|
||||||
"element-ui": "^2.15.1",
|
"element-ui": "^2.15.6",
|
||||||
"fingerprintjs2": "^2.1.2",
|
"fingerprintjs2": "^2.1.2",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"postcss-pxtorem": "^5.1.1",
|
"postcss-pxtorem": "^5.1.1",
|
||||||
|
|
|
@ -42,6 +42,14 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column prop="gbId" label="国标编码" width="180" align="center" show-overflow-tooltip/>
|
<el-table-column prop="gbId" label="国标编码" width="180" align="center" show-overflow-tooltip/>
|
||||||
|
<el-table-column label="状态" width="120" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<div slot="reference" class="name-wrapper">
|
||||||
|
<el-tag size="medium" v-if="scope.row.status">在线</el-tag>
|
||||||
|
<el-tag size="medium" type="info" v-if="!scope.row.status">离线</el-tag>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column label="启用" width="120" align="center">
|
<el-table-column label="启用" width="120" align="center">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<div slot="reference" class="name-wrapper">
|
<div slot="reference" class="name-wrapper">
|
||||||
|
|
|
@ -212,10 +212,10 @@ export default {
|
||||||
url: '/api/play/start/' + deviceId + '/' + channelId
|
url: '/api/play/start/' + deviceId + '/' + channelId
|
||||||
}).then(function (res) {
|
}).then(function (res) {
|
||||||
that.isLoging = false;
|
that.isLoging = false;
|
||||||
if (res.data.code == 0) {
|
if (res.data.code === 0) {
|
||||||
|
|
||||||
setTimeout(()=>{
|
setTimeout(()=>{
|
||||||
console.log("下载截图")
|
|
||||||
let snapId = deviceId + "_" + channelId;
|
let snapId = deviceId + "_" + channelId;
|
||||||
that.loadSnap[snapId] = 0;
|
that.loadSnap[snapId] = 0;
|
||||||
that.getSnapErrorEvent(snapId)
|
that.getSnapErrorEvent(snapId)
|
||||||
|
@ -224,7 +224,10 @@ export default {
|
||||||
streamInfo: res.data.data,
|
streamInfo: res.data.data,
|
||||||
hasAudio: itemData.hasAudio
|
hasAudio: itemData.hasAudio
|
||||||
});
|
});
|
||||||
|
setTimeout(()=>{
|
||||||
that.initData();
|
that.initData();
|
||||||
|
},1000)
|
||||||
|
|
||||||
}else {
|
}else {
|
||||||
that.$message.error(res.data.msg);
|
that.$message.error(res.data.msg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,38 +19,84 @@
|
||||||
<span >{{loadCount}}</span>
|
<span >{{loadCount}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div style="position: absolute; right: 1rem; top: 0.3rem;">
|
<div style="position: absolute; right: 1rem; top: 0.3rem;">
|
||||||
<el-popover placement="bottom" width="750" height="300" trigger="click">
|
<el-popover placement="bottom" width="900" height="300" trigger="click">
|
||||||
<div style="height: 600px;overflow:auto;">
|
<div style="height: 600px; overflow:auto; padding: 20px">
|
||||||
<table class="table-c" cellspacing="0">
|
<el-descriptions v-for="(value, key, index) in serverConfig" border column="1" style="margin-bottom: 1rem">
|
||||||
<tr v-for="(value, key, index) in serverConfig">
|
<template slot="title">
|
||||||
<td style="width: 18rem; text-align: right;">{{ key }}</td>
|
{{key}}
|
||||||
<td style="width: 33rem; text-align:left">{{ value }}</td>
|
</template>
|
||||||
</tr>
|
<el-descriptions-item v-for="(value1, key1, index1) in serverConfig[key]">
|
||||||
</table>
|
<template slot="label" >
|
||||||
|
{{ getMediaKeyNameFromKey(key1) }}
|
||||||
|
</template>
|
||||||
|
{{ value1 }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
</div>
|
</div>
|
||||||
<el-button type="primary" slot="reference" size="mini" @click="getServerConfig()">媒体服务器配置</el-button>
|
<el-button type="primary" slot="reference" size="mini" @click="getServerConfig()">媒体服务器配置</el-button>
|
||||||
</el-popover>
|
</el-popover>
|
||||||
<el-popover placement="bottom" width="750" height="300" trigger="click">
|
<el-popover placement="bottom" width="900" height="300" trigger="click">
|
||||||
<div style="height: 600px;overflow:auto;">
|
<div style="height: 600px;overflow:auto; padding: 20px">
|
||||||
<div v-for="(value, key, index) in wvpServerConfig">
|
|
||||||
{{ key }}:
|
<el-descriptions title="基础配置" border column="1">
|
||||||
<table v-if="key != 'server.port'" class="table-c" cellspacing="0">
|
<template slot="extra">
|
||||||
<tr v-for="(subValue, subKey, subIndex) in value">
|
<el-button style="float: right;" type="primary" size="mini" icon="el-icon-document-copy" title="点击拷贝" v-clipboard="JSON.stringify(wvpServerConfig.base)" @success="$message({type:'success', message:'成功拷贝到粘贴板'})"></el-button>
|
||||||
<td style="width: 18rem; text-align: right;">{{ subKey }}</td>
|
</template>
|
||||||
<td style="width: 33rem; text-align:left">{{ subValue }}</td>
|
<el-descriptions-item v-for="(value, key, index) in wvpServerConfig.base" >
|
||||||
</tr>
|
<template slot="label" >
|
||||||
</table>
|
{{ getNameFromKey(key) }}
|
||||||
<span v-if="key == 'server.port'">{{ value }}</span>
|
</template>
|
||||||
|
<div v-if="key === 'interfaceAuthenticationExcludes'">
|
||||||
|
<el-dropdown>
|
||||||
|
<span class="el-dropdown-link">
|
||||||
|
查看<i class="el-icon-arrow-down el-icon--right"></i>
|
||||||
|
</span>
|
||||||
|
<el-dropdown-menu slot="dropdown">
|
||||||
|
<el-dropdown-item v-for="(value, key, index) in wvpServerConfig.base.interfaceAuthenticationExcludes">{{value}}</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
</div>
|
||||||
|
<div v-if="key !== 'interfaceAuthenticationExcludes'">
|
||||||
|
<div v-if="value === true">
|
||||||
|
已启用
|
||||||
|
</div>
|
||||||
|
<div v-if="value === false">
|
||||||
|
未启用
|
||||||
|
</div>
|
||||||
|
<div v-if="value !== true && value !== false">
|
||||||
|
{{ value }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
<div style="margin-top: 1rem">
|
<div style="margin-top: 1rem">
|
||||||
版本信息:
|
<el-descriptions title="国标配置" border column="1">
|
||||||
<table class="table-c" cellspacing="0">
|
<template slot="extra">
|
||||||
<tr v-for="(value, key, index) in wvpServerVersion">
|
<el-button style="float: right;" type="primary" size="mini" icon="el-icon-document-copy" title="点击拷贝" v-clipboard="JSON.stringify(wvpServerConfig.sip)" @success="$message({type:'success', message:'成功拷贝到粘贴板'})"></el-button>
|
||||||
<td style="width: 18rem; text-align: right;">{{ key }}</td>
|
</template>
|
||||||
<td style="width: 33rem; text-align:left">{{ value }}</td>
|
<el-descriptions-item v-for="(value, key, index) in wvpServerConfig.sip">
|
||||||
</tr>
|
<template slot="label">
|
||||||
</table>
|
{{ getNameFromKey(key) }}
|
||||||
|
</template>
|
||||||
|
{{ value }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 1rem">
|
||||||
|
<el-descriptions title="版本信息" border column="1">
|
||||||
|
<template slot="extra">
|
||||||
|
<el-button style="float: right;" type="primary" size="mini" icon="el-icon-document-copy" title="点击拷贝" v-clipboard="JSON.stringify(wvpServerVersion)" @success="$message({type:'success', message:'成功拷贝到粘贴板'})"></el-button>
|
||||||
|
</template>
|
||||||
|
<el-descriptions-item v-for="(value, key, index) in wvpServerVersion">
|
||||||
|
<template slot="label">
|
||||||
|
{{ getNameFromKey(key) }}
|
||||||
|
</template>
|
||||||
|
{{ value }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-button type="primary" slot="reference" size="mini" @click="getWVPServerConfig()">信令服务器配置</el-button>
|
<el-button type="primary" slot="reference" size="mini" @click="getWVPServerConfig()">信令服务器配置</el-button>
|
||||||
|
@ -334,7 +380,17 @@ export default {
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/zlm/' + that.mediaServerChoose +'/index/api/getServerConfig'
|
url: '/zlm/' + that.mediaServerChoose +'/index/api/getServerConfig'
|
||||||
}).then(function (res) {
|
}).then(function (res) {
|
||||||
that.serverConfig = res.data.data[0];
|
let info = res.data.data[0];
|
||||||
|
let serverInfo = {}
|
||||||
|
for (let i = 0; i < Object.keys(info).length; i++) {
|
||||||
|
let key = Object.keys(info)[i];
|
||||||
|
let group = key.substring(0, key.indexOf("."))
|
||||||
|
let itemKey = key.substring(key.indexOf(".") + 1)
|
||||||
|
if (!serverInfo[group]) serverInfo[group] = {}
|
||||||
|
serverInfo[group][itemKey] = info[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
that.serverConfig = serverInfo;
|
||||||
that.visible = true;
|
that.visible = true;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -410,6 +466,92 @@ export default {
|
||||||
message: '删除成功!'
|
message: '删除成功!'
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
getNameFromKey: function(key) {
|
||||||
|
let nameData = {
|
||||||
|
"waitTrack": "等待编码信息",
|
||||||
|
"interfaceAuthenticationExcludes": "不进行鉴权的接口",
|
||||||
|
"playTimeout": "点播超时时间",
|
||||||
|
"autoApplyPlay": "自动点播",
|
||||||
|
"recordPushLive": "推流录像",
|
||||||
|
"redisConfig": "自动配置redis",
|
||||||
|
"thirdPartyGBIdReg": "stream信息正则",
|
||||||
|
"savePositionHistory": "保存轨迹信息",
|
||||||
|
"interfaceAuthentication": "接口鉴权",
|
||||||
|
"serverId": "服务ID",
|
||||||
|
"logInDatebase": "日志存储进数据库",
|
||||||
|
"seniorSdp": "扩展SDP",
|
||||||
|
"password": "密码",
|
||||||
|
"port": "端口号",
|
||||||
|
"keepaliveTimeOut": "心跳超时",
|
||||||
|
"domain": "国标域",
|
||||||
|
"ip": "IP地址",
|
||||||
|
"monitorIp": "监听IP",
|
||||||
|
"alarm": "存储报警信息",
|
||||||
|
"ptzSpeed": "云台控制速度",
|
||||||
|
"id": "国标ID",
|
||||||
|
"registerTimeInterval": "注册间隔",
|
||||||
|
"artifactId": "模块名称",
|
||||||
|
"version": "版本",
|
||||||
|
"project": "工程",
|
||||||
|
"git_Revision": "GIT修订版本",
|
||||||
|
"git_BRANCH": "GIT分支",
|
||||||
|
"git_URL": "GIT地址",
|
||||||
|
"build_DATE": "构建时间",
|
||||||
|
"create_By": "作者",
|
||||||
|
"git_Revision_SHORT": "GIT修订版本(短)",
|
||||||
|
"build_Jdk": "构建用JDK",
|
||||||
|
};
|
||||||
|
console.log(key + ": " + nameData[key])
|
||||||
|
|
||||||
|
if (nameData[key]) {
|
||||||
|
return nameData[key]
|
||||||
|
}else {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getMediaKeyNameFromKey: function(key) {
|
||||||
|
let nameData = {
|
||||||
|
"waitTrack": "等待编码信息",
|
||||||
|
"interfaceAuthenticationExcludes": "不进行鉴权的接口",
|
||||||
|
"playTimeout": "点播超时时间",
|
||||||
|
"autoApplyPlay": "自动点播",
|
||||||
|
"recordPushLive": "推流录像",
|
||||||
|
"redisConfig": "自动配置redis",
|
||||||
|
"thirdPartyGBIdReg": "stream信息正则",
|
||||||
|
"savePositionHistory": "保存轨迹信息",
|
||||||
|
"interfaceAuthentication": "接口鉴权",
|
||||||
|
"serverId": "服务ID",
|
||||||
|
"logInDatebase": "日志存储进数据库",
|
||||||
|
"seniorSdp": "扩展SDP",
|
||||||
|
"password": "密码",
|
||||||
|
"port": "端口号",
|
||||||
|
"keepaliveTimeOut": "心跳超时",
|
||||||
|
"domain": "国标域",
|
||||||
|
"ip": "IP地址",
|
||||||
|
"monitorIp": "监听IP",
|
||||||
|
"alarm": "存储报警信息",
|
||||||
|
"ptzSpeed": "云台控制速度",
|
||||||
|
"id": "国标ID",
|
||||||
|
"registerTimeInterval": "注册间隔",
|
||||||
|
"artifactId": "模块名称",
|
||||||
|
"version": "版本",
|
||||||
|
"project": "工程",
|
||||||
|
"git_Revision": "GIT修订版本",
|
||||||
|
"git_BRANCH": "GIT分支",
|
||||||
|
"git_URL": "GIT地址",
|
||||||
|
"build_DATE": "构建时间",
|
||||||
|
"create_By": "作者",
|
||||||
|
"git_Revision_SHORT": "GIT修订版本(短)",
|
||||||
|
"build_Jdk": "构建用JDK",
|
||||||
|
};
|
||||||
|
console.log(key + ": " + nameData[key])
|
||||||
|
|
||||||
|
if (nameData[key]) {
|
||||||
|
return nameData[key]
|
||||||
|
}else {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -46,7 +46,6 @@
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
placeholder="请选择拉流节点"
|
placeholder="请选择拉流节点"
|
||||||
>
|
>
|
||||||
<el-option label="自动选择" value="auto"></el-option>
|
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in mediaServerList"
|
v-for="item in mediaServerList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
@ -172,7 +171,7 @@ export default {
|
||||||
enable_mp4: false,
|
enable_mp4: false,
|
||||||
enable_remove_none_reader: false,
|
enable_remove_none_reader: false,
|
||||||
platformGbId: null,
|
platformGbId: null,
|
||||||
mediaServerId: "auto",
|
mediaServerId: null,
|
||||||
},
|
},
|
||||||
mediaServerList:{},
|
mediaServerList:{},
|
||||||
ffmpegCmdList:{},
|
ffmpegCmdList:{},
|
||||||
|
@ -206,7 +205,8 @@ export default {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
});
|
});
|
||||||
this.mediaServer.getOnlineMediaServerList((data)=>{
|
this.mediaServer.getOnlineMediaServerList((data)=>{
|
||||||
this.mediaServerList = data;
|
this.mediaServerList = data.data;
|
||||||
|
this.proxyParam.mediaServerId = this.mediaServerList[0].id
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
mediaServerIdChange:function (){
|
mediaServerIdChange:function (){
|
||||||
|
|
Loading…
Reference in New Issue