存储部分使用sqlite代替redis
This commit is contained in:
parent
59f7fb1063
commit
2ab8b942bd
7
pom.xml
7
pom.xml
@ -99,6 +99,13 @@
|
|||||||
<version>8.0.22</version>
|
<version>8.0.22</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- 添加sqlite-jdbc数据库驱动 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.xerial</groupId>
|
||||||
|
<artifactId>sqlite-jdbc</artifactId>
|
||||||
|
<version>3.32.3.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!--Mybatis -->
|
<!--Mybatis -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.mybatis</groupId>
|
<groupId>org.mybatis</groupId>
|
||||||
|
@ -138,16 +138,25 @@ public class SipLayer implements SipListener {
|
|||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
if (evt.getResponse() != null && sipSubscribe.getOkSubscribesSize() > 0 ) {
|
||||||
|
CallIdHeader callIdHeader = (CallIdHeader)evt.getResponse().getHeader(CallIdHeader.NAME);
|
||||||
|
if (callIdHeader != null) {
|
||||||
|
SipSubscribe.Event subscribe = sipSubscribe.getOkSubscribe(callIdHeader.getCallId());
|
||||||
|
if (subscribe != null) {
|
||||||
|
subscribe.response(evt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// } else if (status == Response.TRYING) {
|
// } else if (status == Response.TRYING) {
|
||||||
// trying不会回复
|
// trying不会回复
|
||||||
} else if ((status >= 100) && (status < 200)) {
|
} else if ((status >= 100) && (status < 200)) {
|
||||||
// 增加其它无需回复的响应,如101、180等
|
// 增加其它无需回复的响应,如101、180等
|
||||||
} else {
|
} else {
|
||||||
logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase()/* .getContent().toString()*/);
|
logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase()/* .getContent().toString()*/);
|
||||||
if (evt.getResponse() != null && sipSubscribe.getSize() > 0 ) {
|
if (evt.getResponse() != null && sipSubscribe.getErrorSubscribesSize() > 0 ) {
|
||||||
CallIdHeader callIdHeader = (CallIdHeader)evt.getResponse().getHeader(CallIdHeader.NAME);
|
CallIdHeader callIdHeader = (CallIdHeader)evt.getResponse().getHeader(CallIdHeader.NAME);
|
||||||
if (callIdHeader != null) {
|
if (callIdHeader != null) {
|
||||||
SipSubscribe.Event subscribe = sipSubscribe.getSubscribe(callIdHeader.getCallId());
|
SipSubscribe.Event subscribe = sipSubscribe.getErrorSubscribe(callIdHeader.getCallId());
|
||||||
if (subscribe != null) {
|
if (subscribe != null) {
|
||||||
subscribe.response(evt);
|
subscribe.response(evt);
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,17 @@
|
|||||||
package com.genersoft.iot.vmp.gb28181.bean;
|
package com.genersoft.iot.vmp.gb28181.bean;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class Device {
|
public class Device {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据库存储ID
|
||||||
|
*/
|
||||||
|
private int id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设备Id
|
* 设备Id
|
||||||
*/
|
*/
|
||||||
@ -55,14 +61,24 @@ public class Device {
|
|||||||
*/
|
*/
|
||||||
private int online;
|
private int online;
|
||||||
|
|
||||||
/**
|
|
||||||
* 通道列表
|
|
||||||
*/
|
|
||||||
// private Map<String,DeviceChannel> channelMap;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册时间
|
||||||
|
*/
|
||||||
|
private Long registerTimeMillis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通道个数
|
||||||
|
*/
|
||||||
private int channelCount;
|
private int channelCount;
|
||||||
|
|
||||||
private List<String> channelList;
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
public String getDeviceId() {
|
public String getDeviceId() {
|
||||||
return deviceId;
|
return deviceId;
|
||||||
@ -144,11 +160,11 @@ public class Device {
|
|||||||
this.channelCount = channelCount;
|
this.channelCount = channelCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getChannelList() {
|
public Long getRegisterTimeMillis() {
|
||||||
return channelList;
|
return registerTimeMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setChannelList(List<String> channelList) {
|
public void setRegisterTimeMillis(Long registerTimeMillis) {
|
||||||
this.channelList = channelList;
|
this.registerTimeMillis = registerTimeMillis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,10 +2,17 @@ package com.genersoft.iot.vmp.gb28181.bean;
|
|||||||
|
|
||||||
public class DeviceChannel {
|
public class DeviceChannel {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通道id
|
* 通道id
|
||||||
*/
|
*/
|
||||||
private String channelId;
|
private String channelId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备id
|
||||||
|
*/
|
||||||
|
private String deviceId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通道名
|
* 通道名
|
||||||
@ -146,13 +153,15 @@ public class DeviceChannel {
|
|||||||
/**
|
/**
|
||||||
* 是否含有音频
|
* 是否含有音频
|
||||||
*/
|
*/
|
||||||
private boolean hasAudio;
|
private boolean hasAudio;
|
||||||
|
|
||||||
/**
|
public String getDeviceId() {
|
||||||
* 是否正在播放
|
return deviceId;
|
||||||
*/
|
}
|
||||||
private boolean play;
|
|
||||||
|
|
||||||
|
public void setDeviceId(String deviceId) {
|
||||||
|
this.deviceId = deviceId;
|
||||||
|
}
|
||||||
|
|
||||||
public void setPTZType(int PTZType) {
|
public void setPTZType(int PTZType) {
|
||||||
this.PTZType = PTZType;
|
this.PTZType = PTZType;
|
||||||
@ -387,14 +396,6 @@ public class DeviceChannel {
|
|||||||
this.hasAudio = hasAudio;
|
this.hasAudio = hasAudio;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPlay() {
|
|
||||||
return play;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPlay(boolean play) {
|
|
||||||
this.play = play;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStreamId() {
|
public String getStreamId() {
|
||||||
return streamId;
|
return streamId;
|
||||||
}
|
}
|
||||||
|
@ -17,21 +17,34 @@ public class SipSubscribe {
|
|||||||
|
|
||||||
private final static Logger logger = LoggerFactory.getLogger(SipSubscribe.class);
|
private final static Logger logger = LoggerFactory.getLogger(SipSubscribe.class);
|
||||||
|
|
||||||
private Map<String, SipSubscribe.Event> allSubscribes = new ConcurrentHashMap<>();
|
private Map<String, SipSubscribe.Event> errorSubscribes = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private Map<String, SipSubscribe.Event> okSubscribes = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public interface Event {
|
public interface Event {
|
||||||
void response(ResponseEvent event);
|
void response(ResponseEvent event);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSubscribe(String key, SipSubscribe.Event event) {
|
public void addErrorSubscribe(String key, SipSubscribe.Event event) {
|
||||||
allSubscribes.put(key, event);
|
errorSubscribes.put(key, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SipSubscribe.Event getSubscribe(String key) {
|
public void addOkSubscribe(String key, SipSubscribe.Event event) {
|
||||||
return allSubscribes.get(key);
|
okSubscribes.put(key, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSize(){
|
public SipSubscribe.Event getErrorSubscribe(String key) {
|
||||||
return allSubscribes.size();
|
return errorSubscribes.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SipSubscribe.Event getOkSubscribe(String key) {
|
||||||
|
return okSubscribes.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getErrorSubscribesSize(){
|
||||||
|
return errorSubscribes.size();
|
||||||
|
}
|
||||||
|
public int getOkSubscribesSize(){
|
||||||
|
return okSubscribes.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,10 @@ import javax.sip.RequestEvent;
|
|||||||
import javax.sip.ResponseEvent;
|
import javax.sip.ResponseEvent;
|
||||||
import javax.sip.SipProvider;
|
import javax.sip.SipProvider;
|
||||||
import javax.sip.header.CSeqHeader;
|
import javax.sip.header.CSeqHeader;
|
||||||
import javax.sip.header.CallIdHeader;
|
|
||||||
import javax.sip.header.Header;
|
|
||||||
import javax.sip.message.Request;
|
import javax.sip.message.Request;
|
||||||
import javax.sip.message.Response;
|
import javax.sip.message.Response;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -59,6 +56,9 @@ public class SIPProcessorFactory {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EventPublisher publisher;
|
private EventPublisher publisher;
|
||||||
@ -143,6 +143,7 @@ public class SIPProcessorFactory {
|
|||||||
processor.setOffLineDetector(offLineDetector);
|
processor.setOffLineDetector(offLineDetector);
|
||||||
processor.setCmder(cmder);
|
processor.setCmder(cmder);
|
||||||
processor.setStorager(storager);
|
processor.setStorager(storager);
|
||||||
|
processor.setRedisCatchStorage(redisCatchStorage);
|
||||||
return processor;
|
return processor;
|
||||||
} else {
|
} else {
|
||||||
return new OtherRequestProcessor();
|
return new OtherRequestProcessor();
|
||||||
|
@ -25,6 +25,8 @@ public class DeferredResultHolder {
|
|||||||
|
|
||||||
public static final String CALLBACK_CMD_PlAY = "CALLBACK_PLAY";
|
public static final String CALLBACK_CMD_PlAY = "CALLBACK_PLAY";
|
||||||
|
|
||||||
|
public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP";
|
||||||
|
|
||||||
private Map<String, DeferredResult> map = new ConcurrentHashMap<String, DeferredResult>();
|
private Map<String, DeferredResult> map = new ConcurrentHashMap<String, DeferredResult>();
|
||||||
|
|
||||||
public void put(String key, DeferredResult result) {
|
public void put(String key, DeferredResult result) {
|
||||||
|
@ -101,8 +101,9 @@ public interface ISIPCommander {
|
|||||||
*
|
*
|
||||||
* @param ssrc ssrc
|
* @param ssrc ssrc
|
||||||
*/
|
*/
|
||||||
|
void streamByeCmd(String ssrc, SipSubscribe.Event okEvent);
|
||||||
void streamByeCmd(String ssrc);
|
void streamByeCmd(String ssrc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 语音广播
|
* 语音广播
|
||||||
*
|
*
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
|
package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
|
||||||
|
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@ -12,11 +13,13 @@ import javax.sip.header.ViaHeader;
|
|||||||
import javax.sip.message.Request;
|
import javax.sip.message.Request;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
|
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
|
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
|
||||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -53,6 +56,9 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@Qualifier(value="tcpSipProvider")
|
@Qualifier(value="tcpSipProvider")
|
||||||
@ -229,7 +235,7 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
|
|
||||||
Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
|
Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
|
||||||
|
|
||||||
transmitRequest(device, request, null);
|
transmitRequest(device, request);
|
||||||
return true;
|
return true;
|
||||||
} catch (SipException | ParseException | InvalidArgumentException e) {
|
} catch (SipException | ParseException | InvalidArgumentException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -264,7 +270,7 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
ptzXml.append("</Control>\r\n");
|
ptzXml.append("</Control>\r\n");
|
||||||
|
|
||||||
Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
|
Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), "ViaPtzBranch", "FromPtzTag", "ToPtzTag");
|
||||||
transmitRequest(device, request, null);
|
transmitRequest(device, request);
|
||||||
return true;
|
return true;
|
||||||
} catch (SipException | ParseException | InvalidArgumentException e) {
|
} catch (SipException | ParseException | InvalidArgumentException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -291,7 +297,7 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
|
streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
|
||||||
}
|
}
|
||||||
String streamMode = device.getStreamMode().toUpperCase();
|
String streamMode = device.getStreamMode().toUpperCase();
|
||||||
MediaServerConfig mediaInfo = storager.getMediaInfo();
|
MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
|
||||||
if (mediaInfo == null) {
|
if (mediaInfo == null) {
|
||||||
logger.warn("点播时发现ZLM尚未连接...");
|
logger.warn("点播时发现ZLM尚未连接...");
|
||||||
return;
|
return;
|
||||||
@ -344,6 +350,9 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
}
|
}
|
||||||
content.append("y="+ssrc+"\r\n");//ssrc
|
content.append("y="+ssrc+"\r\n");//ssrc
|
||||||
|
|
||||||
|
// String fromTag = UUID.randomUUID().toString();
|
||||||
|
// Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, fromTag, null, ssrc);
|
||||||
|
|
||||||
Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null, ssrc);
|
Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "live", null, ssrc);
|
||||||
|
|
||||||
ClientTransaction transaction = transmitRequest(device, request, errorEvent);
|
ClientTransaction transaction = transmitRequest(device, request, errorEvent);
|
||||||
@ -372,7 +381,7 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
public void playbackStreamCmd(Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event
|
public void playbackStreamCmd(Device device, String channelId, String startTime, String endTime, ZLMHttpHookSubscribe.Event event
|
||||||
, SipSubscribe.Event errorEvent) {
|
, SipSubscribe.Event errorEvent) {
|
||||||
try {
|
try {
|
||||||
MediaServerConfig mediaInfo = storager.getMediaInfo();
|
MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
|
||||||
String ssrc = streamSession.createPlayBackSsrc();
|
String ssrc = streamSession.createPlayBackSsrc();
|
||||||
String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
|
String streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
|
||||||
// 添加订阅
|
// 添加订阅
|
||||||
@ -457,17 +466,28 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 视频流停止
|
* 视频流停止
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void streamByeCmd(String streamId) {
|
public void streamByeCmd(String ssrc) {
|
||||||
|
streamByeCmd(ssrc, null);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void streamByeCmd(String streamId, SipSubscribe.Event okEvent) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ClientTransaction transaction = streamSession.get(streamId);
|
ClientTransaction transaction = streamSession.get(streamId);
|
||||||
|
// 服务重启后
|
||||||
if (transaction == null) {
|
if (transaction == null) {
|
||||||
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
|
||||||
|
if (streamInfo != null) {
|
||||||
|
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,6 +495,9 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
if (dialog == null) {
|
if (dialog == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Request byeRequest = dialog.createRequest(Request.BYE);
|
Request byeRequest = dialog.createRequest(Request.BYE);
|
||||||
SipURI byeURI = (SipURI) byeRequest.getRequestURI();
|
SipURI byeURI = (SipURI) byeRequest.getRequestURI();
|
||||||
String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString();
|
String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString();
|
||||||
@ -491,7 +514,14 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
} else if("UDP".equals(protocol)) {
|
} else if("UDP".equals(protocol)) {
|
||||||
clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest);
|
clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CallIdHeader callIdHeader = (CallIdHeader) byeRequest.getHeader(CallIdHeader.NAME);
|
||||||
|
if (okEvent != null) {
|
||||||
|
sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
|
||||||
|
}
|
||||||
|
|
||||||
dialog.sendRequest(clientTransaction);
|
dialog.sendRequest(clientTransaction);
|
||||||
|
|
||||||
streamSession.remove(streamId);
|
streamSession.remove(streamId);
|
||||||
zlmrtpServerFactory.closeRTPServer(streamId);
|
zlmrtpServerFactory.closeRTPServer(streamId);
|
||||||
} catch (TransactionDoesNotExistException e) {
|
} catch (TransactionDoesNotExistException e) {
|
||||||
@ -612,7 +642,7 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
|
|
||||||
Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaDeviceInfoBranch", "FromDeviceInfoTag", "ToDeviceInfoTag");
|
Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), "ViaDeviceInfoBranch", "FromDeviceInfoTag", "ToDeviceInfoTag");
|
||||||
|
|
||||||
transmitRequest(device, request, null);
|
transmitRequest(device, request);
|
||||||
|
|
||||||
} catch (SipException | ParseException | InvalidArgumentException e) {
|
} catch (SipException | ParseException | InvalidArgumentException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -676,7 +706,7 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "ViaRecordInfoBranch", "FromRecordInfoTag", null);
|
Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), "ViaRecordInfoBranch", "FromRecordInfoTag", null);
|
||||||
|
|
||||||
|
|
||||||
transmitRequest(device, request, null);
|
transmitRequest(device, request);
|
||||||
} catch (SipException | ParseException | InvalidArgumentException e) {
|
} catch (SipException | ParseException | InvalidArgumentException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return false;
|
return false;
|
||||||
@ -727,8 +757,16 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ClientTransaction transmitRequest(Device device, Request request) throws SipException {
|
||||||
|
return transmitRequest(device, request, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent) throws SipException {
|
private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent) throws SipException {
|
||||||
|
return transmitRequest(device, request, errorEvent, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ClientTransaction transmitRequest(Device device, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException {
|
||||||
ClientTransaction clientTransaction = null;
|
ClientTransaction clientTransaction = null;
|
||||||
if("TCP".equals(device.getTransport())) {
|
if("TCP".equals(device.getTransport())) {
|
||||||
clientTransaction = tcpSipProvider.getNewClientTransaction(request);
|
clientTransaction = tcpSipProvider.getNewClientTransaction(request);
|
||||||
@ -736,10 +774,14 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
clientTransaction = udpSipProvider.getNewClientTransaction(request);
|
clientTransaction = udpSipProvider.getNewClientTransaction(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加订阅
|
CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
|
||||||
|
// 添加错误订阅
|
||||||
if (errorEvent != null) {
|
if (errorEvent != null) {
|
||||||
CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
|
sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), errorEvent);
|
||||||
sipSubscribe.addSubscribe(callIdHeader.getCallId(), errorEvent);
|
}
|
||||||
|
// 添加订阅
|
||||||
|
if (okEvent != null) {
|
||||||
|
sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
clientTransaction.sendRequest();
|
clientTransaction.sendRequest();
|
||||||
@ -747,6 +789,8 @@ public class SIPCommander implements ISIPCommander {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void closeRTPServer(Device device, String channelId) {
|
public void closeRTPServer(Device device, String channelId) {
|
||||||
if (rtpEnable) {
|
if (rtpEnable) {
|
||||||
|
@ -10,6 +10,7 @@ import javax.sip.SipException;
|
|||||||
import javax.sip.message.Request;
|
import javax.sip.message.Request;
|
||||||
import javax.sip.message.Response;
|
import javax.sip.message.Response;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import org.dom4j.Document;
|
import org.dom4j.Document;
|
||||||
import org.dom4j.DocumentException;
|
import org.dom4j.DocumentException;
|
||||||
import org.dom4j.Element;
|
import org.dom4j.Element;
|
||||||
@ -48,6 +49,8 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
|
|||||||
|
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
private EventPublisher publisher;
|
private EventPublisher publisher;
|
||||||
|
|
||||||
private RedisUtil redis;
|
private RedisUtil redis;
|
||||||
@ -451,9 +454,9 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
|
|||||||
String NotifyType =XmlUtil.getText(rootElement, "NotifyType");
|
String NotifyType =XmlUtil.getText(rootElement, "NotifyType");
|
||||||
if (NotifyType.equals("121")){
|
if (NotifyType.equals("121")){
|
||||||
logger.info("媒体播放完毕,通知关流");
|
logger.info("媒体播放完毕,通知关流");
|
||||||
StreamInfo streamInfo = storager.queryPlaybackByDevice(deviceId, "*");
|
StreamInfo streamInfo = redisCatchStorage.queryPlaybackByDevice(deviceId, "*");
|
||||||
if (streamInfo != null) {
|
if (streamInfo != null) {
|
||||||
storager.stopPlayback(streamInfo);
|
redisCatchStorage.stopPlayback(streamInfo);
|
||||||
cmder.streamByeCmd(streamInfo.getStreamId());
|
cmder.streamByeCmd(streamInfo.getStreamId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -507,4 +510,11 @@ public class MessageRequestProcessor extends SIPRequestAbstractProcessor {
|
|||||||
this.offLineDetector = offLineDetector;
|
this.offLineDetector = offLineDetector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IRedisCatchStorage getRedisCatchStorage() {
|
||||||
|
return redisCatchStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRedisCatchStorage(IRedisCatchStorage redisCatchStorage) {
|
||||||
|
this.redisCatchStorage = redisCatchStorage;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -141,9 +141,15 @@ public class RegisterRequestProcessor extends SIPRequestAbstractProcessor {
|
|||||||
// 下发catelog查询目录
|
// 下发catelog查询目录
|
||||||
if (registerFlag == 1 && device != null) {
|
if (registerFlag == 1 && device != null) {
|
||||||
logger.info("注册成功! deviceId:" + device.getDeviceId());
|
logger.info("注册成功! deviceId:" + device.getDeviceId());
|
||||||
|
boolean exists = storager.exists(device.getDeviceId());
|
||||||
|
device.setRegisterTimeMillis(System.currentTimeMillis());
|
||||||
storager.updateDevice(device);
|
storager.updateDevice(device);
|
||||||
publisher.onlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_ONLINE_REGISTER);
|
publisher.onlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_ONLINE_REGISTER);
|
||||||
handler.onRegister(device);
|
|
||||||
|
// 只有第一次注册才更新通道
|
||||||
|
if (!exists) {
|
||||||
|
handler.onRegister(device);
|
||||||
|
}
|
||||||
} else if (registerFlag == 2) {
|
} else if (registerFlag == 2) {
|
||||||
logger.info("注销成功! deviceId:" + device.getDeviceId());
|
logger.info("注销成功! deviceId:" + device.getDeviceId());
|
||||||
publisher.outlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_OUTLINE_UNREGISTER);
|
publisher.outlineEventPublish(device.getDeviceId(), VideoManagerConstants.EVENT_OUTLINE_UNREGISTER);
|
||||||
|
@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.media.zlm;
|
|||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -29,6 +30,9 @@ public class ZLMHTTPProxyController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
@Value("${media.port}")
|
@Value("${media.port}")
|
||||||
private int mediaHttpPort;
|
private int mediaHttpPort;
|
||||||
|
|
||||||
@ -36,10 +40,10 @@ public class ZLMHTTPProxyController {
|
|||||||
@RequestMapping(value = "/**/**/**", produces = "application/json;charset=UTF-8")
|
@RequestMapping(value = "/**/**/**", produces = "application/json;charset=UTF-8")
|
||||||
public Object proxy(HttpServletRequest request, HttpServletResponse response){
|
public Object proxy(HttpServletRequest request, HttpServletResponse response){
|
||||||
|
|
||||||
if (storager.getMediaInfo() == null) {
|
if (redisCatchStorage.getMediaInfo() == null) {
|
||||||
return "未接入流媒体";
|
return "未接入流媒体";
|
||||||
}
|
}
|
||||||
MediaServerConfig mediaInfo = storager.getMediaInfo();
|
MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
|
||||||
String requestURI = String.format("http://%s:%s%s?%s&%s",
|
String requestURI = String.format("http://%s:%s%s?%s&%s",
|
||||||
mediaInfo.getLocalIP(),
|
mediaInfo.getLocalIP(),
|
||||||
mediaHttpPort,
|
mediaHttpPort,
|
||||||
|
@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONArray;
|
|||||||
import com.genersoft.iot.vmp.common.StreamInfo;
|
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
||||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||||
import com.genersoft.iot.vmp.utils.IpUtil;
|
import com.genersoft.iot.vmp.utils.IpUtil;
|
||||||
import com.genersoft.iot.vmp.vmanager.service.IPlayService;
|
import com.genersoft.iot.vmp.vmanager.service.IPlayService;
|
||||||
@ -52,6 +53,9 @@ public class ZLMHttpHookListener {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ZLMRESTfulUtils zlmresTfulUtils;
|
private ZLMRESTfulUtils zlmresTfulUtils;
|
||||||
|
|
||||||
@ -249,13 +253,13 @@ public class ZLMHttpHookListener {
|
|||||||
String app = json.getString("app");
|
String app = json.getString("app");
|
||||||
String streamId = json.getString("stream");
|
String streamId = json.getString("stream");
|
||||||
boolean regist = json.getBoolean("regist");
|
boolean regist = json.getBoolean("regist");
|
||||||
StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
|
||||||
if ("rtp".equals(app) && !regist ) {
|
if ("rtp".equals(app) && !regist ) {
|
||||||
if (streamInfo!=null){
|
if (streamInfo!=null){
|
||||||
storager.stopPlay(streamInfo);
|
redisCatchStorage.stopPlay(streamInfo);
|
||||||
}else{
|
}else{
|
||||||
streamInfo = storager.queryPlaybackByStreamId(streamId);
|
streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId);
|
||||||
storager.stopPlayback(streamInfo);
|
redisCatchStorage.stopPlayback(streamInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,12 +285,12 @@ public class ZLMHttpHookListener {
|
|||||||
String streamId = json.getString("stream");
|
String streamId = json.getString("stream");
|
||||||
|
|
||||||
cmder.streamByeCmd(streamId);
|
cmder.streamByeCmd(streamId);
|
||||||
StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
|
||||||
if (streamInfo!=null){
|
if (streamInfo!=null){
|
||||||
storager.stopPlay(streamInfo);
|
redisCatchStorage.stopPlay(streamInfo);
|
||||||
}else{
|
}else{
|
||||||
streamInfo = storager.queryPlaybackByStreamId(streamId);
|
streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId);
|
||||||
storager.stopPlayback(streamInfo);
|
redisCatchStorage.stopPlayback(streamInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject ret = new JSONObject();
|
JSONObject ret = new JSONObject();
|
||||||
@ -311,7 +315,7 @@ public class ZLMHttpHookListener {
|
|||||||
if (autoApplyPlay) {
|
if (autoApplyPlay) {
|
||||||
String app = json.getString("app");
|
String app = json.getString("app");
|
||||||
String streamId = json.getString("stream");
|
String streamId = json.getString("stream");
|
||||||
StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
|
||||||
if ("rtp".equals(app) && streamId.indexOf("gb_play") > -1 && streamInfo == null) {
|
if ("rtp".equals(app) && streamId.indexOf("gb_play") > -1 && streamInfo == null) {
|
||||||
String[] s = streamId.split("_");
|
String[] s = streamId.split("_");
|
||||||
if (s.length == 4) {
|
if (s.length == 4) {
|
||||||
@ -355,7 +359,7 @@ public class ZLMHttpHookListener {
|
|||||||
// MediaServerConfig mediaServerConfig = mediaServerConfigs.get(0);
|
// MediaServerConfig mediaServerConfig = mediaServerConfigs.get(0);
|
||||||
MediaServerConfig mediaServerConfig = JSON.toJavaObject(json, MediaServerConfig.class);
|
MediaServerConfig mediaServerConfig = JSON.toJavaObject(json, MediaServerConfig.class);
|
||||||
mediaServerConfig.setLocalIP(mediaIp);
|
mediaServerConfig.setLocalIP(mediaIp);
|
||||||
storager.updateMediaInfo(mediaServerConfig);
|
redisCatchStorage.updateMediaInfo(mediaServerConfig);
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
JSONObject ret = new JSONObject();
|
JSONObject ret = new JSONObject();
|
||||||
|
@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||||
import okhttp3.*;
|
import okhttp3.*;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -30,6 +31,9 @@ public class ZLMRunner implements CommandLineRunner {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
@Value("${media.ip}")
|
@Value("${media.ip}")
|
||||||
private String mediaIp;
|
private String mediaIp;
|
||||||
|
|
||||||
@ -69,7 +73,7 @@ public class ZLMRunner implements CommandLineRunner {
|
|||||||
logger.info("zlm接入成功...");
|
logger.info("zlm接入成功...");
|
||||||
if (autoConfig) saveZLMConfig();
|
if (autoConfig) saveZLMConfig();
|
||||||
mediaServerConfig = getMediaServerConfig();
|
mediaServerConfig = getMediaServerConfig();
|
||||||
storager.updateMediaInfo(mediaServerConfig);
|
redisCatchStorage.updateMediaInfo(mediaServerConfig);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,58 @@
|
|||||||
|
package com.genersoft.iot.vmp.storager;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
|
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface IRedisCatchStorage {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始播放时将流存入
|
||||||
|
*
|
||||||
|
* @param stream 流信息
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean startPlay(StreamInfo stream);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 停止播放时删除
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean stopPlay(StreamInfo streamInfo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询播放列表
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
StreamInfo queryPlay(StreamInfo streamInfo);
|
||||||
|
|
||||||
|
StreamInfo queryPlayByStreamId(String steamId);
|
||||||
|
|
||||||
|
StreamInfo queryPlaybackByStreamId(String steamId);
|
||||||
|
|
||||||
|
StreamInfo queryPlayByDevice(String deviceId, String code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新流媒体信息
|
||||||
|
* @param mediaServerConfig
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean updateMediaInfo(MediaServerConfig mediaServerConfig);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取流媒体信息
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
MediaServerConfig getMediaInfo();
|
||||||
|
|
||||||
|
Map<String, StreamInfo> queryPlayByDeviceId(String deviceId);
|
||||||
|
|
||||||
|
boolean startPlayback(StreamInfo stream);
|
||||||
|
|
||||||
|
boolean stopPlayback(StreamInfo streamInfo);
|
||||||
|
|
||||||
|
StreamInfo queryPlaybackByDevice(String deviceId, String code);
|
||||||
|
}
|
@ -17,19 +17,6 @@ import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
|||||||
*/
|
*/
|
||||||
public interface IVideoManagerStorager {
|
public interface IVideoManagerStorager {
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新流媒体信息
|
|
||||||
* @param mediaServerConfig
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public boolean updateMediaInfo(MediaServerConfig mediaServerConfig);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取流媒体信息
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public MediaServerConfig getMediaInfo();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据设备ID判断设备是否存在
|
* 根据设备ID判断设备是否存在
|
||||||
*
|
*
|
||||||
@ -106,10 +93,9 @@ public interface IVideoManagerStorager {
|
|||||||
/**
|
/**
|
||||||
* 获取多个设备
|
* 获取多个设备
|
||||||
*
|
*
|
||||||
* @param deviceIds 设备ID数组
|
|
||||||
* @return List<Device> 设备对象数组
|
* @return List<Device> 设备对象数组
|
||||||
*/
|
*/
|
||||||
public List<Device> queryVideoDeviceList(String[] deviceIds);
|
public List<Device> queryVideoDeviceList();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除设备
|
* 删除设备
|
||||||
@ -135,27 +121,6 @@ public interface IVideoManagerStorager {
|
|||||||
*/
|
*/
|
||||||
public boolean outline(String deviceId);
|
public boolean outline(String deviceId);
|
||||||
|
|
||||||
/**
|
|
||||||
* 开始播放时将流存入
|
|
||||||
*
|
|
||||||
* @param stream 流信息
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public boolean startPlay(StreamInfo stream);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 停止播放时删除
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public boolean stopPlay(StreamInfo streamInfo);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查找视频流
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public StreamInfo queryPlay(StreamInfo streamInfo);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询子设备
|
* 查询子设备
|
||||||
@ -168,10 +133,6 @@ public interface IVideoManagerStorager {
|
|||||||
*/
|
*/
|
||||||
PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count);
|
PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count);
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新缓存
|
|
||||||
*/
|
|
||||||
public void updateCatch();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 清空通道
|
* 清空通道
|
||||||
@ -179,17 +140,4 @@ public interface IVideoManagerStorager {
|
|||||||
*/
|
*/
|
||||||
void cleanChannelsForDevice(String deviceId);
|
void cleanChannelsForDevice(String deviceId);
|
||||||
|
|
||||||
StreamInfo queryPlayByStreamId(String streamId);
|
|
||||||
|
|
||||||
StreamInfo queryPlayByDevice(String deviceId, String code);
|
|
||||||
|
|
||||||
Map<String, StreamInfo> queryPlayByDeviceId(String deviceId);
|
|
||||||
|
|
||||||
boolean startPlayback(StreamInfo streamInfo);
|
|
||||||
|
|
||||||
boolean stopPlayback(StreamInfo streamInfo);
|
|
||||||
|
|
||||||
StreamInfo queryPlaybackByDevice(String deviceId, String channelId);
|
|
||||||
|
|
||||||
StreamInfo queryPlaybackByStreamId(String streamId);
|
|
||||||
}
|
}
|
||||||
|
@ -1,36 +0,0 @@
|
|||||||
package com.genersoft.iot.vmp.storager;
|
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.conf.VManagerConfig;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Description:视频设备数据存储工厂,根据存储策略,返回对应的存储器
|
|
||||||
* @author: swwheihei
|
|
||||||
* @date: 2020年5月6日 下午2:15:16
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class VideoManagerStoragerFactory {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private VManagerConfig vmConfig;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IVideoManagerStorager jdbcStorager;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IVideoManagerStorager redisStorager;
|
|
||||||
|
|
||||||
@Bean("storager")
|
|
||||||
public IVideoManagerStorager getStorager() {
|
|
||||||
if ("redis".equals(vmConfig.getDatabase().toLowerCase())) {
|
|
||||||
return redisStorager;
|
|
||||||
} else if ("jdbc".equals(vmConfig.getDatabase().toLowerCase())) {
|
|
||||||
return jdbcStorager;
|
|
||||||
}
|
|
||||||
return redisStorager;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -8,10 +8,10 @@ import org.springframework.stereotype.Component;
|
|||||||
public class VodeoMannagerTask implements CommandLineRunner {
|
public class VodeoMannagerTask implements CommandLineRunner {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager redisStorager;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(String... strings) throws Exception {
|
public void run(String... strings) throws Exception {
|
||||||
storager.updateCatch();
|
redisStorager.updateCatch();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.genersoft.iot.vmp.storager.dao;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.common.PageResult;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface DeviceChannelMapper {
|
||||||
|
int update(DeviceChannel channel);
|
||||||
|
|
||||||
|
List<DeviceChannel> queryChannelsByDeviceId(String deviceId);
|
||||||
|
|
||||||
|
List<DeviceChannel> queryChannelsByDeviceId(String deviceId, String parentChannelId);
|
||||||
|
|
||||||
|
DeviceChannel queryChannel(String deviceId, String channelId);
|
||||||
|
|
||||||
|
int cleanChannelsByDeviceId(String deviceId);
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.genersoft.iot.vmp.storager.dao;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
||||||
|
import org.apache.ibatis.annotations.Insert;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface DeviceMapper {
|
||||||
|
|
||||||
|
@Select("SELECT * FROM device WHERE deviceId = #{deviceId}")
|
||||||
|
Device getDeviceByDeviceId(String deviceId);
|
||||||
|
|
||||||
|
@Insert("SELECT * FROM device WHERE deviceId = #{deviceId}")
|
||||||
|
int add(Device device);
|
||||||
|
|
||||||
|
int update(Device device);
|
||||||
|
|
||||||
|
List<Device> getDevices();
|
||||||
|
|
||||||
|
int del(String deviceId);
|
||||||
|
}
|
@ -0,0 +1,172 @@
|
|||||||
|
package com.genersoft.iot.vmp.storager.impl;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
|
import com.genersoft.iot.vmp.common.VideoManagerConstants;
|
||||||
|
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
||||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
|
import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
|
||||||
|
import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
|
||||||
|
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.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class RedisCatchStorageImpl implements IRedisCatchStorage {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisUtil redis;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DeviceMapper deviceMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DeviceChannelMapper deviceChannelMapper;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始播放时将流存入redis
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean startPlay(StreamInfo stream) {
|
||||||
|
return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()),
|
||||||
|
stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 停止播放时从redis删除
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean stopPlay(StreamInfo streamInfo) {
|
||||||
|
if (streamInfo == null) return false;
|
||||||
|
DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId());
|
||||||
|
if (deviceChannel != null) {
|
||||||
|
deviceChannel.setStreamId(null);
|
||||||
|
deviceChannel.setPlay(false);
|
||||||
|
deviceChannel.setDeviceId(streamInfo.getDeviceID());
|
||||||
|
deviceChannelMapper.update(deviceChannel);
|
||||||
|
}
|
||||||
|
return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
|
||||||
|
streamInfo.getStreamId(),
|
||||||
|
streamInfo.getDeviceID(),
|
||||||
|
streamInfo.getCahnnelId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询播放列表
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public StreamInfo queryPlay(StreamInfo streamInfo) {
|
||||||
|
return (StreamInfo)redis.get(String.format("%S_%s_%s_%s",
|
||||||
|
VideoManagerConstants.PLAYER_PREFIX,
|
||||||
|
streamInfo.getStreamId(),
|
||||||
|
streamInfo.getDeviceID(),
|
||||||
|
streamInfo.getCahnnelId()));
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public StreamInfo queryPlayByStreamId(String steamId) {
|
||||||
|
List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, steamId));
|
||||||
|
if (playLeys == null || playLeys.size() == 0) return null;
|
||||||
|
return (StreamInfo)redis.get(playLeys.get(0).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StreamInfo queryPlaybackByStreamId(String steamId) {
|
||||||
|
List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, steamId));
|
||||||
|
if (playLeys == null || playLeys.size() == 0) return null;
|
||||||
|
return (StreamInfo)redis.get(playLeys.get(0).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StreamInfo queryPlayByDevice(String deviceId, String code) {
|
||||||
|
// List<Object> playLeys = redis.keys(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
|
||||||
|
List<Object> playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
|
||||||
|
deviceId,
|
||||||
|
code));
|
||||||
|
if (playLeys == null || playLeys.size() == 0) return null;
|
||||||
|
return (StreamInfo)redis.get(playLeys.get(0).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新流媒体信息
|
||||||
|
* @param mediaServerConfig
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) {
|
||||||
|
return redis.set(VideoManagerConstants.MEDIA_SERVER_PREFIX,mediaServerConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取流媒体信息
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public MediaServerConfig getMediaInfo() {
|
||||||
|
return (MediaServerConfig)redis.get(VideoManagerConstants.MEDIA_SERVER_PREFIX);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, StreamInfo> queryPlayByDeviceId(String deviceId) {
|
||||||
|
Map<String, StreamInfo> streamInfos = new HashMap<>();
|
||||||
|
// List<Object> playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
|
||||||
|
List<Object> players = redis.scan(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
|
||||||
|
if (players.size() == 0) return streamInfos;
|
||||||
|
for (int i = 0; i < players.size(); i++) {
|
||||||
|
String key = (String) players.get(i);
|
||||||
|
StreamInfo streamInfo = (StreamInfo)redis.get(key);
|
||||||
|
streamInfos.put(streamInfo.getDeviceID() + "_" + streamInfo.getCahnnelId(), streamInfo);
|
||||||
|
}
|
||||||
|
return streamInfos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean startPlayback(StreamInfo stream) {
|
||||||
|
return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()),
|
||||||
|
stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stopPlayback(StreamInfo streamInfo) {
|
||||||
|
if (streamInfo == null) return false;
|
||||||
|
DeviceChannel deviceChannel = deviceChannelMapper.queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId());
|
||||||
|
if (deviceChannel != null) {
|
||||||
|
deviceChannel.setStreamId(null);
|
||||||
|
deviceChannel.setPlay(false);
|
||||||
|
deviceChannel.setDeviceId(streamInfo.getDeviceID());
|
||||||
|
deviceChannelMapper.update(deviceChannel);
|
||||||
|
}
|
||||||
|
return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
|
||||||
|
streamInfo.getStreamId(),
|
||||||
|
streamInfo.getDeviceID(),
|
||||||
|
streamInfo.getCahnnelId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StreamInfo queryPlaybackByDevice(String deviceId, String code) {
|
||||||
|
String format = String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
|
||||||
|
deviceId,
|
||||||
|
code);
|
||||||
|
List<Object> playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
|
||||||
|
deviceId,
|
||||||
|
code));
|
||||||
|
if (playLeys == null || playLeys.size() == 0) {
|
||||||
|
playLeys = redis.scan(String.format("%S_*_*_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
|
||||||
|
deviceId));
|
||||||
|
}
|
||||||
|
if (playLeys == null || playLeys.size() == 0) return null;
|
||||||
|
return (StreamInfo)redis.get(playLeys.get(0).toString());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,401 @@
|
|||||||
|
package com.genersoft.iot.vmp.storager.impl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.common.PageResult;
|
||||||
|
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
|
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
||||||
|
import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
|
||||||
|
import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.common.VideoManagerConstants;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
||||||
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||||
|
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description:视频设备数据存储-jdbc实现
|
||||||
|
* @author: swwheihei
|
||||||
|
* @date: 2020年5月6日 下午2:31:42
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class VideoManagerStoragerImpl implements IVideoManagerStorager {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DeviceMapper deviceMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DeviceChannelMapper deviceChannelMapper;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据设备ID判断设备是否存在
|
||||||
|
*
|
||||||
|
* @param deviceId 设备ID
|
||||||
|
* @return true:存在 false:不存在
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean exists(String deviceId) {
|
||||||
|
return deviceMapper.getDeviceByDeviceId(deviceId) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 视频设备创建
|
||||||
|
*
|
||||||
|
* @param device 设备对象
|
||||||
|
* @return true:创建成功 false:创建失败
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean create(Device device) {
|
||||||
|
return deviceMapper.add(device) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 视频设备更新
|
||||||
|
*
|
||||||
|
* @param device 设备对象
|
||||||
|
* @return true:更新成功 false:更新失败
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean updateDevice(Device device) {
|
||||||
|
// if (deviceMap.get(device.getDeviceId()) == null) {
|
||||||
|
// deviceMap.put(device.getDeviceId(), new HashMap<String, HashSet<String>>());
|
||||||
|
// }
|
||||||
|
// 更新device中的通道数量
|
||||||
|
// device.setChannelCount(deviceMap.get(device.getDeviceId()).size());
|
||||||
|
int result = deviceMapper.update(device);
|
||||||
|
// 存储device
|
||||||
|
return result > 0;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateChannel(String deviceId, DeviceChannel channel) {
|
||||||
|
String channelId = channel.getChannelId();
|
||||||
|
channel.setDeviceId(deviceId);
|
||||||
|
deviceChannelMapper.update(channel);
|
||||||
|
|
||||||
|
// HashMap<String, HashSet<String>> channelMap = deviceMap.get(deviceId);
|
||||||
|
// if (channelMap == null) return;
|
||||||
|
// // 作为父设备, 确定自己的子节点数
|
||||||
|
// if (channelMap.get(channelId) == null) {
|
||||||
|
// channelMap.put(channelId, new HashSet<String>());
|
||||||
|
// }else if (channelMap.get(channelId).size() > 0) {
|
||||||
|
// channel.setSubCount(channelMap.get(channelId).size());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // 存储通道
|
||||||
|
// redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
||||||
|
// "_" + channel.getChannelId() +
|
||||||
|
// "_" + (channel.getStatus() == 1 ? "on":"off") +
|
||||||
|
// "_" + (channelMap.get(channelId).size() > 0)+
|
||||||
|
// "_" + (StringUtils.isEmpty(channel.getParentId())?null:channel.getParentId()),
|
||||||
|
// channel);
|
||||||
|
// // 更新device中的通道数量
|
||||||
|
// Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
|
||||||
|
// device.setChannelCount(deviceMap.get(deviceId).size());
|
||||||
|
// redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// // 如果有父设备,更新父设备内子节点数
|
||||||
|
// String parentId = channel.getParentId();
|
||||||
|
// if (!StringUtils.isEmpty(parentId) && !parentId.equals(deviceId)) {
|
||||||
|
//
|
||||||
|
// if (channelMap.get(parentId) == null) {
|
||||||
|
// channelMap.put(parentId, new HashSet<String>());
|
||||||
|
// }
|
||||||
|
// channelMap.get(parentId).add(channelId);
|
||||||
|
//
|
||||||
|
// DeviceChannel deviceChannel = queryChannel(deviceId, parentId);
|
||||||
|
// if (deviceChannel != null) {
|
||||||
|
// deviceChannel.setSubCount(channelMap.get(parentId).size());
|
||||||
|
// redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
||||||
|
// "_" + deviceChannel.getChannelId() +
|
||||||
|
// "_" + (deviceChannel.getStatus() == 1 ? "on":"off") +
|
||||||
|
// "_" + (channelMap.get(deviceChannel.getChannelId()).size() > 0)+
|
||||||
|
// "_" + (StringUtils.isEmpty(deviceChannel.getParentId())?null:deviceChannel.getParentId()),
|
||||||
|
// deviceChannel);
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取设备
|
||||||
|
*
|
||||||
|
* @param deviceId 设备ID
|
||||||
|
* @return Device 设备对象
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Device queryVideoDevice(String deviceId) {
|
||||||
|
return deviceMapper.getDeviceByDeviceId(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) {
|
||||||
|
// 获取到所有正在播放的流
|
||||||
|
List<DeviceChannel> result = new ArrayList<>();
|
||||||
|
PageResult pageResult = new PageResult<DeviceChannel>();
|
||||||
|
|
||||||
|
deviceChannelMapper.queryChannelsByDeviceId(deviceId);
|
||||||
|
// String queryContent = "*";
|
||||||
|
// if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
|
||||||
|
// String queryHasSubChannel = "*";
|
||||||
|
// if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
|
||||||
|
// String queryOnline = "*";
|
||||||
|
// if (!StringUtils.isEmpty(online)) queryOnline = online;
|
||||||
|
// String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
||||||
|
// "_" + queryContent + // 搜索编号和名称
|
||||||
|
// "_" + queryOnline + // 搜索是否在线
|
||||||
|
// "_" + queryHasSubChannel + // 搜索是否含有子节点
|
||||||
|
// "_" + "*";
|
||||||
|
// List<Object> deviceChannelList = redis.scan(queryStr);
|
||||||
|
// //对查询结果排序,避免出现通道排列顺序乱序的情况
|
||||||
|
// Collections.sort(deviceChannelList,new Comparator<Object>(){
|
||||||
|
// @Override
|
||||||
|
// public int compare(Object o1, Object o2) {
|
||||||
|
// return o1.toString().compareToIgnoreCase(o2.toString());
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// pageResult.setPage(page);
|
||||||
|
// pageResult.setCount(count);
|
||||||
|
// pageResult.setTotal(deviceChannelList.size());
|
||||||
|
// int maxCount = (page + 1 ) * count;
|
||||||
|
// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
||||||
|
// for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
|
||||||
|
// DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
|
||||||
|
// StreamInfo streamInfo = stringStreamInfoMap.get(deviceId + "_" + deviceChannel.getChannelId());
|
||||||
|
// deviceChannel.setPlay(streamInfo != null);
|
||||||
|
// if (streamInfo != null) deviceChannel.setStreamId(streamInfo.getStreamId());
|
||||||
|
// result.add(deviceChannel);
|
||||||
|
// }
|
||||||
|
// pageResult.setData(result);
|
||||||
|
// }
|
||||||
|
|
||||||
|
return pageResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
|
||||||
|
// List<DeviceChannel> result = new ArrayList<>();
|
||||||
|
//// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
||||||
|
// List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
||||||
|
//
|
||||||
|
// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
||||||
|
// for (int i = 0; i < deviceChannelList.size(); i++) {
|
||||||
|
// result.add((DeviceChannel)redis.get((String) deviceChannelList.get(i)));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
return deviceChannelMapper.queryChannelsByDeviceId(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) {
|
||||||
|
|
||||||
|
deviceChannelMapper.queryChannelsByDeviceId(deviceId, parentChannelId);
|
||||||
|
|
||||||
|
// List<DeviceChannel> allDeviceChannels = new ArrayList<>();
|
||||||
|
// String queryContent = "*";
|
||||||
|
// if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
|
||||||
|
// String queryHasSubChannel = "*";
|
||||||
|
// if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
|
||||||
|
// String queryOnline = "*";
|
||||||
|
// if (!StringUtils.isEmpty(online)) queryOnline = online;
|
||||||
|
// String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
||||||
|
// "_" + queryContent + // 搜索编号和名称
|
||||||
|
// "_" + queryOnline + // 搜索是否在线
|
||||||
|
// "_" + queryHasSubChannel + // 搜索是否含有子节点
|
||||||
|
// "_" + parentChannelId;
|
||||||
|
//
|
||||||
|
//// List<Object> deviceChannelList = redis.keys(queryStr);
|
||||||
|
// List<Object> deviceChannelList = redis.scan(queryStr);
|
||||||
|
//
|
||||||
|
// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
||||||
|
// for (int i = 0; i < deviceChannelList.size(); i++) {
|
||||||
|
// DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
|
||||||
|
// if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
|
||||||
|
// allDeviceChannels.add(deviceChannel);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// int maxCount = (page + 1 ) * count;
|
||||||
|
PageResult pageResult = new PageResult<DeviceChannel>();
|
||||||
|
// pageResult.setPage(page);
|
||||||
|
// pageResult.setCount(count);
|
||||||
|
// pageResult.setTotal(allDeviceChannels.size());
|
||||||
|
//
|
||||||
|
// if (allDeviceChannels.size() > 0) {
|
||||||
|
// pageResult.setData(allDeviceChannels.subList(
|
||||||
|
// page * count, pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal()
|
||||||
|
// ));
|
||||||
|
// }
|
||||||
|
return pageResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DeviceChannel> querySubChannels(String deviceId, String parentChannelId) {
|
||||||
|
List<DeviceChannel> allDeviceChannels = new ArrayList<>();
|
||||||
|
// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
||||||
|
// List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
||||||
|
//
|
||||||
|
// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
||||||
|
// for (int i = 0; i < deviceChannelList.size(); i++) {
|
||||||
|
// DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
|
||||||
|
// if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
|
||||||
|
// allDeviceChannels.add(deviceChannel);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
return allDeviceChannels;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DeviceChannel queryChannel(String deviceId, String channelId) {
|
||||||
|
DeviceChannel deviceChannel = null;
|
||||||
|
return deviceChannelMapper.queryChannel(deviceId, channelId);
|
||||||
|
//// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
||||||
|
// List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
||||||
|
// "_" + channelId + "*");
|
||||||
|
// if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
||||||
|
// deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(0));
|
||||||
|
// }
|
||||||
|
// return deviceChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取多个设备
|
||||||
|
*
|
||||||
|
* @param deviceIds 设备ID数组
|
||||||
|
* @return List<Device> 设备对象数组
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
|
||||||
|
List<Device> devices = new ArrayList<>();
|
||||||
|
PageResult pageResult = new PageResult<Device>();
|
||||||
|
// pageResult.setPage(page);
|
||||||
|
// pageResult.setCount(count);
|
||||||
|
// Device device = null;
|
||||||
|
//
|
||||||
|
// if (deviceIds == null || deviceIds.length == 0) {
|
||||||
|
//
|
||||||
|
//// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
|
||||||
|
// List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
|
||||||
|
// pageResult.setTotal(deviceIdList.size());
|
||||||
|
// int maxCount = (page + 1)* count;
|
||||||
|
// for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
|
||||||
|
// // devices.add((Device)redis.get((String)deviceIdList.get(i)));
|
||||||
|
// device =(Device)redis.get((String)deviceIdList.get(i));
|
||||||
|
// if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
|
||||||
|
// // outline(device.getDeviceId());
|
||||||
|
// }
|
||||||
|
// devices.add(device);
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// for (int i = 0; i < deviceIds.length; i++) {
|
||||||
|
// // devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]));
|
||||||
|
// device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]);
|
||||||
|
// if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
|
||||||
|
// // outline(device.getDeviceId());
|
||||||
|
// }
|
||||||
|
// devices.add(device);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// pageResult.setData(devices);
|
||||||
|
return pageResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取多个设备
|
||||||
|
*
|
||||||
|
* @return List<Device> 设备对象数组
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<Device> queryVideoDeviceList() {
|
||||||
|
|
||||||
|
// if (deviceIds == null || deviceIds.length == 0) {
|
||||||
|
//// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
|
||||||
|
// List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
|
||||||
|
// for (int i = 0; i < deviceIdList.size(); i++) {
|
||||||
|
// device =(Device)redis.get((String)deviceIdList.get(i));
|
||||||
|
// if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
|
||||||
|
// outline(device.getDeviceId());
|
||||||
|
// }
|
||||||
|
// devices.add(device);
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// for (int i = 0; i < deviceIds.length; i++) {
|
||||||
|
// device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]);
|
||||||
|
// if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
|
||||||
|
// outline(device.getDeviceId());
|
||||||
|
// }
|
||||||
|
// devices.add(device);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
List<Device> deviceList = deviceMapper.getDevices();
|
||||||
|
return deviceList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除设备
|
||||||
|
*
|
||||||
|
* @param deviceId 设备ID
|
||||||
|
* @return true:删除成功 false:删除失败
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean delete(String deviceId) {
|
||||||
|
int result = deviceMapper.del(deviceId);
|
||||||
|
|
||||||
|
return result > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新设备在线
|
||||||
|
*
|
||||||
|
* @param deviceId 设备ID
|
||||||
|
* @return true:更新成功 false:更新失败
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean online(String deviceId) {
|
||||||
|
Device device = deviceMapper.getDeviceByDeviceId(deviceId);
|
||||||
|
device.setOnline(1);
|
||||||
|
return deviceMapper.update(device) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新设备离线
|
||||||
|
*
|
||||||
|
* @param deviceId 设备ID
|
||||||
|
* @return true:更新成功 false:更新失败
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean outline(String deviceId) {
|
||||||
|
// Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
|
||||||
|
// if (device == null) return false;
|
||||||
|
// device.setOnline(0);
|
||||||
|
// return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
|
||||||
|
|
||||||
|
Device device = deviceMapper.getDeviceByDeviceId(deviceId);
|
||||||
|
device.setOnline(0);
|
||||||
|
return deviceMapper.update(device) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cleanChannelsForDevice(String deviceId) {
|
||||||
|
int result = deviceChannelMapper.cleanChannelsByDeviceId(deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,217 +0,0 @@
|
|||||||
package com.genersoft.iot.vmp.storager.jdbc;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.common.PageResult;
|
|
||||||
import com.genersoft.iot.vmp.common.StreamInfo;
|
|
||||||
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.common.VideoManagerConstants;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Description:视频设备数据存储-jdbc实现
|
|
||||||
* @author: swwheihei
|
|
||||||
* @date: 2020年5月6日 下午2:28:12
|
|
||||||
*/
|
|
||||||
@Component("jdbcStorager")
|
|
||||||
public class VideoManagerJdbcStoragerImpl implements IVideoManagerStorager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MediaServerConfig getMediaInfo() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据设备ID判断设备是否存在
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return true:存在 false:不存在
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean exists(String deviceId) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频设备创建
|
|
||||||
*
|
|
||||||
* @param device 设备对象
|
|
||||||
* @return true:创建成功 false:创建失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean create(Device device) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean updateDevice(Device device) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateChannel(String deviceId, DeviceChannel channel) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取设备
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return Device 设备对象
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Device queryVideoDevice(String deviceId) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DeviceChannel queryChannel(String deviceId, String channelId) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取多个设备
|
|
||||||
*
|
|
||||||
* @param deviceIds 设备ID数组
|
|
||||||
* @return List<Device> 设备对象数组
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<Device> queryVideoDeviceList(String[] deviceIds) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除设备
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return true:删除成功 false:删除失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean delete(String deviceId) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新设备在线
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return true:更新成功 false:更新失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean online(String deviceId) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新设备离线
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return true:更新成功 false:更新失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean outline(String deviceId) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean stopPlay(StreamInfo streamInfo) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlay(StreamInfo streamInfo) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateCatch() {
|
|
||||||
System.out.println("##################");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void cleanChannelsForDevice(String deviceId) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean startPlay(StreamInfo stream) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlayByDevice(String deviceId, String code) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<String, StreamInfo> queryPlayByDeviceId(String deviceId) {
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean startPlayback(StreamInfo streamInfo) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean stopPlayback(StreamInfo streamInfo) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlaybackByDevice(String deviceId, String channelId) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlayByStreamId(String streamId) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlaybackByStreamId(String streamId) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,561 +0,0 @@
|
|||||||
package com.genersoft.iot.vmp.storager.redis;
|
|
||||||
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import com.genersoft.iot.vmp.common.PageResult;
|
|
||||||
import com.genersoft.iot.vmp.common.StreamInfo;
|
|
||||||
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.common.VideoManagerConstants;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
|
||||||
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
|
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Description:视频设备数据存储-redis实现
|
|
||||||
* @author: swwheihei
|
|
||||||
* @date: 2020年5月6日 下午2:31:42
|
|
||||||
*/
|
|
||||||
@Component("redisStorager")
|
|
||||||
public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RedisUtil redis;
|
|
||||||
|
|
||||||
private HashMap<String, HashMap<String, HashSet<String>>> deviceMap = new HashMap<>();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据设备ID判断设备是否存在
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return true:存在 false:不存在
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean exists(String deviceId) {
|
|
||||||
return redis.hasKey(VideoManagerConstants.DEVICE_PREFIX+deviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频设备创建
|
|
||||||
*
|
|
||||||
* @param device 设备对象
|
|
||||||
* @return true:创建成功 false:创建失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean create(Device device) {
|
|
||||||
return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 视频设备更新
|
|
||||||
*
|
|
||||||
* @param device 设备对象
|
|
||||||
* @return true:更新成功 false:更新失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean updateDevice(Device device) {
|
|
||||||
if (deviceMap.get(device.getDeviceId()) == null) {
|
|
||||||
deviceMap.put(device.getDeviceId(), new HashMap<String, HashSet<String>>());
|
|
||||||
}
|
|
||||||
// 更新device中的通道数量
|
|
||||||
device.setChannelCount(deviceMap.get(device.getDeviceId()).size());
|
|
||||||
// 存储device
|
|
||||||
return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateChannel(String deviceId, DeviceChannel channel) {
|
|
||||||
String channelId = channel.getChannelId();
|
|
||||||
HashMap<String, HashSet<String>> channelMap = deviceMap.get(deviceId);
|
|
||||||
if (channelMap == null) return;
|
|
||||||
// 作为父设备, 确定自己的子节点数
|
|
||||||
if (channelMap.get(channelId) == null) {
|
|
||||||
channelMap.put(channelId, new HashSet<String>());
|
|
||||||
}else if (channelMap.get(channelId).size() > 0) {
|
|
||||||
channel.setSubCount(channelMap.get(channelId).size());
|
|
||||||
}
|
|
||||||
|
|
||||||
// 存储通道
|
|
||||||
redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
|
||||||
"_" + channel.getChannelId() +
|
|
||||||
"_" + (channel.getStatus() == 1 ? "on":"off") +
|
|
||||||
"_" + (channelMap.get(channelId).size() > 0)+
|
|
||||||
"_" + (StringUtils.isEmpty(channel.getParentId())?null:channel.getParentId()),
|
|
||||||
channel);
|
|
||||||
// 更新device中的通道数量
|
|
||||||
Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
|
|
||||||
device.setChannelCount(deviceMap.get(deviceId).size());
|
|
||||||
redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
|
|
||||||
|
|
||||||
|
|
||||||
// 如果有父设备,更新父设备内子节点数
|
|
||||||
String parentId = channel.getParentId();
|
|
||||||
if (!StringUtils.isEmpty(parentId) && !parentId.equals(deviceId)) {
|
|
||||||
|
|
||||||
if (channelMap.get(parentId) == null) {
|
|
||||||
channelMap.put(parentId, new HashSet<String>());
|
|
||||||
}
|
|
||||||
channelMap.get(parentId).add(channelId);
|
|
||||||
|
|
||||||
DeviceChannel deviceChannel = queryChannel(deviceId, parentId);
|
|
||||||
if (deviceChannel != null) {
|
|
||||||
deviceChannel.setSubCount(channelMap.get(parentId).size());
|
|
||||||
redis.set(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
|
||||||
"_" + deviceChannel.getChannelId() +
|
|
||||||
"_" + (deviceChannel.getStatus() == 1 ? "on":"off") +
|
|
||||||
"_" + (channelMap.get(deviceChannel.getChannelId()).size() > 0)+
|
|
||||||
"_" + (StringUtils.isEmpty(deviceChannel.getParentId())?null:deviceChannel.getParentId()),
|
|
||||||
deviceChannel);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取设备
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return Device 设备对象
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Device queryVideoDevice(String deviceId) {
|
|
||||||
return (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult queryChannelsByDeviceId(String deviceId, String query, Boolean hasSubChannel, String online, int page, int count) {
|
|
||||||
// 获取到所有正在播放的流
|
|
||||||
Map<String, StreamInfo> stringStreamInfoMap = queryPlayByDeviceId(deviceId);
|
|
||||||
List<DeviceChannel> result = new ArrayList<>();
|
|
||||||
PageResult pageResult = new PageResult<DeviceChannel>();
|
|
||||||
String queryContent = "*";
|
|
||||||
if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
|
|
||||||
String queryHasSubChannel = "*";
|
|
||||||
if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
|
|
||||||
String queryOnline = "*";
|
|
||||||
if (!StringUtils.isEmpty(online)) queryOnline = online;
|
|
||||||
String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
|
||||||
"_" + queryContent + // 搜索编号和名称
|
|
||||||
"_" + queryOnline + // 搜索是否在线
|
|
||||||
"_" + queryHasSubChannel + // 搜索是否含有子节点
|
|
||||||
"_" + "*";
|
|
||||||
List<Object> deviceChannelList = redis.scan(queryStr);
|
|
||||||
//对查询结果排序,避免出现通道排列顺序乱序的情况
|
|
||||||
Collections.sort(deviceChannelList,new Comparator<Object>(){
|
|
||||||
@Override
|
|
||||||
public int compare(Object o1, Object o2) {
|
|
||||||
return o1.toString().compareToIgnoreCase(o2.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
pageResult.setPage(page);
|
|
||||||
pageResult.setCount(count);
|
|
||||||
pageResult.setTotal(deviceChannelList.size());
|
|
||||||
int maxCount = (page + 1 ) * count;
|
|
||||||
if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
|
||||||
for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
|
|
||||||
DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
|
|
||||||
StreamInfo streamInfo = stringStreamInfoMap.get(deviceId + "_" + deviceChannel.getChannelId());
|
|
||||||
deviceChannel.setPlay(streamInfo != null);
|
|
||||||
if (streamInfo != null) deviceChannel.setStreamId(streamInfo.getStreamId());
|
|
||||||
result.add(deviceChannel);
|
|
||||||
}
|
|
||||||
pageResult.setData(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pageResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) {
|
|
||||||
List<DeviceChannel> result = new ArrayList<>();
|
|
||||||
// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
|
||||||
List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
|
||||||
|
|
||||||
if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
|
||||||
for (int i = 0; i < deviceChannelList.size(); i++) {
|
|
||||||
result.add((DeviceChannel)redis.get((String) deviceChannelList.get(i)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PageResult querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) {
|
|
||||||
List<DeviceChannel> allDeviceChannels = new ArrayList<>();
|
|
||||||
String queryContent = "*";
|
|
||||||
if (!StringUtils.isEmpty(query)) queryContent = String.format("*%S*",query);
|
|
||||||
String queryHasSubChannel = "*";
|
|
||||||
if (hasSubChannel != null) queryHasSubChannel = hasSubChannel?"true":"false";
|
|
||||||
String queryOnline = "*";
|
|
||||||
if (!StringUtils.isEmpty(online)) queryOnline = online;
|
|
||||||
String queryStr = VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
|
||||||
"_" + queryContent + // 搜索编号和名称
|
|
||||||
"_" + queryOnline + // 搜索是否在线
|
|
||||||
"_" + queryHasSubChannel + // 搜索是否含有子节点
|
|
||||||
"_" + parentChannelId;
|
|
||||||
|
|
||||||
// List<Object> deviceChannelList = redis.keys(queryStr);
|
|
||||||
List<Object> deviceChannelList = redis.scan(queryStr);
|
|
||||||
|
|
||||||
if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
|
||||||
for (int i = 0; i < deviceChannelList.size(); i++) {
|
|
||||||
DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
|
|
||||||
if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
|
|
||||||
allDeviceChannels.add(deviceChannel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int maxCount = (page + 1 ) * count;
|
|
||||||
PageResult pageResult = new PageResult<DeviceChannel>();
|
|
||||||
pageResult.setPage(page);
|
|
||||||
pageResult.setCount(count);
|
|
||||||
pageResult.setTotal(allDeviceChannels.size());
|
|
||||||
|
|
||||||
if (allDeviceChannels.size() > 0) {
|
|
||||||
pageResult.setData(allDeviceChannels.subList(
|
|
||||||
page * count, pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal()
|
|
||||||
));
|
|
||||||
}
|
|
||||||
return pageResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<DeviceChannel> querySubChannels(String deviceId, String parentChannelId) {
|
|
||||||
List<DeviceChannel> allDeviceChannels = new ArrayList<>();
|
|
||||||
// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
|
||||||
List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
|
||||||
|
|
||||||
if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
|
||||||
for (int i = 0; i < deviceChannelList.size(); i++) {
|
|
||||||
DeviceChannel deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(i));
|
|
||||||
if (deviceChannel.getParentId() != null && deviceChannel.getParentId().equals(parentChannelId)) {
|
|
||||||
allDeviceChannels.add(deviceChannel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return allDeviceChannels;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DeviceChannel queryChannel(String deviceId, String channelId) {
|
|
||||||
DeviceChannel deviceChannel = null;
|
|
||||||
// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
|
||||||
List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId +
|
|
||||||
"_" + channelId + "*");
|
|
||||||
if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
|
||||||
deviceChannel = (DeviceChannel)redis.get((String)deviceChannelList.get(0));
|
|
||||||
}
|
|
||||||
return deviceChannel;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取多个设备
|
|
||||||
*
|
|
||||||
* @param deviceIds 设备ID数组
|
|
||||||
* @return List<Device> 设备对象数组
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public PageResult<Device> queryVideoDeviceList(String[] deviceIds, int page, int count) {
|
|
||||||
List<Device> devices = new ArrayList<>();
|
|
||||||
PageResult pageResult = new PageResult<Device>();
|
|
||||||
pageResult.setPage(page);
|
|
||||||
pageResult.setCount(count);
|
|
||||||
Device device = null;
|
|
||||||
|
|
||||||
if (deviceIds == null || deviceIds.length == 0) {
|
|
||||||
|
|
||||||
// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
|
|
||||||
List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
|
|
||||||
pageResult.setTotal(deviceIdList.size());
|
|
||||||
int maxCount = (page + 1)* count;
|
|
||||||
for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) {
|
|
||||||
// devices.add((Device)redis.get((String)deviceIdList.get(i)));
|
|
||||||
device =(Device)redis.get((String)deviceIdList.get(i));
|
|
||||||
if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
|
|
||||||
// outline(device.getDeviceId());
|
|
||||||
}
|
|
||||||
devices.add(device);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < deviceIds.length; i++) {
|
|
||||||
// devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]));
|
|
||||||
device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]);
|
|
||||||
if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
|
|
||||||
// outline(device.getDeviceId());
|
|
||||||
}
|
|
||||||
devices.add(device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pageResult.setData(devices);
|
|
||||||
return pageResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取多个设备
|
|
||||||
*
|
|
||||||
* @param deviceIds 设备ID数组
|
|
||||||
* @return List<Device> 设备对象数组
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public List<Device> queryVideoDeviceList(String[] deviceIds) {
|
|
||||||
List<Device> devices = new ArrayList<>();
|
|
||||||
Device device = null;
|
|
||||||
|
|
||||||
if (deviceIds == null || deviceIds.length == 0) {
|
|
||||||
// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
|
|
||||||
List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
|
|
||||||
for (int i = 0; i < deviceIdList.size(); i++) {
|
|
||||||
device =(Device)redis.get((String)deviceIdList.get(i));
|
|
||||||
if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
|
|
||||||
outline(device.getDeviceId());
|
|
||||||
}
|
|
||||||
devices.add(device);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < deviceIds.length; i++) {
|
|
||||||
device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]);
|
|
||||||
if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){
|
|
||||||
outline(device.getDeviceId());
|
|
||||||
}
|
|
||||||
devices.add(device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return devices;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除设备
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return true:删除成功 false:删除失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean delete(String deviceId) {
|
|
||||||
return redis.del(VideoManagerConstants.DEVICE_PREFIX+deviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新设备在线
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return true:更新成功 false:更新失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean online(String deviceId) {
|
|
||||||
Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
|
|
||||||
device.setOnline(1);
|
|
||||||
return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新设备离线
|
|
||||||
*
|
|
||||||
* @param deviceId 设备ID
|
|
||||||
* @return true:更新成功 false:更新失败
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean outline(String deviceId) {
|
|
||||||
Device device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceId);
|
|
||||||
if (device == null) return false;
|
|
||||||
device.setOnline(0);
|
|
||||||
return redis.set(VideoManagerConstants.DEVICE_PREFIX+device.getDeviceId(), device);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 开始播放时将流存入redis
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean startPlay(StreamInfo stream) {
|
|
||||||
return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()),
|
|
||||||
stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 停止播放时从redis删除
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean stopPlay(StreamInfo streamInfo) {
|
|
||||||
if (streamInfo == null) return false;
|
|
||||||
DeviceChannel deviceChannel = queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId());
|
|
||||||
if (deviceChannel != null) {
|
|
||||||
deviceChannel.setStreamId(null);
|
|
||||||
deviceChannel.setPlay(false);
|
|
||||||
updateChannel(streamInfo.getDeviceID(), deviceChannel);
|
|
||||||
}
|
|
||||||
return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
|
|
||||||
streamInfo.getStreamId(),
|
|
||||||
streamInfo.getDeviceID(),
|
|
||||||
streamInfo.getCahnnelId()));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询播放列表
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlay(StreamInfo streamInfo) {
|
|
||||||
return (StreamInfo)redis.get(String.format("%S_%s_%s_%s",
|
|
||||||
VideoManagerConstants.PLAYER_PREFIX,
|
|
||||||
streamInfo.getStreamId(),
|
|
||||||
streamInfo.getDeviceID(),
|
|
||||||
streamInfo.getCahnnelId()));
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlayByStreamId(String steamId) {
|
|
||||||
List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAYER_PREFIX, steamId));
|
|
||||||
if (playLeys == null || playLeys.size() == 0) return null;
|
|
||||||
return (StreamInfo)redis.get(playLeys.get(0).toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlaybackByStreamId(String steamId) {
|
|
||||||
List<Object> playLeys = redis.scan(String.format("%S_%s_*", VideoManagerConstants.PLAY_BLACK_PREFIX, steamId));
|
|
||||||
if (playLeys == null || playLeys.size() == 0) return null;
|
|
||||||
return (StreamInfo)redis.get(playLeys.get(0).toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlayByDevice(String deviceId, String code) {
|
|
||||||
// List<Object> playLeys = redis.keys(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
|
|
||||||
List<Object> playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAYER_PREFIX,
|
|
||||||
deviceId,
|
|
||||||
code));
|
|
||||||
if (playLeys == null || playLeys.size() == 0) return null;
|
|
||||||
return (StreamInfo)redis.get(playLeys.get(0).toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新流媒体信息
|
|
||||||
* @param mediaServerConfig
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean updateMediaInfo(MediaServerConfig mediaServerConfig) {
|
|
||||||
return redis.set(VideoManagerConstants.MEDIA_SERVER_PREFIX,mediaServerConfig);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取流媒体信息
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public MediaServerConfig getMediaInfo() {
|
|
||||||
return (MediaServerConfig)redis.get(VideoManagerConstants.MEDIA_SERVER_PREFIX);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateCatch() {
|
|
||||||
deviceMap = new HashMap<>();
|
|
||||||
// 更新设备
|
|
||||||
List<Device> devices = queryVideoDeviceList(null);
|
|
||||||
if (devices == null && devices.size() == 0) return;
|
|
||||||
for (Device device : devices) {
|
|
||||||
// 更新设备下的通道
|
|
||||||
HashMap<String, HashSet<String>> channelMap = new HashMap<String, HashSet<String>>();
|
|
||||||
List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX +
|
|
||||||
device.getDeviceId() + "_" + "*");
|
|
||||||
if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
|
||||||
for (int i = 0; i < deviceChannelList.size(); i++) {
|
|
||||||
String key = (String)deviceChannelList.get(i);
|
|
||||||
String[] s = key.split("_");
|
|
||||||
String channelId = s[3];
|
|
||||||
HashSet<String> subChannel = channelMap.get(channelId);
|
|
||||||
if (subChannel == null) {
|
|
||||||
subChannel = new HashSet<>();
|
|
||||||
}
|
|
||||||
System.out.println(key);
|
|
||||||
if (s.length == 6 && !"null".equals(s[5])) {
|
|
||||||
subChannel.add(s[5]);
|
|
||||||
}
|
|
||||||
channelMap.put(channelId, subChannel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
deviceMap.put(device.getDeviceId(),channelMap);
|
|
||||||
}
|
|
||||||
System.out.println();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void cleanChannelsForDevice(String deviceId) {
|
|
||||||
List<DeviceChannel> result = new ArrayList<>();
|
|
||||||
// List<Object> deviceChannelList = redis.keys(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
|
||||||
List<Object> deviceChannelList = redis.scan(VideoManagerConstants.CACHEKEY_PREFIX + deviceId + "_" + "*");
|
|
||||||
if (deviceChannelList != null && deviceChannelList.size() > 0 ) {
|
|
||||||
for (int i = 0; i < deviceChannelList.size(); i++) {
|
|
||||||
redis.del((String)deviceChannelList.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<String, StreamInfo> queryPlayByDeviceId(String deviceId) {
|
|
||||||
Map<String, StreamInfo> streamInfos = new HashMap<>();
|
|
||||||
// List<Object> playLeys = redis.keys(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
|
|
||||||
List<Object> playLeys = redis.scan(String.format("%S_*_%S_*", VideoManagerConstants.PLAYER_PREFIX, deviceId));
|
|
||||||
if (playLeys.size() == 0) return streamInfos;
|
|
||||||
for (int i = 0; i < playLeys.size(); i++) {
|
|
||||||
String key = (String) playLeys.get(i);
|
|
||||||
StreamInfo streamInfo = (StreamInfo)redis.get(key);
|
|
||||||
streamInfos.put(streamInfo.getDeviceID() + "_" + streamInfo.getCahnnelId(), streamInfo);
|
|
||||||
}
|
|
||||||
return streamInfos;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean startPlayback(StreamInfo stream) {
|
|
||||||
return redis.set(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX, stream.getStreamId(),stream.getDeviceID(), stream.getCahnnelId()),
|
|
||||||
stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean stopPlayback(StreamInfo streamInfo) {
|
|
||||||
if (streamInfo == null) return false;
|
|
||||||
DeviceChannel deviceChannel = queryChannel(streamInfo.getDeviceID(), streamInfo.getCahnnelId());
|
|
||||||
if (deviceChannel != null) {
|
|
||||||
deviceChannel.setStreamId(null);
|
|
||||||
deviceChannel.setPlay(false);
|
|
||||||
updateChannel(streamInfo.getDeviceID(), deviceChannel);
|
|
||||||
}
|
|
||||||
return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
|
|
||||||
streamInfo.getStreamId(),
|
|
||||||
streamInfo.getDeviceID(),
|
|
||||||
streamInfo.getCahnnelId()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public StreamInfo queryPlaybackByDevice(String deviceId, String code) {
|
|
||||||
String format = String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
|
|
||||||
deviceId,
|
|
||||||
code);
|
|
||||||
List<Object> playLeys = redis.scan(String.format("%S_*_%s_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
|
|
||||||
deviceId,
|
|
||||||
code));
|
|
||||||
if (playLeys == null || playLeys.size() == 0) {
|
|
||||||
playLeys = redis.scan(String.format("%S_*_*_%s", VideoManagerConstants.PLAY_BLACK_PREFIX,
|
|
||||||
deviceId));
|
|
||||||
}
|
|
||||||
if (playLeys == null || playLeys.size() == 0) return null;
|
|
||||||
return (StreamInfo)redis.get(playLeys.get(0).toString());
|
|
||||||
}
|
|
||||||
}
|
|
@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
|
|||||||
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
|
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.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.vmanager.service.IPlayService;
|
import com.genersoft.iot.vmp.vmanager.service.IPlayService;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -45,6 +46,9 @@ public class PlayController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ZLMRESTfulUtils zlmresTfulUtils;
|
private ZLMRESTfulUtils zlmresTfulUtils;
|
||||||
|
|
||||||
@ -60,7 +64,7 @@ public class PlayController {
|
|||||||
|
|
||||||
|
|
||||||
Device device = storager.queryVideoDevice(deviceId);
|
Device device = storager.queryVideoDevice(deviceId);
|
||||||
StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId);
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
|
||||||
|
|
||||||
UUID uuid = UUID.randomUUID();
|
UUID uuid = UUID.randomUUID();
|
||||||
DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
|
DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
|
||||||
@ -89,7 +93,7 @@ public class PlayController {
|
|||||||
msg.setData(JSON.toJSONString(streamInfo));
|
msg.setData(JSON.toJSONString(streamInfo));
|
||||||
resultHolder.invokeResult(msg);
|
resultHolder.invokeResult(msg);
|
||||||
} else {
|
} else {
|
||||||
storager.stopPlay(streamInfo);
|
redisCatchStorage.stopPlay(streamInfo);
|
||||||
cmder.playStreamCmd(device, channelId, (JSONObject response) -> {
|
cmder.playStreamCmd(device, channelId, (JSONObject response) -> {
|
||||||
logger.info("收到订阅消息: " + response.toJSONString());
|
logger.info("收到订阅消息: " + response.toJSONString());
|
||||||
playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString());
|
playService.onPublishHandlerForPlay(response, deviceId, channelId, uuid.toString());
|
||||||
@ -117,25 +121,59 @@ public class PlayController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/play/{streamId}/stop")
|
@PostMapping("/play/{streamId}/stop")
|
||||||
public ResponseEntity<String> playStop(@PathVariable String streamId) {
|
public DeferredResult<ResponseEntity<String>> playStop(@PathVariable String streamId) {
|
||||||
|
|
||||||
|
logger.debug(String.format("设备预览/回放停止API调用,streamId:%s", streamId));
|
||||||
|
|
||||||
|
UUID uuid = UUID.randomUUID();
|
||||||
|
DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>();
|
||||||
|
|
||||||
|
// 录像查询以channelId作为deviceId查询
|
||||||
|
resultHolder.put(DeferredResultHolder.CALLBACK_CMD_STOP + uuid, result);
|
||||||
|
|
||||||
|
cmder.streamByeCmd(streamId, event -> {
|
||||||
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
|
||||||
|
if (streamInfo == null) {
|
||||||
|
RequestMessage msg = new RequestMessage();
|
||||||
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
|
||||||
|
msg.setData("streamId not found");
|
||||||
|
resultHolder.invokeResult(msg);
|
||||||
|
redisCatchStorage.stopPlay(streamInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
RequestMessage msg = new RequestMessage();
|
||||||
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_STOP + uuid);
|
||||||
|
Response response = event.getResponse();
|
||||||
|
msg.setData(String.format("success"));
|
||||||
|
resultHolder.invokeResult(msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
cmder.streamByeCmd(streamId);
|
|
||||||
StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
|
|
||||||
if (streamInfo == null)
|
|
||||||
return new ResponseEntity<String>("streamId not found", HttpStatus.OK);
|
|
||||||
storager.stopPlay(streamInfo);
|
|
||||||
if (logger.isDebugEnabled()) {
|
|
||||||
logger.debug(String.format("设备预览停止API调用,streamId:%s", streamId));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (streamId != null) {
|
if (streamId != null) {
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("streamId", streamId);
|
json.put("streamId", streamId);
|
||||||
return new ResponseEntity<String>(json.toString(), HttpStatus.OK);
|
RequestMessage msg = new RequestMessage();
|
||||||
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
|
||||||
|
msg.setData(json.toString());
|
||||||
|
resultHolder.invokeResult(msg);
|
||||||
} else {
|
} else {
|
||||||
logger.warn("设备预览停止API调用失败!");
|
logger.warn("设备预览/回放停止API调用失败!");
|
||||||
return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
|
RequestMessage msg = new RequestMessage();
|
||||||
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
|
||||||
|
msg.setData("streamId null");
|
||||||
|
resultHolder.invokeResult(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 超时处理
|
||||||
|
result.onTimeout(()->{
|
||||||
|
logger.warn(String.format("设备预览/回放停止超时,streamId:%s ", streamId));
|
||||||
|
RequestMessage msg = new RequestMessage();
|
||||||
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_STOP + uuid);
|
||||||
|
msg.setData("Timeout");
|
||||||
|
resultHolder.invokeResult(msg);
|
||||||
|
});
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -145,7 +183,7 @@ public class PlayController {
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/play/{streamId}/convert")
|
@PostMapping("/play/{streamId}/convert")
|
||||||
public ResponseEntity<String> playConvert(@PathVariable String streamId) {
|
public ResponseEntity<String> playConvert(@PathVariable String streamId) {
|
||||||
StreamInfo streamInfo = storager.queryPlayByStreamId(streamId);
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
|
||||||
if (streamInfo == null) {
|
if (streamInfo == null) {
|
||||||
logger.warn("视频转码API调用失败!, 视频流已经停止!");
|
logger.warn("视频转码API调用失败!, 视频流已经停止!");
|
||||||
return new ResponseEntity<String>("未找到视频流信息, 视频流可能已经停止", HttpStatus.OK);
|
return new ResponseEntity<String>("未找到视频流信息, 视频流可能已经停止", HttpStatus.OK);
|
||||||
@ -155,7 +193,7 @@ public class PlayController {
|
|||||||
logger.warn("视频转码API调用失败!, 视频流已停止推流!");
|
logger.warn("视频转码API调用失败!, 视频流已停止推流!");
|
||||||
return new ResponseEntity<String>("推流信息在流媒体中不存在, 视频流可能已停止推流", HttpStatus.OK);
|
return new ResponseEntity<String>("推流信息在流媒体中不存在, 视频流可能已停止推流", HttpStatus.OK);
|
||||||
} else {
|
} else {
|
||||||
MediaServerConfig mediaInfo = storager.getMediaInfo();
|
MediaServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
|
||||||
String dstUrl = String.format("rtmp://%s:%s/convert/%s", "127.0.0.1", mediaInfo.getRtmpPort(),
|
String dstUrl = String.format("rtmp://%s:%s/convert/%s", "127.0.0.1", mediaInfo.getRtmpPort(),
|
||||||
streamId );
|
streamId );
|
||||||
String srcUrl = String.format("rtsp://%s:%s/rtp/%s", "127.0.0.1", mediaInfo.getRtspPort(), streamId);
|
String srcUrl = String.format("rtsp://%s:%s/rtp/%s", "127.0.0.1", mediaInfo.getRtspPort(), streamId);
|
||||||
|
@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.common.StreamInfo;
|
|||||||
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
import com.genersoft.iot.vmp.conf.MediaServerConfig;
|
||||||
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
|
||||||
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
|
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
|
||||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||||
import com.genersoft.iot.vmp.vmanager.play.PlayController;
|
import com.genersoft.iot.vmp.vmanager.play.PlayController;
|
||||||
import com.genersoft.iot.vmp.vmanager.service.IPlayService;
|
import com.genersoft.iot.vmp.vmanager.service.IPlayService;
|
||||||
@ -24,6 +25,9 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DeferredResultHolder resultHolder;
|
private DeferredResultHolder resultHolder;
|
||||||
|
|
||||||
@ -33,7 +37,7 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
|
||||||
StreamInfo streamInfo = onPublishHandler(resonse, deviceId, channelId, uuid);
|
StreamInfo streamInfo = onPublishHandler(resonse, deviceId, channelId, uuid);
|
||||||
if (streamInfo != null) {
|
if (streamInfo != null) {
|
||||||
storager.startPlay(streamInfo);
|
redisCatchStorage.startPlay(streamInfo);
|
||||||
msg.setData(JSON.toJSONString(streamInfo));
|
msg.setData(JSON.toJSONString(streamInfo));
|
||||||
resultHolder.invokeResult(msg);
|
resultHolder.invokeResult(msg);
|
||||||
} else {
|
} else {
|
||||||
@ -49,7 +53,7 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
|
msg.setId(DeferredResultHolder.CALLBACK_CMD_PlAY + uuid);
|
||||||
StreamInfo streamInfo = onPublishHandler(resonse, deviceId, channelId, uuid);
|
StreamInfo streamInfo = onPublishHandler(resonse, deviceId, channelId, uuid);
|
||||||
if (streamInfo != null) {
|
if (streamInfo != null) {
|
||||||
storager.startPlayback(streamInfo);
|
redisCatchStorage.startPlayback(streamInfo);
|
||||||
msg.setData(JSON.toJSONString(streamInfo));
|
msg.setData(JSON.toJSONString(streamInfo));
|
||||||
resultHolder.invokeResult(msg);
|
resultHolder.invokeResult(msg);
|
||||||
} else {
|
} else {
|
||||||
@ -65,7 +69,7 @@ public class PlayServiceImpl implements IPlayService {
|
|||||||
streamInfo.setStreamId(streamId);
|
streamInfo.setStreamId(streamId);
|
||||||
streamInfo.setDeviceID(deviceId);
|
streamInfo.setDeviceID(deviceId);
|
||||||
streamInfo.setCahnnelId(channelId);
|
streamInfo.setCahnnelId(channelId);
|
||||||
MediaServerConfig mediaServerConfig = storager.getMediaInfo();
|
MediaServerConfig mediaServerConfig = redisCatchStorage.getMediaInfo();
|
||||||
|
|
||||||
streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaServerConfig.getWanIp(), mediaServerConfig.getHttpPort(), streamId));
|
streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaServerConfig.getWanIp(), mediaServerConfig.getHttpPort(), streamId));
|
||||||
streamInfo.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaServerConfig.getWanIp(), mediaServerConfig.getHttpPort(), streamId));
|
streamInfo.setWs_flv(String.format("ws://%s:%s/rtp/%s.flv", mediaServerConfig.getWanIp(), mediaServerConfig.getHttpPort(), streamId));
|
||||||
|
@ -65,7 +65,7 @@ public class ApiDeviceController {
|
|||||||
JSONObject result = new JSONObject();
|
JSONObject result = new JSONObject();
|
||||||
List<Device> devices;
|
List<Device> devices;
|
||||||
if (start == null || limit ==null) {
|
if (start == null || limit ==null) {
|
||||||
devices = storager.queryVideoDeviceList(null);
|
devices = storager.queryVideoDeviceList();
|
||||||
result.put("DeviceCount", devices.size());
|
result.put("DeviceCount", devices.size());
|
||||||
}else {
|
}else {
|
||||||
PageResult<Device> deviceList = storager.queryVideoDeviceList(null, start/limit, limit);
|
PageResult<Device> deviceList = storager.queryVideoDeviceList(null, start/limit, limit);
|
||||||
|
@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Device;
|
|||||||
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
||||||
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
|
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
|
||||||
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
|
||||||
import com.genersoft.iot.vmp.vmanager.play.PlayController;
|
import com.genersoft.iot.vmp.vmanager.play.PlayController;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -35,6 +36,9 @@ public class ApiStreamController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IVideoManagerStorager storager;
|
private IVideoManagerStorager storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
private boolean closeWaitRTPInfo = false;
|
private boolean closeWaitRTPInfo = false;
|
||||||
|
|
||||||
|
|
||||||
@ -158,14 +162,14 @@ public class ApiStreamController {
|
|||||||
|
|
||||||
){
|
){
|
||||||
|
|
||||||
StreamInfo streamInfo = storager.queryPlayByDevice(serial, code);
|
StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(serial, code);
|
||||||
if (streamInfo == null) {
|
if (streamInfo == null) {
|
||||||
JSONObject result = new JSONObject();
|
JSONObject result = new JSONObject();
|
||||||
result.put("error","未找到流信息");
|
result.put("error","未找到流信息");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
cmder.streamByeCmd(streamInfo.getStreamId());
|
cmder.streamByeCmd(streamInfo.getStreamId());
|
||||||
storager.stopPlay(streamInfo);
|
redisCatchStorage.stopPlay(streamInfo);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BIN
src/main/resources/wvp.sqlite
Normal file
BIN
src/main/resources/wvp.sqlite
Normal file
Binary file not shown.
@ -104,7 +104,7 @@ export default {
|
|||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
this.initData();
|
this.initData();
|
||||||
this.updateLooper = setInterval(this.initData, 10000);
|
this.updateLooper = setInterval(this.initData, 1000);
|
||||||
},
|
},
|
||||||
destroyed() {
|
destroyed() {
|
||||||
this.$destroy('videojs');
|
this.$destroy('videojs');
|
||||||
|
Loading…
Reference in New Issue
Block a user