支持支持主码流子码流切换
parent
18898e982f
commit
f6c48588da
|
@ -49,6 +49,7 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git
|
||||||
- [X] 支持电子地图,支持接入WGS84和GCJ02两种坐标系,并且自动转化为合适的坐标系进行展示和分发
|
- [X] 支持电子地图,支持接入WGS84和GCJ02两种坐标系,并且自动转化为合适的坐标系进行展示和分发
|
||||||
- [X] 接入设备
|
- [X] 接入设备
|
||||||
- [X] 视频预览
|
- [X] 视频预览
|
||||||
|
- [X] 支持主码流子码流切换
|
||||||
- [X] 无限制接入路数,能接入多少设备只取决于你的服务器性能
|
- [X] 无限制接入路数,能接入多少设备只取决于你的服务器性能
|
||||||
- [X] 云台控制,控制设备转向,拉近,拉远
|
- [X] 云台控制,控制设备转向,拉近,拉远
|
||||||
- [X] 预置位查询,使用与设置
|
- [X] 预置位查询,使用与设置
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.genersoft.iot.vmp.common;
|
package com.genersoft.iot.vmp.common;
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 记录每次发送invite消息的状态
|
* 记录每次发送invite消息的状态
|
||||||
|
@ -125,20 +124,4 @@ public class InviteInfo {
|
||||||
this.streamMode = streamMode;
|
this.streamMode = streamMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*=========================设备主子码流逻辑START====================*/
|
|
||||||
@Schema(description = "是否为子码流(true-是,false-主码流)")
|
|
||||||
private boolean subStream;
|
|
||||||
|
|
||||||
public boolean isSubStream() {
|
|
||||||
return subStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSubStream(boolean subStream) {
|
|
||||||
this.subStream = subStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -453,19 +453,4 @@ public class Device {
|
||||||
this.sipTransactionInfo = sipTransactionInfo;
|
this.sipTransactionInfo = sipTransactionInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*======================设备主子码流逻辑START=========================*/
|
|
||||||
@Schema(description = "开启主子码流切换的开关(false-不开启,true-开启)")
|
|
||||||
private boolean switchPrimarySubStream;
|
|
||||||
|
|
||||||
public boolean isSwitchPrimarySubStream() {
|
|
||||||
return switchPrimarySubStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSwitchPrimarySubStream(boolean switchPrimarySubStream) {
|
|
||||||
this.switchPrimarySubStream = switchPrimarySubStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*======================设备主子码流逻辑END=========================*/
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,6 +246,10 @@ public class DeviceChannel {
|
||||||
@Schema(description = "GPS的更新时间")
|
@Schema(description = "GPS的更新时间")
|
||||||
private String gpsTime;
|
private String gpsTime;
|
||||||
|
|
||||||
|
@Schema(description = "码流标识,优先级高于设备中码流标识," +
|
||||||
|
"用于选择码流时组成码流标识。默认为null,不设置。可选值: stream/streamnumber/streamprofile/streamMode")
|
||||||
|
private String streamIdentification;
|
||||||
|
|
||||||
public int getId() {
|
public int getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -574,4 +578,12 @@ public class DeviceChannel {
|
||||||
public void setGpsTime(String gpsTime) {
|
public void setGpsTime(String gpsTime) {
|
||||||
this.gpsTime = gpsTime;
|
this.gpsTime = gpsTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getStreamIdentification() {
|
||||||
|
return streamIdentification;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStreamIdentification(String streamIdentification) {
|
||||||
|
this.streamIdentification = streamIdentification;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
package com.genersoft.iot.vmp.gb28181.bean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 码流索引标识
|
||||||
|
*/
|
||||||
|
public enum GbSteamIdentification {
|
||||||
|
/**
|
||||||
|
* 主码流 stream:0
|
||||||
|
* 子码流 stream:1s
|
||||||
|
*/
|
||||||
|
streamMain("stream", new String[]{"0","1"}),
|
||||||
|
/**
|
||||||
|
* 国标28181-2022定义的方式
|
||||||
|
* 主码流 streamnumber:0
|
||||||
|
* 子码流 streamnumber:1
|
||||||
|
*/
|
||||||
|
streamnumber("streamnumber", new String[]{"0","1"}),
|
||||||
|
/**
|
||||||
|
* 主码流 streamprofile:0
|
||||||
|
* 子码流 streamprofile:1
|
||||||
|
*/
|
||||||
|
streamprofile("streamprofile", new String[]{"0","1"}),
|
||||||
|
/**
|
||||||
|
* 适用的品牌: TP-LINK
|
||||||
|
*/
|
||||||
|
streamMode("streamMode", new String[]{"main","sub"}),
|
||||||
|
;
|
||||||
|
|
||||||
|
GbSteamIdentification(String value, String[] indexArray) {
|
||||||
|
this.value = value;
|
||||||
|
this.indexArray = indexArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String value;
|
||||||
|
private String[] indexArray;
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getIndexArray() {
|
||||||
|
return indexArray;
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
|
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
|
||||||
|
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.dto.MediaServerItem;
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
||||||
|
@ -96,9 +97,9 @@ public interface ISIPCommander {
|
||||||
/**
|
/**
|
||||||
* 请求预览视频流
|
* 请求预览视频流
|
||||||
* @param device 视频设备
|
* @param device 视频设备
|
||||||
* @param channelId 预览通道
|
* @param channel 预览通道
|
||||||
*/
|
*/
|
||||||
void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
|
void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求回放视频流
|
* 请求回放视频流
|
||||||
|
|
|
@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
|
||||||
import com.genersoft.iot.vmp.gb28181.SipLayer;
|
import com.genersoft.iot.vmp.gb28181.SipLayer;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
|
import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
||||||
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
|
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
|
||||||
|
@ -264,12 +265,12 @@ public class SIPCommander implements ISIPCommander {
|
||||||
* 请求预览视频流
|
* 请求预览视频流
|
||||||
*
|
*
|
||||||
* @param device 视频设备
|
* @param device 视频设备
|
||||||
* @param channelId 预览通道
|
* @param channel 预览通道
|
||||||
* @param event hook订阅
|
* @param event hook订阅
|
||||||
* @param errorEvent sip错误订阅
|
* @param errorEvent sip错误订阅
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
|
public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel,
|
||||||
ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
|
ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
|
||||||
String stream = ssrcInfo.getStream();
|
String stream = ssrcInfo.getStream();
|
||||||
|
|
||||||
|
@ -293,7 +294,7 @@ public class SIPCommander implements ISIPCommander {
|
||||||
}
|
}
|
||||||
StringBuffer content = new StringBuffer(200);
|
StringBuffer content = new StringBuffer(200);
|
||||||
content.append("v=0\r\n");
|
content.append("v=0\r\n");
|
||||||
content.append("o=" + channelId + " 0 0 IN IP4 " + sdpIp + "\r\n");
|
content.append("o=" + channel.getChannelId() + " 0 0 IN IP4 " + sdpIp + "\r\n");
|
||||||
content.append("s=Play\r\n");
|
content.append("s=Play\r\n");
|
||||||
content.append("c=IN IP4 " + sdpIp + "\r\n");
|
content.append("c=IN IP4 " + sdpIp + "\r\n");
|
||||||
content.append("t=0 0\r\n");
|
content.append("t=0 0\r\n");
|
||||||
|
@ -344,20 +345,8 @@ public class SIPCommander implements ISIPCommander {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( device.isSwitchPrimarySubStream() ){
|
if (!ObjectUtils.isEmpty(channel.getStreamIdentification())) {
|
||||||
if("TP-LINK".equals(device.getManufacturer())){
|
content.append("a=" + channel.getStreamIdentification() + "\r\n");
|
||||||
if (device.isSwitchPrimarySubStream()){
|
|
||||||
content.append("a=streamMode:sub\r\n");
|
|
||||||
}else {
|
|
||||||
content.append("a=streamMode:main\r\n");
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
if (device.isSwitchPrimarySubStream()){
|
|
||||||
content.append("a=streamprofile:1\r\n");
|
|
||||||
}else {
|
|
||||||
content.append("a=streamprofile:0\r\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
|
content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
|
||||||
|
@ -366,16 +355,16 @@ public class SIPCommander implements ISIPCommander {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
|
Request request = headerProvider.createInviteRequest(device, channel.getChannelId(), content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
|
||||||
sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, (e -> {
|
sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, (e -> {
|
||||||
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream());
|
||||||
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
||||||
errorEvent.response(e);
|
errorEvent.response(e);
|
||||||
}), e -> {
|
}), e -> {
|
||||||
ResponseEvent responseEvent = (ResponseEvent) e.event;
|
ResponseEvent responseEvent = (ResponseEvent) e.event;
|
||||||
SIPResponse response = (SIPResponse) responseEvent.getResponse();
|
SIPResponse response = (SIPResponse) responseEvent.getResponse();
|
||||||
String callId = response.getCallIdHeader().getCallId();
|
String callId = response.getCallIdHeader().getCallId();
|
||||||
streamSession.put(device.getDeviceId(), channelId, callId, stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response,
|
streamSession.put(device.getDeviceId(), channel.getChannelId(), callId, stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response,
|
||||||
InviteSessionType.PLAY);
|
InviteSessionType.PLAY);
|
||||||
okEvent.response(e);
|
okEvent.response(e);
|
||||||
});
|
});
|
||||||
|
|
|
@ -87,4 +87,9 @@ public interface IDeviceChannelService {
|
||||||
* 直接批量添加
|
* 直接批量添加
|
||||||
*/
|
*/
|
||||||
void batchAddChannel(List<DeviceChannel> deviceChannels);
|
void batchAddChannel(List<DeviceChannel> deviceChannels);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改通道的码流类型
|
||||||
|
*/
|
||||||
|
void updateChannelStreamIdentification(DeviceChannel channel);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.service;
|
||||||
import com.genersoft.iot.vmp.common.StreamInfo;
|
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
import com.genersoft.iot.vmp.conf.exception.ServiceException;
|
import com.genersoft.iot.vmp.conf.exception.ServiceException;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
import com.genersoft.iot.vmp.gb28181.bean.Device;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
||||||
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
||||||
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
||||||
|
@ -16,7 +17,7 @@ import java.text.ParseException;
|
||||||
*/
|
*/
|
||||||
public interface IPlayService {
|
public interface IPlayService {
|
||||||
|
|
||||||
void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
|
void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channelId,
|
||||||
ErrorCallback<Object> callback);
|
ErrorCallback<Object> callback);
|
||||||
SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, String ssrc, ErrorCallback<Object> callback);
|
SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, String ssrc, ErrorCallback<Object> callback);
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ 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;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -267,5 +268,16 @@ public class DeviceChannelServiceImpl implements IDeviceChannelService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateChannelStreamIdentification(DeviceChannel channel) {
|
||||||
|
assert !ObjectUtils.isEmpty(channel.getDeviceId());
|
||||||
|
assert !ObjectUtils.isEmpty(channel.getStreamIdentification());
|
||||||
|
if (ObjectUtils.isEmpty(channel.getStreamIdentification())) {
|
||||||
|
logger.info("[重置通道码流类型] 设备: {}, 码流: {}", channel.getDeviceId(), channel.getStreamIdentification());
|
||||||
|
}else {
|
||||||
|
logger.info("[更新通道码流类型] 设备: {}, 通道:{}, 码流: {}", channel.getDeviceId(), channel.getChannelId(),
|
||||||
|
channel.getStreamIdentification());
|
||||||
|
}
|
||||||
|
channelMapper.updateChannelStreamIdentification(channel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import com.genersoft.iot.vmp.common.CommonCallback;
|
||||||
import com.genersoft.iot.vmp.common.VideoManagerConstants;
|
import com.genersoft.iot.vmp.common.VideoManagerConstants;
|
||||||
import com.genersoft.iot.vmp.conf.DynamicTask;
|
import com.genersoft.iot.vmp.conf.DynamicTask;
|
||||||
import com.genersoft.iot.vmp.conf.UserSetting;
|
import com.genersoft.iot.vmp.conf.UserSetting;
|
||||||
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.*;
|
import com.genersoft.iot.vmp.gb28181.bean.*;
|
||||||
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
|
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
|
||||||
import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
|
import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
|
||||||
|
@ -139,10 +138,6 @@ public class DeviceServiceImpl implements IDeviceService {
|
||||||
}
|
}
|
||||||
sync(device);
|
sync(device);
|
||||||
}else {
|
}else {
|
||||||
|
|
||||||
if (deviceInDb != null) {
|
|
||||||
device.setSwitchPrimarySubStream(deviceInDb.isSwitchPrimarySubStream());
|
|
||||||
}
|
|
||||||
if(!device.isOnLine()){
|
if(!device.isOnLine()){
|
||||||
device.setOnLine(true);
|
device.setOnLine(true);
|
||||||
device.setCreateTime(now);
|
device.setCreateTime(now);
|
||||||
|
@ -486,21 +481,6 @@ public class DeviceServiceImpl implements IDeviceService {
|
||||||
logger.warn("更新设备时未找到设备信息");
|
logger.warn("更新设备时未找到设备信息");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(deviceInStore.isSwitchPrimarySubStream() != device.isSwitchPrimarySubStream()){
|
|
||||||
//当修改设备的主子码流开关时,需要校验是否存在流,如果存在流则直接关闭
|
|
||||||
List<SsrcTransaction> ssrcTransactionForAll = streamSession.getSsrcTransactionForAll(device.getDeviceId(), null, null, null);
|
|
||||||
if(ssrcTransactionForAll != null){
|
|
||||||
for (SsrcTransaction ssrcTransaction: ssrcTransactionForAll) {
|
|
||||||
try {
|
|
||||||
cmder.streamByeCmd(device, ssrcTransaction.getChannelId(), ssrcTransaction.getStream(), null, null);
|
|
||||||
} catch (InvalidArgumentException | SsrcTransactionNotFoundException | ParseException | SipException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
deviceChannelMapper.clearPlay(device.getDeviceId());
|
|
||||||
inviteStreamService.clearInviteInfo(device.getDeviceId());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ObjectUtils.isEmpty(device.getName())) {
|
if (!ObjectUtils.isEmpty(device.getName())) {
|
||||||
deviceInStore.setName(device.getName());
|
deviceInStore.setName(device.getName());
|
||||||
|
|
|
@ -15,21 +15,26 @@ import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.*;
|
import com.genersoft.iot.vmp.gb28181.bean.*;
|
||||||
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
|
||||||
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
|
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
|
||||||
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
|
||||||
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
|
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
|
||||||
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
|
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
|
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory;
|
import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory;
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
|
import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.*;
|
import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
|
||||||
|
import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForRecordMp4;
|
||||||
|
import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
|
||||||
|
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
||||||
import com.genersoft.iot.vmp.service.*;
|
import com.genersoft.iot.vmp.service.*;
|
||||||
import com.genersoft.iot.vmp.service.bean.*;
|
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
|
||||||
|
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
||||||
|
import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
|
||||||
|
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
|
||||||
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
|
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
|
||||||
import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper;
|
|
||||||
import com.genersoft.iot.vmp.utils.CloudRecordUtils;
|
import com.genersoft.iot.vmp.utils.CloudRecordUtils;
|
||||||
import com.genersoft.iot.vmp.utils.DateUtil;
|
import com.genersoft.iot.vmp.utils.DateUtil;
|
||||||
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
|
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
|
||||||
|
@ -63,7 +68,7 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
private IVideoManagerStorage storager;
|
private IVideoManagerStorage storager;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SIPCommander cmder;
|
private ISIPCommander cmder;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SIPCommanderFroPlatform sipCommanderFroPlatform;
|
private SIPCommanderFroPlatform sipCommanderFroPlatform;
|
||||||
|
@ -95,15 +100,15 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private IDeviceService deviceService;
|
private IDeviceService deviceService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IDeviceChannelService channelService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserSetting userSetting;
|
private UserSetting userSetting;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DynamicTask dynamicTask;
|
private DynamicTask dynamicTask;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private CloudRecordServiceMapper cloudRecordServiceMapper;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, String ssrc, ErrorCallback<Object> callback) {
|
public SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, String ssrc, ErrorCallback<Object> callback) {
|
||||||
|
@ -117,6 +122,11 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
logger.warn("[点播] 单端口收流时不支持TCP主动方式收流 deviceId: {},channelId:{}", deviceId, channelId);
|
logger.warn("[点播] 单端口收流时不支持TCP主动方式收流 deviceId: {},channelId:{}", deviceId, channelId);
|
||||||
throw new ControllerException(ErrorCode.ERROR100.getCode(), "单端口收流时不支持TCP主动方式收流");
|
throw new ControllerException(ErrorCode.ERROR100.getCode(), "单端口收流时不支持TCP主动方式收流");
|
||||||
}
|
}
|
||||||
|
DeviceChannel channel = channelService.getOne(deviceId, channelId);
|
||||||
|
if (channel == null) {
|
||||||
|
logger.warn("[点播] 未找到通道 deviceId: {},channelId:{}", deviceId, channelId);
|
||||||
|
throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到通道");
|
||||||
|
}
|
||||||
InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
|
InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
|
||||||
if (inviteInfo != null ) {
|
if (inviteInfo != null ) {
|
||||||
if (inviteInfo.getStreamInfo() == null) {
|
if (inviteInfo.getStreamInfo() == null) {
|
||||||
|
@ -165,13 +175,13 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
null);
|
null);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
play(mediaServerItem, ssrcInfo, device, channelId, callback);
|
play(mediaServerItem, ssrcInfo, device, channel, callback);
|
||||||
return ssrcInfo;
|
return ssrcInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
|
public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, DeviceChannel channel,
|
||||||
ErrorCallback<Object> callback) {
|
ErrorCallback<Object> callback) {
|
||||||
|
|
||||||
if (mediaServerItem == null || ssrcInfo == null) {
|
if (mediaServerItem == null || ssrcInfo == null) {
|
||||||
|
@ -180,110 +190,109 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
null);
|
null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
logger.info("[点播开始] deviceId: {}, channelId: {},码流类型:{}, 收流端口: {}, STREAM:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}",
|
logger.info("[点播开始] deviceId: {}, channelId: {},码流类型:{}, 收流端口: {}, 码流:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}",
|
||||||
device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "辅码流" : "主码流", ssrcInfo.getPort(), ssrcInfo.getStream(),
|
device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(), ssrcInfo.getPort(), ssrcInfo.getStream(),
|
||||||
device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
|
device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
|
||||||
//端口获取失败的ssrcInfo 没有必要发送点播指令
|
//端口获取失败的ssrcInfo 没有必要发送点播指令
|
||||||
if (ssrcInfo.getPort() <= 0) {
|
if (ssrcInfo.getPort() <= 0) {
|
||||||
logger.info("[点播端口分配异常],deviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo);
|
logger.info("[点播端口分配异常],deviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channel.getChannelId(), ssrcInfo);
|
||||||
// 释放ssrc
|
// 释放ssrc
|
||||||
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
||||||
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream());
|
||||||
|
|
||||||
callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null);
|
callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null);
|
||||||
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
|
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null,
|
||||||
InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null);
|
InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化redis中的invite消息状态
|
// 初始化redis中的invite消息状态
|
||||||
InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo,
|
InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream(), ssrcInfo,
|
||||||
mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY,
|
mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY,
|
||||||
InviteSessionStatus.ready);
|
InviteSessionStatus.ready);
|
||||||
inviteInfo.setSubStream(device.isSwitchPrimarySubStream());
|
|
||||||
inviteStreamService.updateInviteInfo(inviteInfo);
|
inviteStreamService.updateInviteInfo(inviteInfo);
|
||||||
// 超时处理
|
// 超时处理
|
||||||
String timeOutTaskKey = UUID.randomUUID().toString();
|
String timeOutTaskKey = UUID.randomUUID().toString();
|
||||||
dynamicTask.startDelay(timeOutTaskKey, () -> {
|
dynamicTask.startDelay(timeOutTaskKey, () -> {
|
||||||
// 执行超时任务时查询是否已经成功,成功了则不执行超时任务,防止超时任务取消失败的情况
|
// 执行超时任务时查询是否已经成功,成功了则不执行超时任务,防止超时任务取消失败的情况
|
||||||
InviteInfo inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
|
InviteInfo inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId());
|
||||||
if (inviteInfoForTimeOut == null || inviteInfoForTimeOut.getStreamInfo() == null) {
|
if (inviteInfoForTimeOut == null || inviteInfoForTimeOut.getStreamInfo() == null) {
|
||||||
logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流类型:{},端口:{}, SSRC: {}",
|
logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流:{},端口:{}, SSRC: {}",
|
||||||
device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "辅码流" : "主码流",
|
device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(),
|
||||||
ssrcInfo.getPort(), ssrcInfo.getSsrc());
|
ssrcInfo.getPort(), ssrcInfo.getSsrc());
|
||||||
|
|
||||||
callback.run(InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);
|
callback.run(InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);
|
||||||
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
|
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null,
|
||||||
InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);
|
InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);
|
||||||
inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
|
inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null);
|
cmder.streamByeCmd(device, channel.getChannelId(), ssrcInfo.getStream(), null);
|
||||||
} catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) {
|
} catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) {
|
||||||
logger.error("[点播超时], 发送BYE失败 {}", e.getMessage());
|
logger.error("[点播超时], 发送BYE失败 {}", e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
||||||
mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
|
mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
|
||||||
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream());
|
||||||
mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
|
mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
|
||||||
// 取消订阅消息监听
|
// 取消订阅消息监听
|
||||||
HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
|
HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
|
||||||
subscribe.removeSubscribe(hookSubscribe);
|
subscribe.removeSubscribe(hookSubscribe);
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流类型:{},端口:{}, SSRC: {}",
|
logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流:{},端口:{}, SSRC: {}",
|
||||||
device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "辅码流" : "主码流",
|
device.getDeviceId(), channel.getChannelId(), channel.getStreamIdentification(),
|
||||||
ssrcInfo.getPort(), ssrcInfo.getSsrc());
|
ssrcInfo.getPort(), ssrcInfo.getSsrc());
|
||||||
|
|
||||||
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
||||||
|
|
||||||
mediaServerService.closeRTPServer(mediaServerItem.getId(), ssrcInfo.getStream());
|
mediaServerService.closeRTPServer(mediaServerItem.getId(), ssrcInfo.getStream());
|
||||||
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream());
|
||||||
}
|
}
|
||||||
}, userSetting.getPlayTimeout());
|
}, userSetting.getPlayTimeout());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInuse, hookParam ) -> {
|
cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channel, (mediaServerItemInuse, hookParam ) -> {
|
||||||
logger.info("收到订阅消息: " + hookParam);
|
logger.info("收到订阅消息: " + hookParam);
|
||||||
dynamicTask.stop(timeOutTaskKey);
|
dynamicTask.stop(timeOutTaskKey);
|
||||||
// hook响应
|
// hook响应
|
||||||
StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channelId);
|
StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channel.getChannelId());
|
||||||
if (streamInfo == null){
|
if (streamInfo == null){
|
||||||
callback.run(InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
|
callback.run(InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
|
||||||
InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
|
InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
|
||||||
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
|
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null,
|
||||||
InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
|
InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
|
||||||
InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
|
InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
callback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo);
|
callback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo);
|
||||||
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
|
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null,
|
||||||
InviteErrorCode.SUCCESS.getCode(),
|
InviteErrorCode.SUCCESS.getCode(),
|
||||||
InviteErrorCode.SUCCESS.getMsg(),
|
InviteErrorCode.SUCCESS.getMsg(),
|
||||||
streamInfo);
|
streamInfo);
|
||||||
logger.info("[点播成功] deviceId: {}, channelId:{}, 码流类型:{}", device.getDeviceId(), channelId,
|
logger.info("[点播成功] deviceId: {}, channelId:{}, 码流类型:{}", device.getDeviceId(), channel.getChannelId(),
|
||||||
device.isSwitchPrimarySubStream() ? "辅码流" : "主码流");
|
channel.getStreamIdentification());
|
||||||
snapOnPlay(mediaServerItemInuse, device.getDeviceId(), channelId, ssrcInfo.getStream());
|
snapOnPlay(mediaServerItemInuse, device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream());
|
||||||
}, (eventResult) -> {
|
}, (eventResult) -> {
|
||||||
// 处理收到200ok后的TCP主动连接以及SSRC不一致的问题
|
// 处理收到200ok后的TCP主动连接以及SSRC不一致的问题
|
||||||
InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId,
|
InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channel.getChannelId(),
|
||||||
timeOutTaskKey, callback, inviteInfo, InviteSessionType.PLAY);
|
timeOutTaskKey, callback, inviteInfo, InviteSessionType.PLAY);
|
||||||
}, (event) -> {
|
}, (event) -> {
|
||||||
logger.info("[点播失败] deviceId: {}, channelId:{}, {}: {}", device.getDeviceId(), channelId, event.statusCode, event.msg);
|
logger.info("[点播失败] deviceId: {}, channelId:{}, {}: {}", device.getDeviceId(), channel.getChannelId(), event.statusCode, event.msg);
|
||||||
dynamicTask.stop(timeOutTaskKey);
|
dynamicTask.stop(timeOutTaskKey);
|
||||||
mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
|
mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
|
||||||
// 释放ssrc
|
// 释放ssrc
|
||||||
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
||||||
|
|
||||||
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream());
|
||||||
|
|
||||||
callback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_ERROR.getCode(),
|
callback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_ERROR.getCode(),
|
||||||
String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null);
|
String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null);
|
||||||
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
|
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null,
|
||||||
InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
|
InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
|
||||||
String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null);
|
String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null);
|
||||||
|
|
||||||
inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
|
inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId());
|
||||||
});
|
});
|
||||||
} catch (InvalidArgumentException | SipException | ParseException e) {
|
} catch (InvalidArgumentException | SipException | ParseException e) {
|
||||||
|
|
||||||
|
@ -293,15 +302,15 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
// 释放ssrc
|
// 释放ssrc
|
||||||
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
|
||||||
|
|
||||||
streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
|
streamSession.remove(device.getDeviceId(), channel.getChannelId(), ssrcInfo.getStream());
|
||||||
|
|
||||||
callback.run(InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(),
|
callback.run(InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(),
|
||||||
InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null);
|
InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null);
|
||||||
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
|
inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId(), null,
|
||||||
InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(),
|
InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(),
|
||||||
InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null);
|
InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null);
|
||||||
|
|
||||||
inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
|
inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channel.getChannelId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,7 +447,7 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void playBack(String deviceId, String channelId, String startTime,
|
public void playBack(String deviceId, String channelId, String startTime,
|
||||||
String endTime, ErrorCallback<Object> callback) {
|
String endTime, ErrorCallback<Object> callback) {
|
||||||
Device device = storager.queryVideoDevice(deviceId);
|
Device device = storager.queryVideoDevice(deviceId);
|
||||||
if (device == null) {
|
if (device == null) {
|
||||||
logger.warn("[录像回放] 未找到设备 deviceId: {},channelId:{}", deviceId, channelId);
|
logger.warn("[录像回放] 未找到设备 deviceId: {},channelId:{}", deviceId, channelId);
|
||||||
|
@ -463,8 +472,8 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo,
|
public void playBack(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo,
|
||||||
String deviceId, String channelId, String startTime,
|
String deviceId, String channelId, String startTime,
|
||||||
String endTime, ErrorCallback<Object> callback) {
|
String endTime, ErrorCallback<Object> callback) {
|
||||||
if (mediaServerItem == null || ssrcInfo == null) {
|
if (mediaServerItem == null || ssrcInfo == null) {
|
||||||
callback.run(InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getCode(),
|
callback.run(InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getCode(),
|
||||||
InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getMsg(),
|
InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getMsg(),
|
||||||
|
@ -881,7 +890,7 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
cmder.streamByeCmd(device, ssrcTransaction.getChannelId(),
|
cmder.streamByeCmd(device, ssrcTransaction.getChannelId(),
|
||||||
ssrcTransaction.getStream(), null);
|
ssrcTransaction.getStream(), null);
|
||||||
} catch (InvalidArgumentException | ParseException | SipException |
|
} catch (InvalidArgumentException | ParseException | SipException |
|
||||||
SsrcTransactionNotFoundException e) {
|
SsrcTransactionNotFoundException e) {
|
||||||
logger.error("[zlm离线]为正在使用此zlm的设备, 发送BYE失败 {}", e.getMessage());
|
logger.error("[zlm离线]为正在使用此zlm的设备, 发送BYE失败 {}", e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1031,16 +1040,16 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
|
|
||||||
MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
|
MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
|
||||||
play(newMediaServerItem, deviceId, channelId, null, (code, msg, data)->{
|
play(newMediaServerItem, deviceId, channelId, null, (code, msg, data)->{
|
||||||
if (code == InviteErrorCode.SUCCESS.getCode()) {
|
if (code == InviteErrorCode.SUCCESS.getCode()) {
|
||||||
InviteInfo inviteInfoForPlay = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
|
InviteInfo inviteInfoForPlay = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
|
||||||
if (inviteInfoForPlay != null && inviteInfoForPlay.getStreamInfo() != null) {
|
if (inviteInfoForPlay != null && inviteInfoForPlay.getStreamInfo() != null) {
|
||||||
getSnap(deviceId, channelId, fileName, errorCallback);
|
getSnap(deviceId, channelId, fileName, errorCallback);
|
||||||
}else {
|
}else {
|
||||||
errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null);
|
errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null);
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null);
|
errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,11 +20,11 @@ public interface DeviceChannelMapper {
|
||||||
@Insert("INSERT INTO wvp_device_channel (channel_id, device_id, name, manufacture, model, owner, civil_code, block, " +
|
@Insert("INSERT INTO wvp_device_channel (channel_id, device_id, name, manufacture, model, owner, civil_code, block, " +
|
||||||
"address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, secrecy, " +
|
"address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, secrecy, " +
|
||||||
"ip_address, port, password, ptz_type, status, stream_id, longitude, latitude, longitude_gcj02, latitude_gcj02, " +
|
"ip_address, port, password, ptz_type, status, stream_id, longitude, latitude, longitude_gcj02, latitude_gcj02, " +
|
||||||
"longitude_wgs84, latitude_wgs84, has_audio, create_time, update_time, business_group_id, gps_time) " +
|
"longitude_wgs84, latitude_wgs84, has_audio, create_time, update_time, business_group_id, gps_time, stream_identification) " +
|
||||||
"VALUES (#{channelId}, #{deviceId}, #{name}, #{manufacture}, #{model}, #{owner}, #{civilCode}, #{block}," +
|
"VALUES (#{channelId}, #{deviceId}, #{name}, #{manufacture}, #{model}, #{owner}, #{civilCode}, #{block}," +
|
||||||
"#{address}, #{parental}, #{parentId}, #{safetyWay}, #{registerWay}, #{certNum}, #{certifiable}, #{errCode}, #{secrecy}, " +
|
"#{address}, #{parental}, #{parentId}, #{safetyWay}, #{registerWay}, #{certNum}, #{certifiable}, #{errCode}, #{secrecy}, " +
|
||||||
"#{ipAddress}, #{port}, #{password}, #{PTZType}, #{status}, #{streamId}, #{longitude}, #{latitude}, #{longitudeGcj02}, " +
|
"#{ipAddress}, #{port}, #{password}, #{PTZType}, #{status}, #{streamId}, #{longitude}, #{latitude}, #{longitudeGcj02}, " +
|
||||||
"#{latitudeGcj02}, #{longitudeWgs84}, #{latitudeWgs84}, #{hasAudio}, #{createTime}, #{updateTime}, #{businessGroupId}, #{gpsTime})")
|
"#{latitudeGcj02}, #{longitudeWgs84}, #{latitudeWgs84}, #{hasAudio}, #{createTime}, #{updateTime}, #{businessGroupId}, #{gpsTime}, #{streamIdentification})")
|
||||||
int add(DeviceChannel channel);
|
int add(DeviceChannel channel);
|
||||||
|
|
||||||
@Update(value = {" <script>" +
|
@Update(value = {" <script>" +
|
||||||
|
@ -60,6 +60,7 @@ public interface DeviceChannelMapper {
|
||||||
"<if test='latitudeWgs84 != null'>, latitude_wgs84=#{latitudeWgs84}</if>" +
|
"<if test='latitudeWgs84 != null'>, latitude_wgs84=#{latitudeWgs84}</if>" +
|
||||||
"<if test='businessGroupId != null'>, business_group_id=#{businessGroupId}</if>" +
|
"<if test='businessGroupId != null'>, business_group_id=#{businessGroupId}</if>" +
|
||||||
"<if test='gpsTime != null'>, gps_time=#{gpsTime}</if>" +
|
"<if test='gpsTime != null'>, gps_time=#{gpsTime}</if>" +
|
||||||
|
"<if test='streamIdentification != null'>, stream_identification=#{streamIdentification}</if>" +
|
||||||
"WHERE device_id=#{deviceId} AND channel_id=#{channelId}"+
|
"WHERE device_id=#{deviceId} AND channel_id=#{channelId}"+
|
||||||
" </script>"})
|
" </script>"})
|
||||||
int update(DeviceChannel channel);
|
int update(DeviceChannel channel);
|
||||||
|
@ -102,6 +103,7 @@ public interface DeviceChannelMapper {
|
||||||
"dc.longitude_wgs84, " +
|
"dc.longitude_wgs84, " +
|
||||||
"dc.latitude_wgs84, " +
|
"dc.latitude_wgs84, " +
|
||||||
"dc.business_group_id, " +
|
"dc.business_group_id, " +
|
||||||
|
"dc.stream_identification, " +
|
||||||
"dc.gps_time " +
|
"dc.gps_time " +
|
||||||
"from " +
|
"from " +
|
||||||
"wvp_device_channel dc " +
|
"wvp_device_channel dc " +
|
||||||
|
@ -241,7 +243,7 @@ public interface DeviceChannelMapper {
|
||||||
"(channel_id, device_id, name, manufacture, model, owner, civil_code, block, sub_count, " +
|
"(channel_id, device_id, name, manufacture, model, owner, civil_code, block, sub_count, " +
|
||||||
" address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, secrecy, " +
|
" address, parental, parent_id, safety_way, register_way, cert_num, certifiable, err_code, secrecy, " +
|
||||||
" ip_address,port,password,ptz_type,status,stream_id,longitude,latitude,longitude_gcj02,latitude_gcj02,"+
|
" ip_address,port,password,ptz_type,status,stream_id,longitude,latitude,longitude_gcj02,latitude_gcj02,"+
|
||||||
" longitude_wgs84,latitude_wgs84,has_audio,create_time,update_time,business_group_id,gps_time)"+
|
" longitude_wgs84,latitude_wgs84,has_audio,create_time,update_time,business_group_id,gps_time,stream_identification)"+
|
||||||
"values " +
|
"values " +
|
||||||
"<foreach collection='addChannels' index='index' item='item' separator=','> " +
|
"<foreach collection='addChannels' index='index' item='item' separator=','> " +
|
||||||
"(#{item.channelId}, #{item.deviceId}, #{item.name}, #{item.manufacture}, #{item.model}, " +
|
"(#{item.channelId}, #{item.deviceId}, #{item.name}, #{item.manufacture}, #{item.model}, " +
|
||||||
|
@ -251,7 +253,7 @@ public interface DeviceChannelMapper {
|
||||||
"#{item.ipAddress}, #{item.port}, #{item.password}, #{item.PTZType}, #{item.status}, " +
|
"#{item.ipAddress}, #{item.port}, #{item.password}, #{item.PTZType}, #{item.status}, " +
|
||||||
"#{item.streamId}, #{item.longitude}, #{item.latitude},#{item.longitudeGcj02}, " +
|
"#{item.streamId}, #{item.longitude}, #{item.latitude},#{item.longitudeGcj02}, " +
|
||||||
"#{item.latitudeGcj02},#{item.longitudeWgs84}, #{item.latitudeWgs84}, #{item.hasAudio}, now(), now(), " +
|
"#{item.latitudeGcj02},#{item.longitudeWgs84}, #{item.latitudeWgs84}, #{item.hasAudio}, now(), now(), " +
|
||||||
"#{item.businessGroupId}, #{item.gpsTime}) " +
|
"#{item.businessGroupId}, #{item.gpsTime}, #{item.streamIdentification}) " +
|
||||||
"</foreach> " +
|
"</foreach> " +
|
||||||
"</script>")
|
"</script>")
|
||||||
int batchAdd(@Param("addChannels") List<DeviceChannel> addChannels);
|
int batchAdd(@Param("addChannels") List<DeviceChannel> addChannels);
|
||||||
|
@ -349,6 +351,7 @@ public interface DeviceChannelMapper {
|
||||||
"<if test='item.latitudeWgs84 != null'>, latitude_wgs84=#{item.latitudeWgs84}</if>" +
|
"<if test='item.latitudeWgs84 != null'>, latitude_wgs84=#{item.latitudeWgs84}</if>" +
|
||||||
"<if test='item.businessGroupId != null'>, business_group_id=#{item.businessGroupId}</if>" +
|
"<if test='item.businessGroupId != null'>, business_group_id=#{item.businessGroupId}</if>" +
|
||||||
"<if test='item.gpsTime != null'>, gps_time=#{item.gpsTime}</if>" +
|
"<if test='item.gpsTime != null'>, gps_time=#{item.gpsTime}</if>" +
|
||||||
|
"<if test='item.streamIdentification != null'>, stream_identification=#{item.streamIdentification}</if>" +
|
||||||
"<if test='item.id > 0'>WHERE id=#{item.id}</if>" +
|
"<if test='item.id > 0'>WHERE id=#{item.id}</if>" +
|
||||||
"<if test='item.id == 0'>WHERE device_id=#{item.deviceId} AND channel_id=#{item.channelId}</if>" +
|
"<if test='item.id == 0'>WHERE device_id=#{item.deviceId} AND channel_id=#{item.channelId}</if>" +
|
||||||
"</foreach>" +
|
"</foreach>" +
|
||||||
|
@ -542,4 +545,9 @@ public interface DeviceChannelMapper {
|
||||||
" </script>"})
|
" </script>"})
|
||||||
List<DeviceChannel> getSubChannelsByDeviceId(@Param("deviceId") String deviceId, @Param("parentId") String parentId, @Param("onlyCatalog") boolean onlyCatalog);
|
List<DeviceChannel> getSubChannelsByDeviceId(@Param("deviceId") String deviceId, @Param("parentId") String parentId, @Param("onlyCatalog") boolean onlyCatalog);
|
||||||
|
|
||||||
|
@Update("<script>" +
|
||||||
|
"UPDATE wvp_device_channel SET stream_identification=#{streamIdentification} WHERE device_id=#{deviceId}" +
|
||||||
|
" <if test='channelId != null'> and channel_id = #{channelId} </if>" +
|
||||||
|
"</script>")
|
||||||
|
void updateChannelStreamIdentification(DeviceChannel channel);
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,6 @@ public interface DeviceMapper {
|
||||||
"geo_coord_sys," +
|
"geo_coord_sys," +
|
||||||
"on_line," +
|
"on_line," +
|
||||||
"media_server_id," +
|
"media_server_id," +
|
||||||
"switch_primary_sub_stream," +
|
|
||||||
"(SELECT count(0) FROM wvp_device_channel WHERE device_id=wvp_device.device_id) as channel_count "+
|
"(SELECT count(0) FROM wvp_device_channel WHERE device_id=wvp_device.device_id) as channel_count "+
|
||||||
" FROM wvp_device WHERE device_id = #{deviceId}")
|
" FROM wvp_device WHERE device_id = #{deviceId}")
|
||||||
Device getDeviceByDeviceId(String deviceId);
|
Device getDeviceByDeviceId(String deviceId);
|
||||||
|
@ -159,7 +158,6 @@ public interface DeviceMapper {
|
||||||
"geo_coord_sys,"+
|
"geo_coord_sys,"+
|
||||||
"on_line,"+
|
"on_line,"+
|
||||||
"media_server_id,"+
|
"media_server_id,"+
|
||||||
"switch_primary_sub_stream switchPrimarySubStream,"+
|
|
||||||
"(SELECT count(0) FROM wvp_device_channel WHERE device_id=de.device_id) as channel_count " +
|
"(SELECT count(0) FROM wvp_device_channel WHERE device_id=de.device_id) as channel_count " +
|
||||||
"FROM wvp_device de" +
|
"FROM wvp_device de" +
|
||||||
"<if test=\"onLine != null\"> where on_line=${onLine}</if>"+
|
"<if test=\"onLine != null\"> where on_line=${onLine}</if>"+
|
||||||
|
@ -249,7 +247,6 @@ public interface DeviceMapper {
|
||||||
"<if test=\"ssrcCheck != null\">, ssrc_check=#{ssrcCheck}</if>" +
|
"<if test=\"ssrcCheck != null\">, ssrc_check=#{ssrcCheck}</if>" +
|
||||||
"<if test=\"asMessageChannel != null\">, as_message_channel=#{asMessageChannel}</if>" +
|
"<if test=\"asMessageChannel != null\">, as_message_channel=#{asMessageChannel}</if>" +
|
||||||
"<if test=\"geoCoordSys != null\">, geo_coord_sys=#{geoCoordSys}</if>" +
|
"<if test=\"geoCoordSys != null\">, geo_coord_sys=#{geoCoordSys}</if>" +
|
||||||
"<if test=\"switchPrimarySubStream != null\">, switch_primary_sub_stream=#{switchPrimarySubStream}</if>" +
|
|
||||||
"<if test=\"mediaServerId != null\">, media_server_id=#{mediaServerId}</if>" +
|
"<if test=\"mediaServerId != null\">, media_server_id=#{mediaServerId}</if>" +
|
||||||
"WHERE device_id=#{deviceId}"+
|
"WHERE device_id=#{deviceId}"+
|
||||||
" </script>"})
|
" </script>"})
|
||||||
|
@ -267,8 +264,7 @@ public interface DeviceMapper {
|
||||||
"as_message_channel,"+
|
"as_message_channel,"+
|
||||||
"geo_coord_sys,"+
|
"geo_coord_sys,"+
|
||||||
"on_line,"+
|
"on_line,"+
|
||||||
"media_server_id,"+
|
"media_server_id"+
|
||||||
"switch_primary_sub_stream"+
|
|
||||||
") VALUES (" +
|
") VALUES (" +
|
||||||
"#{deviceId}," +
|
"#{deviceId}," +
|
||||||
"#{name}," +
|
"#{name}," +
|
||||||
|
@ -281,8 +277,7 @@ public interface DeviceMapper {
|
||||||
"#{asMessageChannel}," +
|
"#{asMessageChannel}," +
|
||||||
"#{geoCoordSys}," +
|
"#{geoCoordSys}," +
|
||||||
"#{onLine}," +
|
"#{onLine}," +
|
||||||
"#{mediaServerId}," +
|
"#{mediaServerId}" +
|
||||||
"#{switchPrimarySubStream}" +
|
|
||||||
")")
|
")")
|
||||||
void addCustomDevice(Device device);
|
void addCustomDevice(Device device);
|
||||||
|
|
||||||
|
|
|
@ -264,6 +264,14 @@ public class DeviceQuery {
|
||||||
deviceChannelService.updateChannel(deviceId, channel);
|
deviceChannelService.updateChannel(deviceId, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Operation(summary = "修改通道的码流类型", security = @SecurityRequirement(name = JwtUtils.HEADER))
|
||||||
|
@Parameter(name = "deviceId", description = "设备国标编号", required = true)
|
||||||
|
@Parameter(name = "channel", description = "通道信息", required = true)
|
||||||
|
@PostMapping("/channel/stream/identification/update/")
|
||||||
|
public void updateChannelStreamIdentification(DeviceChannel channel){
|
||||||
|
deviceChannelService.updateChannelStreamIdentification(channel);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改数据流传输模式
|
* 修改数据流传输模式
|
||||||
* @param deviceId 设备id
|
* @param deviceId 设备id
|
||||||
|
|
|
@ -13,24 +13,30 @@
|
||||||
prefix-icon="el-icon-search" v-model="searchSrt" clearable></el-input>
|
prefix-icon="el-icon-search" v-model="searchSrt" clearable></el-input>
|
||||||
|
|
||||||
通道类型:
|
通道类型:
|
||||||
<el-select size="mini" @change="search" style="margin-right: 1rem;" v-model="channelType" placeholder="请选择"
|
<el-select size="mini" @change="search" style="width: 8rem; margin-right: 1rem;" v-model="channelType" placeholder="请选择"
|
||||||
default-first-option>
|
default-first-option>
|
||||||
<el-option label="全部" value=""></el-option>
|
<el-option label="全部" value=""></el-option>
|
||||||
<el-option label="设备" value="false"></el-option>
|
<el-option label="设备" value="false"></el-option>
|
||||||
<el-option label="子目录" value="true"></el-option>
|
<el-option label="子目录" value="true"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
在线状态:
|
在线状态:
|
||||||
<el-select size="mini" style="margin-right: 1rem;" @change="search" v-model="online" placeholder="请选择"
|
<el-select size="mini" style="width: 8rem; margin-right: 1rem;" @change="search" v-model="online" placeholder="请选择"
|
||||||
default-first-option>
|
default-first-option>
|
||||||
<el-option label="全部" value=""></el-option>
|
<el-option label="全部" value=""></el-option>
|
||||||
<el-option label="在线" value="true"></el-option>
|
<el-option label="在线" value="true"></el-option>
|
||||||
<el-option label="离线" value="false"></el-option>
|
<el-option label="离线" value="false"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
清晰度:
|
码流类型重置:
|
||||||
<el-select size="mini" style="margin-right: 1rem;" @change="search" v-model="isSubStream" placeholder="请选择"
|
<el-select size="mini" style="width: 16rem; margin-right: 1rem;" @change="subStreamChange" v-model="subStream"
|
||||||
default-first-option>
|
placeholder="请选择码流类型" default-first-option >
|
||||||
<el-option label="原画" :value="false"></el-option>
|
<el-option label="stream:0(主码流)" value="stream:0"></el-option>
|
||||||
<el-option label="流畅" :value="true"></el-option>
|
<el-option label="stream:1(子码流)" value="stream:1"></el-option>
|
||||||
|
<el-option label="streamnumber:0(主码流-2022)" value="streamnumber:0"></el-option>
|
||||||
|
<el-option label="streamnumber:1(子码流-2022)" value="streamnumber:1"></el-option>
|
||||||
|
<el-option label="streamprofile:0(主码流-大华)" value="streamprofile:0"></el-option>
|
||||||
|
<el-option label="streamprofile:1(子码流-大华)" value="streamprofile:1"></el-option>
|
||||||
|
<el-option label="streamMode:main(主码流-水星+TP-LINK)" value="streamMode:main"></el-option>
|
||||||
|
<el-option label="streamMode:sub(子码流-水星+TP-LINK)" value="streamMode:sub"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</div>
|
</div>
|
||||||
<el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button>
|
<el-button icon="el-icon-refresh-right" circle size="mini" @click="refresh()"></el-button>
|
||||||
|
@ -46,11 +52,11 @@
|
||||||
<el-main style="padding: 5px;">
|
<el-main style="padding: 5px;">
|
||||||
<el-table ref="channelListTable" :data="deviceChannelList" :height="winHeight" style="width: 100%"
|
<el-table ref="channelListTable" :data="deviceChannelList" :height="winHeight" style="width: 100%"
|
||||||
header-row-class-name="table-header">
|
header-row-class-name="table-header">
|
||||||
<el-table-column prop="channelId" label="通道编号" min-width="200">
|
<el-table-column prop="channelId" label="通道编号" min-width="180">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="deviceId" label="设备编号" min-width="200">
|
<el-table-column prop="deviceId" label="设备编号" min-width="180">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="name" label="通道名称" min-width="200">
|
<el-table-column prop="name" label="通道名称" min-width="180">
|
||||||
<template v-slot:default="scope">
|
<template v-slot:default="scope">
|
||||||
<el-input
|
<el-input
|
||||||
v-show="scope.row.edit"
|
v-show="scope.row.edit"
|
||||||
|
@ -63,7 +69,7 @@
|
||||||
<span v-show="!scope.row.edit">{{ scope.row.name }}</span>
|
<span v-show="!scope.row.edit">{{ scope.row.name }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="快照" min-width="120">
|
<el-table-column label="快照" min-width="100">
|
||||||
<template v-slot:default="scope">
|
<template v-slot:default="scope">
|
||||||
<el-image
|
<el-image
|
||||||
:src="getSnap(scope.row)"
|
:src="getSnap(scope.row)"
|
||||||
|
@ -77,11 +83,11 @@
|
||||||
</el-image>
|
</el-image>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="subCount" label="子节点数" min-width="120">
|
<el-table-column prop="subCount" label="子节点数" min-width="100">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="manufacture" label="厂家" min-width="120">
|
<el-table-column prop="manufacture" label="厂家" min-width="100">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="位置信息" min-width="200">
|
<el-table-column label="位置信息" min-width="120">
|
||||||
<template v-slot:default="scope">
|
<template v-slot:default="scope">
|
||||||
<el-input
|
<el-input
|
||||||
v-show="scope.row.edit"
|
v-show="scope.row.edit"
|
||||||
|
@ -94,7 +100,7 @@
|
||||||
<span v-show="!scope.row.edit">{{ scope.row.location }}</span>
|
<span v-show="!scope.row.edit">{{ scope.row.location }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="PTZType" label="云台类型" min-width="120">
|
<el-table-column prop="PTZType" label="云台类型" min-width="100">
|
||||||
<template v-slot:default="scope">
|
<template v-slot:default="scope">
|
||||||
<el-select v-show="scope.row.edit" v-model="scope.row.PTZType"
|
<el-select v-show="scope.row.edit" v-model="scope.row.PTZType"
|
||||||
placeholder="云台类型" filterable>
|
placeholder="云台类型" filterable>
|
||||||
|
@ -108,13 +114,28 @@
|
||||||
<div v-show="!scope.row.edit">{{ scope.row.PTZTypeText }}</div>
|
<div v-show="!scope.row.edit">{{ scope.row.PTZTypeText }}</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="开启音频" min-width="120">
|
<el-table-column label="开启音频" min-width="100">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-switch @change="updateChannel(scope.row)" v-model="scope.row.hasAudio" active-color="#409EFF">
|
<el-switch @change="updateChannel(scope.row)" v-model="scope.row.hasAudio" active-color="#409EFF">
|
||||||
</el-switch>
|
</el-switch>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="状态" min-width="120">
|
<el-table-column label="码流类型" min-width="180">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-select size="mini" style="margin-right: 1rem;" @change="channelSubStreamChange(scope.row)" v-model="scope.row.streamIdentification"
|
||||||
|
placeholder="请选择码流类型" default-first-option >
|
||||||
|
<el-option label="stream:0(主码流)" value="stream:0"></el-option>
|
||||||
|
<el-option label="stream:1(子码流)" value="stream:1"></el-option>
|
||||||
|
<el-option label="streamnumber:0(主码流-2022)" value="streamnumber:0"></el-option>
|
||||||
|
<el-option label="streamnumber:1(子码流-2022)" value="streamnumber:1"></el-option>
|
||||||
|
<el-option label="streamprofile:0(主码流-大华)" value="streamprofile:0"></el-option>
|
||||||
|
<el-option label="streamprofile:1(子码流-大华)" value="streamprofile:1"></el-option>
|
||||||
|
<el-option label="streamMode:main(主码流-水星+TP-LINK)" value="streamMode:main"></el-option>
|
||||||
|
<el-option label="streamMode:sub(子码流-水星+TP-LINK)" value="streamMode:sub"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="状态" min-width="100">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<div slot="reference" class="name-wrapper">
|
<div slot="reference" class="name-wrapper">
|
||||||
<el-tag size="medium" v-if="scope.row.status === true">在线</el-tag>
|
<el-tag size="medium" v-if="scope.row.status === true">在线</el-tag>
|
||||||
|
@ -122,8 +143,6 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
|
|
||||||
<el-table-column label="操作" min-width="340" fixed="right">
|
<el-table-column label="操作" min-width="340" fixed="right">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button size="medium" v-bind:disabled="device == null || device.online === 0" icon="el-icon-video-play"
|
<el-button size="medium" v-bind:disabled="device == null || device.online === 0" icon="el-icon-video-play"
|
||||||
|
@ -213,7 +232,7 @@ export default {
|
||||||
searchSrt: "",
|
searchSrt: "",
|
||||||
channelType: "",
|
channelType: "",
|
||||||
online: "",
|
online: "",
|
||||||
isSubStream: false,
|
subStream: "",
|
||||||
winHeight: window.innerHeight - 200,
|
winHeight: window.innerHeight - 200,
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
count: 15,
|
count: 15,
|
||||||
|
@ -495,6 +514,43 @@ export default {
|
||||||
console.log(JSON.stringify(res));
|
console.log(JSON.stringify(res));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
subStreamChange: function () {
|
||||||
|
this.$confirm('确定重置所有通道的码流类型?', '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => {
|
||||||
|
this.$axios({
|
||||||
|
method: 'post',
|
||||||
|
url: `/api/device/query/channel/stream/identification/update/`,
|
||||||
|
params: {
|
||||||
|
deviceId: this.deviceId,
|
||||||
|
streamIdentification: this.subStream
|
||||||
|
}
|
||||||
|
}).then((res)=> {
|
||||||
|
console.log(JSON.stringify(res));
|
||||||
|
this.initData()
|
||||||
|
}).finally(()=>{
|
||||||
|
this.subStream = ""
|
||||||
|
})
|
||||||
|
}).catch(() => {
|
||||||
|
this.subStream = ""
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
channelSubStreamChange: function (row) {
|
||||||
|
this.$axios({
|
||||||
|
method: 'post',
|
||||||
|
url: `/api/device/query/channel/stream/identification/update/`,
|
||||||
|
params: {
|
||||||
|
deviceId: this.deviceId,
|
||||||
|
channelId: row.channelId,
|
||||||
|
streamIdentification: row.streamIdentification
|
||||||
|
}
|
||||||
|
}).then(function (res) {
|
||||||
|
console.log(JSON.stringify(res));
|
||||||
|
});
|
||||||
|
},
|
||||||
refresh: function () {
|
refresh: function () {
|
||||||
this.initData();
|
this.initData();
|
||||||
},
|
},
|
||||||
|
|
|
@ -58,12 +58,6 @@
|
||||||
<el-form-item v-if="form.subscribeCycleForMobilePosition > 0" label="移动位置报送间隔" prop="subscribeCycleForCatalog" >
|
<el-form-item v-if="form.subscribeCycleForMobilePosition > 0" label="移动位置报送间隔" prop="subscribeCycleForCatalog" >
|
||||||
<el-input v-model="form.mobilePositionSubmissionInterval" clearable ></el-input>
|
<el-input v-model="form.mobilePositionSubmissionInterval" clearable ></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="主子码流开关" prop="switchPrimarySubStream" >
|
|
||||||
<el-select v-model="form.switchPrimarySubStream" style="float: left; width: 100%" >
|
|
||||||
<el-option key="true" label="开启" :value="true"></el-option>
|
|
||||||
<el-option key="false" label="关闭" :value="false"></el-option>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="其他选项">
|
<el-form-item label="其他选项">
|
||||||
<el-checkbox label="SSRC校验" v-model="form.ssrcCheck" style="float: left"></el-checkbox>
|
<el-checkbox label="SSRC校验" v-model="form.ssrcCheck" style="float: left"></el-checkbox>
|
||||||
<el-checkbox label="作为消息通道" v-model="form.asMessageChannel" style="float: left"></el-checkbox>
|
<el-checkbox label="作为消息通道" v-model="form.asMessageChannel" style="float: left"></el-checkbox>
|
||||||
|
|
|
@ -0,0 +1,324 @@
|
||||||
|
/*建表*/
|
||||||
|
create table wvp_device (
|
||||||
|
id serial primary key ,
|
||||||
|
device_id character varying(50) not null ,
|
||||||
|
name character varying(255),
|
||||||
|
manufacturer character varying(255),
|
||||||
|
model character varying(255),
|
||||||
|
firmware character varying(255),
|
||||||
|
transport character varying(50),
|
||||||
|
stream_mode character varying(50),
|
||||||
|
on_line bool default false,
|
||||||
|
register_time character varying(50),
|
||||||
|
keepalive_time character varying(50),
|
||||||
|
ip character varying(50),
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50),
|
||||||
|
port integer,
|
||||||
|
expires integer,
|
||||||
|
subscribe_cycle_for_catalog integer DEFAULT 0,
|
||||||
|
subscribe_cycle_for_mobile_position integer DEFAULT 0,
|
||||||
|
mobile_position_submission_interval integer DEFAULT 5,
|
||||||
|
subscribe_cycle_for_alarm integer DEFAULT 0,
|
||||||
|
host_address character varying(50),
|
||||||
|
charset character varying(50),
|
||||||
|
ssrc_check bool default false,
|
||||||
|
geo_coord_sys character varying(50),
|
||||||
|
media_server_id character varying(50),
|
||||||
|
custom_name character varying(255),
|
||||||
|
sdp_ip character varying(50),
|
||||||
|
local_ip character varying(50),
|
||||||
|
password character varying(255),
|
||||||
|
as_message_channel bool default false,
|
||||||
|
keepalive_interval_time integer,
|
||||||
|
switch_primary_sub_stream bool default false,
|
||||||
|
broadcast_push_after_ack bool default false,
|
||||||
|
constraint uk_device_device unique (device_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_device_alarm (
|
||||||
|
id serial primary key ,
|
||||||
|
device_id character varying(50) not null,
|
||||||
|
channel_id character varying(50) not null,
|
||||||
|
alarm_priority character varying(50),
|
||||||
|
alarm_method character varying(50),
|
||||||
|
alarm_time character varying(50),
|
||||||
|
alarm_description character varying(255),
|
||||||
|
longitude double precision,
|
||||||
|
latitude double precision,
|
||||||
|
alarm_type character varying(50),
|
||||||
|
create_time character varying(50) not null
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_device_channel (
|
||||||
|
id serial primary key ,
|
||||||
|
channel_id character varying(50) not null,
|
||||||
|
name character varying(255),
|
||||||
|
custom_name character varying(255),
|
||||||
|
manufacture character varying(50),
|
||||||
|
model character varying(50),
|
||||||
|
owner character varying(50),
|
||||||
|
civil_code character varying(50),
|
||||||
|
block character varying(50),
|
||||||
|
address character varying(50),
|
||||||
|
parent_id character varying(50),
|
||||||
|
safety_way integer,
|
||||||
|
register_way integer,
|
||||||
|
cert_num character varying(50),
|
||||||
|
certifiable integer,
|
||||||
|
err_code integer,
|
||||||
|
end_time character varying(50),
|
||||||
|
secrecy character varying(50),
|
||||||
|
ip_address character varying(50),
|
||||||
|
port integer,
|
||||||
|
password character varying(255),
|
||||||
|
ptz_type integer,
|
||||||
|
custom_ptz_type integer,
|
||||||
|
status bool default false,
|
||||||
|
longitude double precision,
|
||||||
|
custom_longitude double precision,
|
||||||
|
latitude double precision,
|
||||||
|
custom_latitude double precision,
|
||||||
|
stream_id character varying(255),
|
||||||
|
device_id character varying(50) not null,
|
||||||
|
parental character varying(50),
|
||||||
|
has_audio bool default false,
|
||||||
|
create_time character varying(50) not null,
|
||||||
|
update_time character varying(50) not null,
|
||||||
|
sub_count integer,
|
||||||
|
longitude_gcj02 double precision,
|
||||||
|
latitude_gcj02 double precision,
|
||||||
|
longitude_wgs84 double precision,
|
||||||
|
latitude_wgs84 double precision,
|
||||||
|
business_group_id character varying(50),
|
||||||
|
gps_time character varying(50),
|
||||||
|
stream_identification character varying(50),
|
||||||
|
constraint uk_wvp_device_channel_unique_device_channel unique (device_id, channel_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_device_mobile_position (
|
||||||
|
id serial primary key,
|
||||||
|
device_id character varying(50) not null,
|
||||||
|
channel_id character varying(50) not null,
|
||||||
|
device_name character varying(255),
|
||||||
|
time character varying(50),
|
||||||
|
longitude double precision,
|
||||||
|
latitude double precision,
|
||||||
|
altitude double precision,
|
||||||
|
speed double precision,
|
||||||
|
direction double precision,
|
||||||
|
report_source character varying(50),
|
||||||
|
longitude_gcj02 double precision,
|
||||||
|
latitude_gcj02 double precision,
|
||||||
|
longitude_wgs84 double precision,
|
||||||
|
latitude_wgs84 double precision,
|
||||||
|
create_time character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_gb_stream (
|
||||||
|
gb_stream_id serial primary key,
|
||||||
|
app character varying(255) not null,
|
||||||
|
stream character varying(255) not null,
|
||||||
|
gb_id character varying(50) not null,
|
||||||
|
name character varying(255),
|
||||||
|
longitude double precision,
|
||||||
|
latitude double precision,
|
||||||
|
stream_type character varying(50),
|
||||||
|
media_server_id character varying(50),
|
||||||
|
create_time character varying(50),
|
||||||
|
constraint uk_gb_stream_unique_gb_id unique (gb_id),
|
||||||
|
constraint uk_gb_stream_unique_app_stream unique (app, stream)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_log (
|
||||||
|
id serial primary key ,
|
||||||
|
name character varying(50),
|
||||||
|
type character varying(50),
|
||||||
|
uri character varying(200),
|
||||||
|
address character varying(50),
|
||||||
|
result character varying(50),
|
||||||
|
timing bigint,
|
||||||
|
username character varying(50),
|
||||||
|
create_time character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_media_server (
|
||||||
|
id character varying(255) primary key ,
|
||||||
|
ip character varying(50),
|
||||||
|
hook_ip character varying(50),
|
||||||
|
sdp_ip character varying(50),
|
||||||
|
stream_ip character varying(50),
|
||||||
|
http_port integer,
|
||||||
|
http_ssl_port integer,
|
||||||
|
rtmp_port integer,
|
||||||
|
rtmp_ssl_port integer,
|
||||||
|
rtp_proxy_port integer,
|
||||||
|
rtsp_port integer,
|
||||||
|
rtsp_ssl_port integer,
|
||||||
|
auto_config bool default false,
|
||||||
|
secret character varying(50),
|
||||||
|
rtp_enable bool default false,
|
||||||
|
rtp_port_range character varying(50),
|
||||||
|
send_rtp_port_range character varying(50),
|
||||||
|
record_assist_port integer,
|
||||||
|
default_server bool default false,
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50),
|
||||||
|
hook_alive_interval integer,
|
||||||
|
record_path character varying(255),
|
||||||
|
record_day integer default 7,
|
||||||
|
constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_platform (
|
||||||
|
id serial primary key ,
|
||||||
|
enable bool default false,
|
||||||
|
name character varying(255),
|
||||||
|
server_gb_id character varying(50),
|
||||||
|
server_gb_domain character varying(50),
|
||||||
|
server_ip character varying(50),
|
||||||
|
server_port integer,
|
||||||
|
device_gb_id character varying(50),
|
||||||
|
device_ip character varying(50),
|
||||||
|
device_port character varying(50),
|
||||||
|
username character varying(255),
|
||||||
|
password character varying(50),
|
||||||
|
expires character varying(50),
|
||||||
|
keep_timeout character varying(50),
|
||||||
|
transport character varying(50),
|
||||||
|
character_set character varying(50),
|
||||||
|
catalog_id character varying(50),
|
||||||
|
ptz bool default false,
|
||||||
|
rtcp bool default false,
|
||||||
|
status bool default false,
|
||||||
|
start_offline_push bool default false,
|
||||||
|
administrative_division character varying(50),
|
||||||
|
catalog_group integer,
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50),
|
||||||
|
as_message_channel bool default false,
|
||||||
|
auto_push_channel bool default false,
|
||||||
|
constraint uk_platform_unique_server_gb_id unique (server_gb_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_platform_catalog (
|
||||||
|
id character varying(50),
|
||||||
|
platform_id character varying(50),
|
||||||
|
name character varying(255),
|
||||||
|
parent_id character varying(50),
|
||||||
|
civil_code character varying(50),
|
||||||
|
business_group_id character varying(50),
|
||||||
|
constraint uk_platform_catalog_id_platform_id unique (id, platform_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_platform_gb_channel (
|
||||||
|
id serial primary key ,
|
||||||
|
platform_id character varying(50),
|
||||||
|
catalog_id character varying(50),
|
||||||
|
device_channel_id integer,
|
||||||
|
constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, catalog_id, device_channel_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_platform_gb_stream (
|
||||||
|
id serial primary key,
|
||||||
|
platform_id character varying(50),
|
||||||
|
catalog_id character varying(50),
|
||||||
|
gb_stream_id integer,
|
||||||
|
constraint uk_platform_gb_stream_platform_id_catalog_id_gb_stream_id unique (platform_id, catalog_id, gb_stream_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_stream_proxy (
|
||||||
|
id serial primary key,
|
||||||
|
type character varying(50),
|
||||||
|
app character varying(255),
|
||||||
|
stream character varying(255),
|
||||||
|
url character varying(255),
|
||||||
|
src_url character varying(255),
|
||||||
|
dst_url character varying(255),
|
||||||
|
timeout_ms integer,
|
||||||
|
ffmpeg_cmd_key character varying(255),
|
||||||
|
rtp_type character varying(50),
|
||||||
|
media_server_id character varying(50),
|
||||||
|
enable_audio bool default false,
|
||||||
|
enable_mp4 bool default false,
|
||||||
|
enable bool default false,
|
||||||
|
status boolean,
|
||||||
|
enable_remove_none_reader bool default false,
|
||||||
|
create_time character varying(50),
|
||||||
|
name character varying(255),
|
||||||
|
update_time character varying(50),
|
||||||
|
stream_key character varying(255),
|
||||||
|
enable_disable_none_reader bool default false,
|
||||||
|
constraint uk_stream_proxy_app_stream unique (app, stream)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_stream_push (
|
||||||
|
id serial primary key,
|
||||||
|
app character varying(255),
|
||||||
|
stream character varying(255),
|
||||||
|
total_reader_count character varying(50),
|
||||||
|
origin_type integer,
|
||||||
|
origin_type_str character varying(50),
|
||||||
|
create_time character varying(50),
|
||||||
|
alive_second integer,
|
||||||
|
media_server_id character varying(50),
|
||||||
|
server_id character varying(50),
|
||||||
|
push_time character varying(50),
|
||||||
|
status bool default false,
|
||||||
|
update_time character varying(50),
|
||||||
|
push_ing bool default false,
|
||||||
|
self bool default false,
|
||||||
|
constraint uk_stream_push_app_stream unique (app, stream)
|
||||||
|
);
|
||||||
|
create table wvp_cloud_record (
|
||||||
|
id serial primary key,
|
||||||
|
app character varying(255),
|
||||||
|
stream character varying(255),
|
||||||
|
call_id character varying(255),
|
||||||
|
start_time bigint,
|
||||||
|
end_time bigint,
|
||||||
|
media_server_id character varying(50),
|
||||||
|
file_name character varying(255),
|
||||||
|
folder character varying(255),
|
||||||
|
file_path character varying(255),
|
||||||
|
collect bool default false,
|
||||||
|
file_size bigint,
|
||||||
|
time_len bigint,
|
||||||
|
constraint uk_stream_push_app_stream_path unique (app, stream, file_path)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_user (
|
||||||
|
id serial primary key,
|
||||||
|
username character varying(255),
|
||||||
|
password character varying(255),
|
||||||
|
role_id integer,
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50),
|
||||||
|
push_key character varying(50),
|
||||||
|
constraint uk_user_username unique (username)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_user_role (
|
||||||
|
id serial primary key,
|
||||||
|
name character varying(50),
|
||||||
|
authority character varying(50),
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50)
|
||||||
|
);
|
||||||
|
create table wvp_resources_tree (
|
||||||
|
id serial primary key ,
|
||||||
|
is_catalog bool default true,
|
||||||
|
device_channel_id integer ,
|
||||||
|
gb_stream_id integer,
|
||||||
|
name character varying(255),
|
||||||
|
parentId integer,
|
||||||
|
path character varying(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/*初始数据*/
|
||||||
|
INSERT INTO wvp_user VALUES (1, 'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021-04-13 14:14:57','2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3');
|
||||||
|
INSERT INTO wvp_user_role VALUES (1, 'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57');
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,324 @@
|
||||||
|
/*建表*/
|
||||||
|
create table wvp_device (
|
||||||
|
id serial primary key ,
|
||||||
|
device_id character varying(50) not null ,
|
||||||
|
name character varying(255),
|
||||||
|
manufacturer character varying(255),
|
||||||
|
model character varying(255),
|
||||||
|
firmware character varying(255),
|
||||||
|
transport character varying(50),
|
||||||
|
stream_mode character varying(50),
|
||||||
|
on_line bool default false,
|
||||||
|
register_time character varying(50),
|
||||||
|
keepalive_time character varying(50),
|
||||||
|
ip character varying(50),
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50),
|
||||||
|
port integer,
|
||||||
|
expires integer,
|
||||||
|
subscribe_cycle_for_catalog integer DEFAULT 0,
|
||||||
|
subscribe_cycle_for_mobile_position integer DEFAULT 0,
|
||||||
|
mobile_position_submission_interval integer DEFAULT 5,
|
||||||
|
subscribe_cycle_for_alarm integer DEFAULT 0,
|
||||||
|
host_address character varying(50),
|
||||||
|
charset character varying(50),
|
||||||
|
ssrc_check bool default false,
|
||||||
|
geo_coord_sys character varying(50),
|
||||||
|
media_server_id character varying(50),
|
||||||
|
custom_name character varying(255),
|
||||||
|
sdp_ip character varying(50),
|
||||||
|
local_ip character varying(50),
|
||||||
|
password character varying(255),
|
||||||
|
as_message_channel bool default false,
|
||||||
|
keepalive_interval_time integer,
|
||||||
|
switch_primary_sub_stream bool default false,
|
||||||
|
broadcast_push_after_ack bool default false,
|
||||||
|
constraint uk_device_device unique (device_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_device_alarm (
|
||||||
|
id serial primary key ,
|
||||||
|
device_id character varying(50) not null,
|
||||||
|
channel_id character varying(50) not null,
|
||||||
|
alarm_priority character varying(50),
|
||||||
|
alarm_method character varying(50),
|
||||||
|
alarm_time character varying(50),
|
||||||
|
alarm_description character varying(255),
|
||||||
|
longitude double precision,
|
||||||
|
latitude double precision,
|
||||||
|
alarm_type character varying(50),
|
||||||
|
create_time character varying(50) not null
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_device_channel (
|
||||||
|
id serial primary key ,
|
||||||
|
channel_id character varying(50) not null,
|
||||||
|
name character varying(255),
|
||||||
|
custom_name character varying(255),
|
||||||
|
manufacture character varying(50),
|
||||||
|
model character varying(50),
|
||||||
|
owner character varying(50),
|
||||||
|
civil_code character varying(50),
|
||||||
|
block character varying(50),
|
||||||
|
address character varying(50),
|
||||||
|
parent_id character varying(50),
|
||||||
|
safety_way integer,
|
||||||
|
register_way integer,
|
||||||
|
cert_num character varying(50),
|
||||||
|
certifiable integer,
|
||||||
|
err_code integer,
|
||||||
|
end_time character varying(50),
|
||||||
|
secrecy character varying(50),
|
||||||
|
ip_address character varying(50),
|
||||||
|
port integer,
|
||||||
|
password character varying(255),
|
||||||
|
ptz_type integer,
|
||||||
|
custom_ptz_type integer,
|
||||||
|
status bool default false,
|
||||||
|
longitude double precision,
|
||||||
|
custom_longitude double precision,
|
||||||
|
latitude double precision,
|
||||||
|
custom_latitude double precision,
|
||||||
|
stream_id character varying(255),
|
||||||
|
device_id character varying(50) not null,
|
||||||
|
parental character varying(50),
|
||||||
|
has_audio bool default false,
|
||||||
|
create_time character varying(50) not null,
|
||||||
|
update_time character varying(50) not null,
|
||||||
|
sub_count integer,
|
||||||
|
longitude_gcj02 double precision,
|
||||||
|
latitude_gcj02 double precision,
|
||||||
|
longitude_wgs84 double precision,
|
||||||
|
latitude_wgs84 double precision,
|
||||||
|
business_group_id character varying(50),
|
||||||
|
gps_time character varying(50),
|
||||||
|
stream_identification character varying(50),
|
||||||
|
constraint uk_wvp_device_channel_unique_device_channel unique (device_id, channel_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_device_mobile_position (
|
||||||
|
id serial primary key,
|
||||||
|
device_id character varying(50) not null,
|
||||||
|
channel_id character varying(50) not null,
|
||||||
|
device_name character varying(255),
|
||||||
|
time character varying(50),
|
||||||
|
longitude double precision,
|
||||||
|
latitude double precision,
|
||||||
|
altitude double precision,
|
||||||
|
speed double precision,
|
||||||
|
direction double precision,
|
||||||
|
report_source character varying(50),
|
||||||
|
longitude_gcj02 double precision,
|
||||||
|
latitude_gcj02 double precision,
|
||||||
|
longitude_wgs84 double precision,
|
||||||
|
latitude_wgs84 double precision,
|
||||||
|
create_time character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_gb_stream (
|
||||||
|
gb_stream_id serial primary key,
|
||||||
|
app character varying(255) not null,
|
||||||
|
stream character varying(255) not null,
|
||||||
|
gb_id character varying(50) not null,
|
||||||
|
name character varying(255),
|
||||||
|
longitude double precision,
|
||||||
|
latitude double precision,
|
||||||
|
stream_type character varying(50),
|
||||||
|
media_server_id character varying(50),
|
||||||
|
create_time character varying(50),
|
||||||
|
constraint uk_gb_stream_unique_gb_id unique (gb_id),
|
||||||
|
constraint uk_gb_stream_unique_app_stream unique (app, stream)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_log (
|
||||||
|
id serial primary key ,
|
||||||
|
name character varying(50),
|
||||||
|
type character varying(50),
|
||||||
|
uri character varying(200),
|
||||||
|
address character varying(50),
|
||||||
|
result character varying(50),
|
||||||
|
timing bigint,
|
||||||
|
username character varying(50),
|
||||||
|
create_time character varying(50)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_media_server (
|
||||||
|
id character varying(255) primary key ,
|
||||||
|
ip character varying(50),
|
||||||
|
hook_ip character varying(50),
|
||||||
|
sdp_ip character varying(50),
|
||||||
|
stream_ip character varying(50),
|
||||||
|
http_port integer,
|
||||||
|
http_ssl_port integer,
|
||||||
|
rtmp_port integer,
|
||||||
|
rtmp_ssl_port integer,
|
||||||
|
rtp_proxy_port integer,
|
||||||
|
rtsp_port integer,
|
||||||
|
rtsp_ssl_port integer,
|
||||||
|
auto_config bool default false,
|
||||||
|
secret character varying(50),
|
||||||
|
rtp_enable bool default false,
|
||||||
|
rtp_port_range character varying(50),
|
||||||
|
send_rtp_port_range character varying(50),
|
||||||
|
record_assist_port integer,
|
||||||
|
default_server bool default false,
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50),
|
||||||
|
hook_alive_interval integer,
|
||||||
|
record_path character varying(255),
|
||||||
|
record_day integer default 7,
|
||||||
|
constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_platform (
|
||||||
|
id serial primary key ,
|
||||||
|
enable bool default false,
|
||||||
|
name character varying(255),
|
||||||
|
server_gb_id character varying(50),
|
||||||
|
server_gb_domain character varying(50),
|
||||||
|
server_ip character varying(50),
|
||||||
|
server_port integer,
|
||||||
|
device_gb_id character varying(50),
|
||||||
|
device_ip character varying(50),
|
||||||
|
device_port character varying(50),
|
||||||
|
username character varying(255),
|
||||||
|
password character varying(50),
|
||||||
|
expires character varying(50),
|
||||||
|
keep_timeout character varying(50),
|
||||||
|
transport character varying(50),
|
||||||
|
character_set character varying(50),
|
||||||
|
catalog_id character varying(50),
|
||||||
|
ptz bool default false,
|
||||||
|
rtcp bool default false,
|
||||||
|
status bool default false,
|
||||||
|
start_offline_push bool default false,
|
||||||
|
administrative_division character varying(50),
|
||||||
|
catalog_group integer,
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50),
|
||||||
|
as_message_channel bool default false,
|
||||||
|
auto_push_channel bool default false,
|
||||||
|
constraint uk_platform_unique_server_gb_id unique (server_gb_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_platform_catalog (
|
||||||
|
id character varying(50),
|
||||||
|
platform_id character varying(50),
|
||||||
|
name character varying(255),
|
||||||
|
parent_id character varying(50),
|
||||||
|
civil_code character varying(50),
|
||||||
|
business_group_id character varying(50),
|
||||||
|
constraint uk_platform_catalog_id_platform_id unique (id, platform_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_platform_gb_channel (
|
||||||
|
id serial primary key ,
|
||||||
|
platform_id character varying(50),
|
||||||
|
catalog_id character varying(50),
|
||||||
|
device_channel_id integer,
|
||||||
|
constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, catalog_id, device_channel_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_platform_gb_stream (
|
||||||
|
id serial primary key,
|
||||||
|
platform_id character varying(50),
|
||||||
|
catalog_id character varying(50),
|
||||||
|
gb_stream_id integer,
|
||||||
|
constraint uk_platform_gb_stream_platform_id_catalog_id_gb_stream_id unique (platform_id, catalog_id, gb_stream_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_stream_proxy (
|
||||||
|
id serial primary key,
|
||||||
|
type character varying(50),
|
||||||
|
app character varying(255),
|
||||||
|
stream character varying(255),
|
||||||
|
url character varying(255),
|
||||||
|
src_url character varying(255),
|
||||||
|
dst_url character varying(255),
|
||||||
|
timeout_ms integer,
|
||||||
|
ffmpeg_cmd_key character varying(255),
|
||||||
|
rtp_type character varying(50),
|
||||||
|
media_server_id character varying(50),
|
||||||
|
enable_audio bool default false,
|
||||||
|
enable_mp4 bool default false,
|
||||||
|
enable bool default false,
|
||||||
|
status boolean,
|
||||||
|
enable_remove_none_reader bool default false,
|
||||||
|
create_time character varying(50),
|
||||||
|
name character varying(255),
|
||||||
|
update_time character varying(50),
|
||||||
|
stream_key character varying(255),
|
||||||
|
enable_disable_none_reader bool default false,
|
||||||
|
constraint uk_stream_proxy_app_stream unique (app, stream)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_stream_push (
|
||||||
|
id serial primary key,
|
||||||
|
app character varying(255),
|
||||||
|
stream character varying(255),
|
||||||
|
total_reader_count character varying(50),
|
||||||
|
origin_type integer,
|
||||||
|
origin_type_str character varying(50),
|
||||||
|
create_time character varying(50),
|
||||||
|
alive_second integer,
|
||||||
|
media_server_id character varying(50),
|
||||||
|
server_id character varying(50),
|
||||||
|
push_time character varying(50),
|
||||||
|
status bool default false,
|
||||||
|
update_time character varying(50),
|
||||||
|
push_ing bool default false,
|
||||||
|
self bool default false,
|
||||||
|
constraint uk_stream_push_app_stream unique (app, stream)
|
||||||
|
);
|
||||||
|
create table wvp_cloud_record (
|
||||||
|
id serial primary key,
|
||||||
|
app character varying(255),
|
||||||
|
stream character varying(255),
|
||||||
|
call_id character varying(255),
|
||||||
|
start_time int8,
|
||||||
|
end_time int8,
|
||||||
|
media_server_id character varying(50),
|
||||||
|
file_name character varying(255),
|
||||||
|
folder character varying(255),
|
||||||
|
file_path character varying(255),
|
||||||
|
collect bool default false,
|
||||||
|
file_size int8,
|
||||||
|
time_len int8,
|
||||||
|
constraint uk_stream_push_app_stream_path unique (app, stream, file_path)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_user (
|
||||||
|
id serial primary key,
|
||||||
|
username character varying(255),
|
||||||
|
password character varying(255),
|
||||||
|
role_id integer,
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50),
|
||||||
|
push_key character varying(50),
|
||||||
|
constraint uk_user_username unique (username)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table wvp_user_role (
|
||||||
|
id serial primary key,
|
||||||
|
name character varying(50),
|
||||||
|
authority character varying(50),
|
||||||
|
create_time character varying(50),
|
||||||
|
update_time character varying(50)
|
||||||
|
);
|
||||||
|
create table wvp_resources_tree (
|
||||||
|
id serial primary key ,
|
||||||
|
is_catalog bool default true,
|
||||||
|
device_channel_id integer ,
|
||||||
|
gb_stream_id integer,
|
||||||
|
name character varying(255),
|
||||||
|
parentId integer,
|
||||||
|
path character varying(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/*初始数据*/
|
||||||
|
INSERT INTO wvp_user VALUES (1, 'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021-04-13 14:14:57','2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3');
|
||||||
|
INSERT INTO wvp_user_role VALUES (1, 'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57');
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
alter table wvp_device_channel
|
||||||
|
add stream_identification character varying(50);
|
||||||
|
|
||||||
|
alter table wvp_device
|
||||||
|
drop switch_primary_sub_stream;
|
|
@ -0,0 +1,5 @@
|
||||||
|
alter table wvp_device_channel
|
||||||
|
add stream_identification character varying(50);
|
||||||
|
|
||||||
|
alter table wvp_device
|
||||||
|
drop switch_primary_sub_stream;
|
Loading…
Reference in New Issue