ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DeviceInfo.java
New file @@ -0,0 +1,30 @@ package com.ycl.platform.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.ycl.platform.base.AbsEntity; import lombok.Data; /** * 国标级联同步数据 * * @author xp * @since 2024-08-21 */ @Data @TableName("t_device_info") public class DeviceInfo extends AbsEntity { private static final long serialVersionUID = 1L; @TableField("device_id") /** 设备编号/国标码 */ private String deviceId; @TableField("channel_id") /** 设备通道ID */ private String channelId; } ycl-pojo/src/main/java/com/ycl/platform/domain/entity/WorkOrder.java
@@ -66,6 +66,10 @@ @TableField("yw_condition") private String ywCondition; @ApiModelProperty("运维检测情况/一张图") @TableField("yw_check_condition") private String ywCheckCondition; @ApiModelProperty("处理期限") @TableField("processing_period") private Integer processingPeriod; ycl-pojo/src/main/java/com/ycl/platform/domain/form/DeviceInfoForm.java
New file @@ -0,0 +1,18 @@ package com.ycl.platform.domain.form; import com.ycl.platform.base.AbsForm; import io.swagger.annotations.ApiModel; import lombok.Data; /** * 国标级联同步数据表单 * * @author xp * @since 2024-08-21 */ @Data @ApiModel(value = "DeviceInfo表单", description = "国标级联同步数据表单") public class DeviceInfoForm extends AbsForm { } ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DeviceInfoVO.java
New file @@ -0,0 +1,39 @@ package com.ycl.platform.domain.vo; import com.ycl.platform.base.AbsVo; import com.ycl.platform.domain.entity.DeviceInfo; import org.springframework.lang.NonNull; import org.springframework.beans.BeanUtils; import lombok.Data; import java.util.Date; /** * 国标级联同步数据展示 * * @author xp * @since 2024-08-21 */ @Data public class DeviceInfoVO extends AbsVo { /** 工单ID */ private Integer workOrderId; /** 设备编号/国标码 */ private String deviceId; /** 设备通道ID */ private String channelId; /** 创建时间 */ private Date createTime; public static DeviceInfoVO getVoByEntity(@NonNull DeviceInfo entity, DeviceInfoVO vo) { if(vo == null) { vo = new DeviceInfoVO(); } BeanUtils.copyProperties(entity, vo); return vo; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/DownloadFileInfo.java
New file @@ -0,0 +1,41 @@ package com.ycl.platform.wvp; public class DownloadFileInfo { private String httpPath; private String httpsPath; private String httpDomainPath; private String httpsDomainPath; public String getHttpPath() { return httpPath; } public void setHttpPath(String httpPath) { this.httpPath = httpPath; } public String getHttpsPath() { return httpsPath; } public void setHttpsPath(String httpsPath) { this.httpsPath = httpsPath; } public String getHttpDomainPath() { return httpDomainPath; } public void setHttpDomainPath(String httpDomainPath) { this.httpDomainPath = httpDomainPath; } public String getHttpsDomainPath() { return httpsDomainPath; } public void setHttpsDomainPath(String httpsDomainPath) { this.httpsDomainPath = httpsDomainPath; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/ErrorCode.java
New file @@ -0,0 +1,30 @@ package com.ycl.platform.wvp; /** * 全局错误码 */ public enum ErrorCode { SUCCESS(0, "成功"), ERROR100(100, "失败"), ERROR400(400, "参数或方法错误"), ERROR404(404, "资源未找到"), ERROR403(403, "无权限操作"), ERROR401(401, "请登录后重新请求"), ERROR500(500, "系统异常"); private final int code; private final String msg; ErrorCode(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public String getMsg() { return msg; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/HookParam.java
New file @@ -0,0 +1,19 @@ package com.ycl.platform.wvp; /** * zlm hook事件的参数 * @author lin */ public class HookParam { private String mediaServerId; public String getMediaServerId() { return mediaServerId; } public void setMediaServerId(String mediaServerId) { this.mediaServerId = mediaServerId; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/MediaInfo.java
New file @@ -0,0 +1,315 @@ package com.ycl.platform.wvp; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; /** * 视频信息 */ @Schema(description = "视频信息") public class MediaInfo { @Schema(description = "应用名") private String app; @Schema(description = "流ID") private String stream; @Schema(description = "流媒体节点") private MediaServer mediaServer; @Schema(description = "协议") private String schema; @Schema(description = "观看人数") private Integer readerCount; @Schema(description = "视频编码类型") private String videoCodec; @Schema(description = "视频宽度") private Integer width; @Schema(description = "视频高度") private Integer height; @Schema(description = "音频编码类型") private String audioCodec; @Schema(description = "音频通道数") private Integer audioChannels; @Schema(description = "音频采样率") private Integer audioSampleRate; @Schema(description = "音频采样率") private Long duration; @Schema(description = "在线") private Boolean online; @Schema(description = "unknown = 0,rtmp_push=1,rtsp_push=2,rtp_push=3,pull=4,ffmpeg_pull=5,mp4_vod=6,device_chn=7") private Integer originType; @Schema(description = "存活时间,单位秒") private Long aliveSecond; @Schema(description = "数据产生速度,单位byte/s") private Long bytesSpeed; @Schema(description = "鉴权参数") private String callId; public static MediaInfo getInstance(JSONObject jsonObject, MediaServer mediaServer) { MediaInfo mediaInfo = new MediaInfo(); mediaInfo.setMediaServer(mediaServer); String app = jsonObject.getString("app"); mediaInfo.setApp(app); String stream = jsonObject.getString("stream"); mediaInfo.setStream(stream); String schema = jsonObject.getString("schema"); mediaInfo.setSchema(schema); Integer totalReaderCount = jsonObject.getInteger("totalReaderCount"); Boolean online = jsonObject.getBoolean("online"); Integer originType = jsonObject.getInteger("originType"); Long aliveSecond = jsonObject.getLong("aliveSecond"); Long bytesSpeed = jsonObject.getLong("bytesSpeed"); if (totalReaderCount != null) { mediaInfo.setReaderCount(totalReaderCount); } if (online != null) { mediaInfo.setOnline(online); } if (originType != null) { mediaInfo.setOriginType(originType); } if (aliveSecond != null) { mediaInfo.setAliveSecond(aliveSecond); } if (bytesSpeed != null) { mediaInfo.setBytesSpeed(bytesSpeed); } JSONArray jsonArray = jsonObject.getJSONArray("tracks"); if (jsonArray.isEmpty()) { return null; } for (int i = 0; i < jsonArray.size(); i++) { JSONObject trackJson = jsonArray.getJSONObject(i); Integer channels = trackJson.getInteger("channels"); Integer codecId = trackJson.getInteger("codec_id"); Integer codecType = trackJson.getInteger("codec_type"); Integer sampleRate = trackJson.getInteger("sample_rate"); Integer height = trackJson.getInteger("height"); Integer width = trackJson.getInteger("height"); Long duration = trackJson.getLongValue("duration"); if (channels != null) { mediaInfo.setAudioChannels(channels); } if (sampleRate != null) { mediaInfo.setAudioSampleRate(sampleRate); } if (height != null) { mediaInfo.setHeight(height); } if (width != null) { mediaInfo.setWidth(width); } if (duration > 0L) { mediaInfo.setDuration(duration); } if (codecId != null) { switch (codecId) { case 0: mediaInfo.setVideoCodec("H264"); break; case 1: mediaInfo.setVideoCodec("H265"); break; case 2: mediaInfo.setAudioCodec("AAC"); break; case 3: mediaInfo.setAudioCodec("G711A"); break; case 4: mediaInfo.setAudioCodec("G711U"); break; } } } return mediaInfo; } public static MediaInfo getInstance(OnStreamChangedHookParam param, MediaServer mediaServer) { MediaInfo mediaInfo = new MediaInfo(); mediaInfo.setApp(param.getApp()); mediaInfo.setStream(param.getStream()); mediaInfo.setSchema(param.getSchema()); mediaInfo.setMediaServer(mediaServer); mediaInfo.setReaderCount(param.getTotalReaderCount()); mediaInfo.setOnline(param.isRegist()); mediaInfo.setOriginType(param.getOriginType()); mediaInfo.setAliveSecond(param.getAliveSecond()); mediaInfo.setBytesSpeed(param.getBytesSpeed()); List<OnStreamChangedHookParam.MediaTrack> tracks = param.getTracks(); if (tracks == null || tracks.isEmpty()) { return mediaInfo; } for (OnStreamChangedHookParam.MediaTrack mediaTrack : tracks) { switch (mediaTrack.getCodec_id()) { case 0: mediaInfo.setVideoCodec("H264"); break; case 1: mediaInfo.setVideoCodec("H265"); break; case 2: mediaInfo.setAudioCodec("AAC"); break; case 3: mediaInfo.setAudioCodec("G711A"); break; case 4: mediaInfo.setAudioCodec("G711U"); break; } if (mediaTrack.getSample_rate() > 0) { mediaInfo.setAudioSampleRate(mediaTrack.getSample_rate()); } if (mediaTrack.getChannels() > 0) { mediaInfo.setAudioChannels(mediaTrack.getChannels()); } if (mediaTrack.getHeight() > 0) { mediaInfo.setHeight(mediaTrack.getHeight()); } if (mediaTrack.getWidth() > 0) { mediaInfo.setWidth(mediaTrack.getWidth()); } } return mediaInfo; } public Integer getReaderCount() { return readerCount; } public void setReaderCount(Integer readerCount) { this.readerCount = readerCount; } public String getVideoCodec() { return videoCodec; } public void setVideoCodec(String videoCodec) { this.videoCodec = videoCodec; } public Integer getWidth() { return width; } public void setWidth(Integer width) { this.width = width; } public Integer getHeight() { return height; } public void setHeight(Integer height) { this.height = height; } public String getAudioCodec() { return audioCodec; } public void setAudioCodec(String audioCodec) { this.audioCodec = audioCodec; } public Integer getAudioChannels() { return audioChannels; } public void setAudioChannels(Integer audioChannels) { this.audioChannels = audioChannels; } public Integer getAudioSampleRate() { return audioSampleRate; } public void setAudioSampleRate(Integer audioSampleRate) { this.audioSampleRate = audioSampleRate; } public Long getDuration() { return duration; } public void setDuration(Long duration) { this.duration = duration; } public Boolean getOnline() { return online; } public void setOnline(Boolean online) { this.online = online; } public Integer getOriginType() { return originType; } public void setOriginType(Integer originType) { this.originType = originType; } public Long getAliveSecond() { return aliveSecond; } public void setAliveSecond(Long aliveSecond) { this.aliveSecond = aliveSecond; } public Long getBytesSpeed() { return bytesSpeed; } public void setBytesSpeed(Long bytesSpeed) { this.bytesSpeed = bytesSpeed; } public String getApp() { return app; } public void setApp(String app) { this.app = app; } public String getStream() { return stream; } public void setStream(String stream) { this.stream = stream; } public MediaServer getMediaServer() { return mediaServer; } public void setMediaServer(MediaServer mediaServer) { this.mediaServer = mediaServer; } public String getSchema() { return schema; } public void setSchema(String schema) { this.schema = schema; } public String getCallId() { return callId; } public void setCallId(String callId) { this.callId = callId; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/MediaServer.java
New file @@ -0,0 +1,390 @@ package com.ycl.platform.wvp; import io.swagger.v3.oas.annotations.media.Schema; import org.springframework.util.ObjectUtils; @Schema(description = "流媒体服务信息") public class MediaServer { @Schema(description = "ID") private String id; @Schema(description = "IP") private String ip; @Schema(description = "hook使用的IP(zlm访问WVP使用的IP)") private String hookIp = "127.0.0.1"; @Schema(description = "SDP IP") private String sdpIp; @Schema(description = "流IP") private String streamIp; @Schema(description = "HTTP端口") private int httpPort; @Schema(description = "HTTPS端口") private int httpSSlPort; @Schema(description = "RTMP端口") private int rtmpPort; @Schema(description = "flv端口") private int flvPort; @Schema(description = "https-flv端口") private int flvSSLPort; @Schema(description = "ws-flv端口") private int wsFlvPort; @Schema(description = "wss-flv端口") private int wsFlvSSLPort; @Schema(description = "RTMPS端口") private int rtmpSSlPort; @Schema(description = "RTP收流端口(单端口模式有用)") private int rtpProxyPort; @Schema(description = "RTSP端口") private int rtspPort; @Schema(description = "RTSPS端口") private int rtspSSLPort; @Schema(description = "是否开启自动配置ZLM") private boolean autoConfig; @Schema(description = "ZLM鉴权参数") private String secret; @Schema(description = "keepalive hook触发间隔,单位秒") private Float hookAliveInterval; @Schema(description = "是否使用多端口模式") private boolean rtpEnable; @Schema(description = "状态") private boolean status; @Schema(description = "多端口RTP收流端口范围") private String rtpPortRange; @Schema(description = "RTP发流端口范围") private String sendRtpPortRange; @Schema(description = "assist服务端口") private int recordAssistPort; @Schema(description = "创建时间") private String createTime; @Schema(description = "更新时间") private String updateTime; @Schema(description = "上次心跳时间") private String lastKeepaliveTime; @Schema(description = "是否是默认ZLM") private boolean defaultServer; @Schema(description = "录像存储时长") private int recordDay; @Schema(description = "录像存储路径") private String recordPath; @Schema(description = "类型: zlm/abl") private String type; @Schema(description = "转码的前缀") private String transcodeSuffix; public MediaServer() { } public MediaServer(ZLMServerConfig zlmServerConfig, String sipIp) { id = zlmServerConfig.getGeneralMediaServerId(); ip = zlmServerConfig.getIp(); hookIp = ObjectUtils.isEmpty(zlmServerConfig.getHookIp())? sipIp: zlmServerConfig.getHookIp(); sdpIp = ObjectUtils.isEmpty(zlmServerConfig.getSdpIp())? zlmServerConfig.getIp(): zlmServerConfig.getSdpIp(); streamIp = ObjectUtils.isEmpty(zlmServerConfig.getStreamIp())? zlmServerConfig.getIp(): zlmServerConfig.getStreamIp(); httpPort = zlmServerConfig.getHttpPort(); flvPort = zlmServerConfig.getHttpPort(); wsFlvPort = zlmServerConfig.getHttpPort(); httpSSlPort = zlmServerConfig.getHttpSSLport(); flvSSLPort = zlmServerConfig.getHttpSSLport(); wsFlvSSLPort = zlmServerConfig.getHttpSSLport(); rtmpPort = zlmServerConfig.getRtmpPort(); rtmpSSlPort = zlmServerConfig.getRtmpSslPort(); rtpProxyPort = zlmServerConfig.getRtpProxyPort(); rtspPort = zlmServerConfig.getRtspPort(); rtspSSLPort = zlmServerConfig.getRtspSSlport(); autoConfig = true; // 默认值true; secret = zlmServerConfig.getApiSecret(); hookAliveInterval = zlmServerConfig.getHookAliveInterval(); rtpEnable = false; // 默认使用单端口;直到用户自己设置开启多端口 rtpPortRange = zlmServerConfig.getPortRange().replace("_",","); // 默认使用30000,30500作为级联时发送流的端口号 recordAssistPort = 0; // 默认关闭 transcodeSuffix = zlmServerConfig.getTranscodeSuffix(); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getHookIp() { return hookIp; } public void setHookIp(String hookIp) { this.hookIp = hookIp; } public String getSdpIp() { return sdpIp; } public void setSdpIp(String sdpIp) { this.sdpIp = sdpIp; } public String getStreamIp() { return streamIp; } public void setStreamIp(String streamIp) { this.streamIp = streamIp; } public int getHttpPort() { return httpPort; } public void setHttpPort(int httpPort) { this.httpPort = httpPort; } public int getHttpSSlPort() { return httpSSlPort; } public void setHttpSSlPort(int httpSSlPort) { this.httpSSlPort = httpSSlPort; } public int getRtmpPort() { return rtmpPort; } public void setRtmpPort(int rtmpPort) { this.rtmpPort = rtmpPort; } public int getRtmpSSlPort() { return rtmpSSlPort; } public void setRtmpSSlPort(int rtmpSSlPort) { this.rtmpSSlPort = rtmpSSlPort; } public int getRtpProxyPort() { return rtpProxyPort; } public void setRtpProxyPort(int rtpProxyPort) { this.rtpProxyPort = rtpProxyPort; } public int getRtspPort() { return rtspPort; } public void setRtspPort(int rtspPort) { this.rtspPort = rtspPort; } public int getRtspSSLPort() { return rtspSSLPort; } public void setRtspSSLPort(int rtspSSLPort) { this.rtspSSLPort = rtspSSLPort; } public boolean isAutoConfig() { return autoConfig; } public void setAutoConfig(boolean autoConfig) { this.autoConfig = autoConfig; } public String getSecret() { return secret; } public void setSecret(String secret) { this.secret = secret; } public boolean isRtpEnable() { return rtpEnable; } public void setRtpEnable(boolean rtpEnable) { this.rtpEnable = rtpEnable; } public String getRtpPortRange() { return rtpPortRange; } public void setRtpPortRange(String rtpPortRange) { this.rtpPortRange = rtpPortRange; } public int getRecordAssistPort() { return recordAssistPort; } public void setRecordAssistPort(int recordAssistPort) { this.recordAssistPort = recordAssistPort; } public boolean isDefaultServer() { return defaultServer; } public void setDefaultServer(boolean defaultServer) { this.defaultServer = defaultServer; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } public String getUpdateTime() { return updateTime; } public void setUpdateTime(String updateTime) { this.updateTime = updateTime; } public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } public String getLastKeepaliveTime() { return lastKeepaliveTime; } public void setLastKeepaliveTime(String lastKeepaliveTime) { this.lastKeepaliveTime = lastKeepaliveTime; } public Float getHookAliveInterval() { return hookAliveInterval; } public void setHookAliveInterval(Float hookAliveInterval) { this.hookAliveInterval = hookAliveInterval; } public String getSendRtpPortRange() { return sendRtpPortRange; } public void setSendRtpPortRange(String sendRtpPortRange) { this.sendRtpPortRange = sendRtpPortRange; } public int getRecordDay() { return recordDay; } public void setRecordDay(int recordDay) { this.recordDay = recordDay; } public String getRecordPath() { return recordPath; } public void setRecordPath(String recordPath) { this.recordPath = recordPath; } public String getType() { return type; } public void setType(String type) { this.type = type; } public int getFlvPort() { return flvPort; } public void setFlvPort(int flvPort) { this.flvPort = flvPort; } public int getFlvSSLPort() { return flvSSLPort; } public void setFlvSSLPort(int flvSSLPort) { this.flvSSLPort = flvSSLPort; } public int getWsFlvPort() { return wsFlvPort; } public void setWsFlvPort(int wsFlvPort) { this.wsFlvPort = wsFlvPort; } public int getWsFlvSSLPort() { return wsFlvSSLPort; } public void setWsFlvSSLPort(int wsFlvSSLPort) { this.wsFlvSSLPort = wsFlvSSLPort; } public String getTranscodeSuffix() { return transcodeSuffix; } public void setTranscodeSuffix(String transcodeSuffix) { this.transcodeSuffix = transcodeSuffix; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/OnStreamChangedHookParam.java
New file @@ -0,0 +1,534 @@ package com.ycl.platform.wvp; import java.util.List; import java.util.Map; /** * @author lin */ public class OnStreamChangedHookParam extends HookParam { /** * 注册/注销 */ private boolean regist; /** * 应用名 */ private String app; /** * 流id */ private String stream; /** * 推流鉴权Id */ private String callId; /** * 观看总人数,包括hls/rtsp/rtmp/http-flv/ws-flv */ private int totalReaderCount; /** * 协议 包括hls/rtsp/rtmp/http-flv/ws-flv */ private String schema; /** * 产生源类型, * unknown = 0, * rtmp_push=1, * rtsp_push=2, * rtp_push=3, * pull=4, * ffmpeg_pull=5, * mp4_vod=6, * device_chn=7 */ private int originType; /** * 客户端和服务器网络信息,可能为null类型 */ private OriginSock originSock; /** * 产生源类型的字符串描述 */ private String originTypeStr; /** * 产生源的url */ private String originUrl; /** * 服务器id */ private String severId; /** * GMT unix系统时间戳,单位秒 */ private Long createStamp; /** * 存活时间,单位秒 */ private Long aliveSecond; /** * 数据产生速度,单位byte/s */ private Long bytesSpeed; /** * 音视频轨道 */ private List<MediaTrack> tracks; /** * 音视频轨道 */ private String vhost; /** * 额外的参数字符串 */ private String params; /** * 额外的参数 */ private Map<String, String> paramMap; public boolean isRegist() { return regist; } public void setRegist(boolean regist) { this.regist = regist; } /** * 是否是docker部署, docker部署不会自动更新zlm使用的端口,需要自己手动修改 */ private boolean docker; public static class MediaTrack { /** * 音频通道数 */ private int channels; /** * H264 = 0, H265 = 1, AAC = 2, G711A = 3, G711U = 4 */ private int codec_id; /** * 编码类型名称 CodecAAC CodecH264 */ private String codec_id_name; /** * Video = 0, Audio = 1 */ private int codec_type; /** * 轨道是否准备就绪 */ private boolean ready; /** * 音频采样位数 */ private int sample_bit; /** * 音频采样率 */ private int sample_rate; /** * 视频fps */ private float fps; /** * 视频高 */ private int height; /** * 视频宽 */ private int width; /** * 帧数 */ private int frames; /** * 关键帧数 */ private int key_frames; /** * GOP大小 */ private int gop_size; /** * GOP间隔时长(ms) */ private int gop_interval_ms; /** * 丢帧率 */ private float loss; public int getChannels() { return channels; } public void setChannels(int channels) { this.channels = channels; } public int getCodec_id() { return codec_id; } public void setCodec_id(int codec_id) { this.codec_id = codec_id; } public String getCodec_id_name() { return codec_id_name; } public void setCodec_id_name(String codec_id_name) { this.codec_id_name = codec_id_name; } public int getCodec_type() { return codec_type; } public void setCodec_type(int codec_type) { this.codec_type = codec_type; } public boolean isReady() { return ready; } public void setReady(boolean ready) { this.ready = ready; } public int getSample_bit() { return sample_bit; } public void setSample_bit(int sample_bit) { this.sample_bit = sample_bit; } public int getSample_rate() { return sample_rate; } public void setSample_rate(int sample_rate) { this.sample_rate = sample_rate; } public float getFps() { return fps; } public void setFps(float fps) { this.fps = fps; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getFrames() { return frames; } public void setFrames(int frames) { this.frames = frames; } public int getKey_frames() { return key_frames; } public void setKey_frames(int key_frames) { this.key_frames = key_frames; } public int getGop_size() { return gop_size; } public void setGop_size(int gop_size) { this.gop_size = gop_size; } public int getGop_interval_ms() { return gop_interval_ms; } public void setGop_interval_ms(int gop_interval_ms) { this.gop_interval_ms = gop_interval_ms; } public float getLoss() { return loss; } public void setLoss(float loss) { this.loss = loss; } } public static class OriginSock{ private String identifier; private String local_ip; private int local_port; private String peer_ip; private int peer_port; public String getIdentifier() { return identifier; } public void setIdentifier(String identifier) { this.identifier = identifier; } public String getLocal_ip() { return local_ip; } public void setLocal_ip(String local_ip) { this.local_ip = local_ip; } public int getLocal_port() { return local_port; } public void setLocal_port(int local_port) { this.local_port = local_port; } public String getPeer_ip() { return peer_ip; } public void setPeer_ip(String peer_ip) { this.peer_ip = peer_ip; } public int getPeer_port() { return peer_port; } public void setPeer_port(int peer_port) { this.peer_port = peer_port; } } private StreamContent streamInfo; public String getApp() { return app; } public void setApp(String app) { this.app = app; } public String getStream() { return stream; } public void setStream(String stream) { this.stream = stream; } public int getTotalReaderCount() { return totalReaderCount; } public void setTotalReaderCount(int totalReaderCount) { this.totalReaderCount = totalReaderCount; } public int getOriginType() { return originType; } public void setOriginType(int originType) { this.originType = originType; } public String getOriginTypeStr() { return originTypeStr; } public void setOriginTypeStr(String originTypeStr) { this.originTypeStr = originTypeStr; } public String getOriginUrl() { return originUrl; } public void setOriginUrl(String originUrl) { this.originUrl = originUrl; } public Long getCreateStamp() { return createStamp; } public void setCreateStamp(Long createStamp) { this.createStamp = createStamp; } public Long getAliveSecond() { return aliveSecond; } public void setAliveSecond(Long aliveSecond) { this.aliveSecond = aliveSecond; } public List<MediaTrack> getTracks() { return tracks; } public void setTracks(List<MediaTrack> tracks) { this.tracks = tracks; } public String getSchema() { return schema; } public void setSchema(String schema) { this.schema = schema; } public void setOriginSock(OriginSock originSock) { this.originSock = originSock; } public Long getBytesSpeed() { return bytesSpeed; } public void setBytesSpeed(Long bytesSpeed) { this.bytesSpeed = bytesSpeed; } public String getVhost() { return vhost; } public void setVhost(String vhost) { this.vhost = vhost; } public OriginSock getOriginSock() { return originSock; } public boolean isDocker() { return docker; } public void setDocker(boolean docker) { this.docker = docker; } public StreamContent getStreamInfo() { return streamInfo; } public void setStreamInfo(StreamContent streamInfo) { this.streamInfo = streamInfo; } public String getSeverId() { return severId; } public void setSeverId(String severId) { this.severId = severId; } public String getCallId() { return callId; } public void setCallId(String callId) { this.callId = callId; } public Map<String, String> getParamMap() { return paramMap; } public void setParamMap(Map<String, String> paramMap) { this.paramMap = paramMap; } public String getParams() { return params; } public void setParams(String params) { this.params = params; } @Override public String toString() { return "OnStreamChangedHookParam{" + "regist=" + regist + ", app='" + app + '\'' + ", stream='" + stream + '\'' + ", severId='" + severId + '\'' + '}'; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/StreamContent.java
New file @@ -0,0 +1,442 @@ package com.ycl.platform.wvp; import io.swagger.v3.oas.annotations.media.Schema; @Schema(description = "流信息") public class StreamContent { @Schema(description = "应用名") private String app; @Schema(description = "流ID") private String stream; @Schema(description = "IP") private String ip; @Schema(description = "HTTP-FLV流地址") private String flv; @Schema(description = "HTTPS-FLV流地址") private String https_flv; @Schema(description = "Websocket-FLV流地址") private String ws_flv; @Schema(description = "Websockets-FLV流地址") private String wss_flv; @Schema(description = "HTTP-FMP4流地址") private String fmp4; @Schema(description = "HTTPS-FMP4流地址") private String https_fmp4; @Schema(description = "Websocket-FMP4流地址") private String ws_fmp4; @Schema(description = "Websockets-FMP4流地址") private String wss_fmp4; @Schema(description = "HLS流地址") private String hls; @Schema(description = "HTTPS-HLS流地址") private String https_hls; @Schema(description = "Websocket-HLS流地址") private String ws_hls; @Schema(description = "Websockets-HLS流地址") private String wss_hls; @Schema(description = "HTTP-TS流地址") private String ts; @Schema(description = "HTTPS-TS流地址") private String https_ts; @Schema(description = "Websocket-TS流地址") private String ws_ts; @Schema(description = "Websockets-TS流地址") private String wss_ts; @Schema(description = "RTMP流地址") private String rtmp; @Schema(description = "RTMPS流地址") private String rtmps; @Schema(description = "RTSP流地址") private String rtsp; @Schema(description = "RTSPS流地址") private String rtsps; @Schema(description = "RTC流地址") private String rtc; @Schema(description = "RTCS流地址") private String rtcs; @Schema(description = "流媒体ID") private String mediaServerId; @Schema(description = "流编码信息") private MediaInfo mediaInfo; @Schema(description = "开始时间") private String startTime; @Schema(description = "结束时间") private String endTime; @Schema(description = "文件下载地址(录像下载使用)") private DownloadFileInfo downLoadFilePath; @Schema(description = "转码后的视频流") private StreamContent transcodeStream; private double progress; public StreamContent(StreamInfo streamInfo) { if (streamInfo == null) { return; } this.app = streamInfo.getApp(); this.stream = streamInfo.getStream(); if (streamInfo.getFlv() != null) { this.flv = streamInfo.getFlv().getUrl(); } if (streamInfo.getHttps_flv() != null) { this.https_flv = streamInfo.getHttps_flv().getUrl(); } if (streamInfo.getWs_flv() != null) { this.ws_flv = streamInfo.getWs_flv().getUrl(); } if (streamInfo.getWss_flv() != null) { this.wss_flv = streamInfo.getWss_flv().getUrl(); } if (streamInfo.getFmp4() != null) { this.fmp4 = streamInfo.getFmp4().getUrl(); } if (streamInfo.getHttps_fmp4() != null) { this.https_fmp4 = streamInfo.getHttps_fmp4().getUrl(); } if (streamInfo.getWs_fmp4() != null) { this.ws_fmp4 = streamInfo.getWs_fmp4().getUrl(); } if (streamInfo.getWss_fmp4() != null) { this.wss_fmp4 = streamInfo.getWss_fmp4().getUrl(); } if (streamInfo.getHls() != null) { this.hls = streamInfo.getHls().getUrl(); } if (streamInfo.getHttps_hls() != null) { this.https_hls = streamInfo.getHttps_hls().getUrl(); } if (streamInfo.getWs_hls() != null) { this.ws_hls = streamInfo.getWs_hls().getUrl(); } if (streamInfo.getWss_hls() != null) { this.wss_hls = streamInfo.getWss_hls().getUrl(); } if (streamInfo.getTs() != null) { this.ts = streamInfo.getTs().getUrl(); } if (streamInfo.getHttps_ts() != null) { this.https_ts = streamInfo.getHttps_ts().getUrl(); } if (streamInfo.getWs_ts() != null) { this.ws_ts = streamInfo.getWs_ts().getUrl(); } if (streamInfo.getRtmp() != null) { this.rtmp = streamInfo.getRtmp().getUrl(); } if (streamInfo.getRtmps() != null) { this.rtmps = streamInfo.getRtmps().getUrl(); } if (streamInfo.getRtsp() != null) { this.rtsp = streamInfo.getRtsp().getUrl(); } if (streamInfo.getRtsps() != null) { this.rtsps = streamInfo.getRtsps().getUrl(); } if (streamInfo.getRtc() != null) { this.rtc = streamInfo.getRtc().getUrl(); } if (streamInfo.getRtcs() != null) { this.rtcs = streamInfo.getRtcs().getUrl(); } this.mediaServerId = streamInfo.getMediaServerId(); this.mediaInfo = streamInfo.getMediaInfo(); this.startTime = streamInfo.getStartTime(); this.endTime = streamInfo.getEndTime(); this.progress = streamInfo.getProgress(); if (streamInfo.getDownLoadFilePath() != null) { this.downLoadFilePath = streamInfo.getDownLoadFilePath(); } if (streamInfo.getTranscodeStream() != null) { this.transcodeStream = new StreamContent(streamInfo.getTranscodeStream()); } } public StreamContent getTranscodeStream() { return transcodeStream; } public void setTranscodeStream(StreamContent transcodeStream) { this.transcodeStream = transcodeStream; } public String getApp() { return app; } public void setApp(String app) { this.app = app; } public String getStream() { return stream; } public void setStream(String stream) { this.stream = stream; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getFlv() { return flv; } public void setFlv(String flv) { this.flv = flv; } public String getHttps_flv() { return https_flv; } public void setHttps_flv(String https_flv) { this.https_flv = https_flv; } public String getWs_flv() { return ws_flv; } public void setWs_flv(String ws_flv) { this.ws_flv = ws_flv; } public String getWss_flv() { return wss_flv; } public void setWss_flv(String wss_flv) { this.wss_flv = wss_flv; } public String getFmp4() { return fmp4; } public void setFmp4(String fmp4) { this.fmp4 = fmp4; } public String getHttps_fmp4() { return https_fmp4; } public void setHttps_fmp4(String https_fmp4) { this.https_fmp4 = https_fmp4; } public String getWs_fmp4() { return ws_fmp4; } public void setWs_fmp4(String ws_fmp4) { this.ws_fmp4 = ws_fmp4; } public String getWss_fmp4() { return wss_fmp4; } public void setWss_fmp4(String wss_fmp4) { this.wss_fmp4 = wss_fmp4; } public String getHls() { return hls; } public void setHls(String hls) { this.hls = hls; } public String getHttps_hls() { return https_hls; } public void setHttps_hls(String https_hls) { this.https_hls = https_hls; } public String getWs_hls() { return ws_hls; } public void setWs_hls(String ws_hls) { this.ws_hls = ws_hls; } public String getWss_hls() { return wss_hls; } public void setWss_hls(String wss_hls) { this.wss_hls = wss_hls; } public String getTs() { return ts; } public void setTs(String ts) { this.ts = ts; } public String getHttps_ts() { return https_ts; } public void setHttps_ts(String https_ts) { this.https_ts = https_ts; } public String getWs_ts() { return ws_ts; } public void setWs_ts(String ws_ts) { this.ws_ts = ws_ts; } public String getWss_ts() { return wss_ts; } public void setWss_ts(String wss_ts) { this.wss_ts = wss_ts; } public String getRtmp() { return rtmp; } public void setRtmp(String rtmp) { this.rtmp = rtmp; } public String getRtmps() { return rtmps; } public void setRtmps(String rtmps) { this.rtmps = rtmps; } public String getRtsp() { return rtsp; } public void setRtsp(String rtsp) { this.rtsp = rtsp; } public String getRtsps() { return rtsps; } public void setRtsps(String rtsps) { this.rtsps = rtsps; } public String getRtc() { return rtc; } public void setRtc(String rtc) { this.rtc = rtc; } public String getRtcs() { return rtcs; } public void setRtcs(String rtcs) { this.rtcs = rtcs; } public String getMediaServerId() { return mediaServerId; } public void setMediaServerId(String mediaServerId) { this.mediaServerId = mediaServerId; } public MediaInfo getMediaInfo() { return mediaInfo; } public void setMediaInfo(MediaInfo mediaInfo) { this.mediaInfo = mediaInfo; } public String getStartTime() { return startTime; } public void setStartTime(String startTime) { this.startTime = startTime; } public String getEndTime() { return endTime; } public void setEndTime(String endTime) { this.endTime = endTime; } public double getProgress() { return progress; } public void setProgress(double progress) { this.progress = progress; } public DownloadFileInfo getDownLoadFilePath() { return downLoadFilePath; } public void setDownLoadFilePath(DownloadFileInfo downLoadFilePath) { this.downLoadFilePath = downLoadFilePath; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/StreamInfo.java
New file @@ -0,0 +1,647 @@ package com.ycl.platform.wvp; import io.swagger.v3.oas.annotations.media.Schema; import java.io.Serializable; import java.util.Objects; @Schema(description = "流信息") public class StreamInfo implements Serializable, Cloneable{ @Schema(description = "应用名") private String app; @Schema(description = "流ID") private String stream; @Schema(description = "设备编号") private String deviceID; @Schema(description = "通道编号") private String channelId; @Schema(description = "IP") private String ip; @Schema(description = "HTTP-FLV流地址") private StreamURL flv; @Schema(description = "HTTPS-FLV流地址") private StreamURL https_flv; @Schema(description = "Websocket-FLV流地址") private StreamURL ws_flv; @Schema(description = "Websockets-FLV流地址") private StreamURL wss_flv; @Schema(description = "HTTP-FMP4流地址") private StreamURL fmp4; @Schema(description = "HTTPS-FMP4流地址") private StreamURL https_fmp4; @Schema(description = "Websocket-FMP4流地址") private StreamURL ws_fmp4; @Schema(description = "Websockets-FMP4流地址") private StreamURL wss_fmp4; @Schema(description = "HLS流地址") private StreamURL hls; @Schema(description = "HTTPS-HLS流地址") private StreamURL https_hls; @Schema(description = "Websocket-HLS流地址") private StreamURL ws_hls; @Schema(description = "Websockets-HLS流地址") private StreamURL wss_hls; @Schema(description = "HTTP-TS流地址") private StreamURL ts; @Schema(description = "HTTPS-TS流地址") private StreamURL https_ts; @Schema(description = "Websocket-TS流地址") private StreamURL ws_ts; @Schema(description = "Websockets-TS流地址") private StreamURL wss_ts; @Schema(description = "RTMP流地址") private StreamURL rtmp; @Schema(description = "RTMPS流地址") private StreamURL rtmps; @Schema(description = "RTSP流地址") private StreamURL rtsp; @Schema(description = "RTSPS流地址") private StreamURL rtsps; @Schema(description = "RTC流地址") private StreamURL rtc; @Schema(description = "RTCS流地址") private StreamURL rtcs; @Schema(description = "流媒体ID") private String mediaServerId; @Schema(description = "流编码信息") private MediaInfo mediaInfo; @Schema(description = "开始时间") private String startTime; @Schema(description = "结束时间") private String endTime; @Schema(description = "进度(录像下载使用)") private double progress; @Schema(description = "文件下载地址(录像下载使用)") private DownloadFileInfo downLoadFilePath; @Schema(description = "是否暂停(录像回放使用)") private boolean pause; @Schema(description = "产生源类型,包括 unknown = 0,rtmp_push=1,rtsp_push=2,rtp_push=3,pull=4,ffmpeg_pull=5,mp4_vod=6,device_chn=7") private int originType; @Schema(description = "转码后的视频流") private StreamInfo transcodeStream; public void setFlv(StreamURL flv) { this.flv = flv; } public void setHttps_flv(StreamURL https_flv) { this.https_flv = https_flv; } public void setWs_flv(StreamURL ws_flv) { this.ws_flv = ws_flv; } public void setWss_flv(StreamURL wss_flv) { this.wss_flv = wss_flv; } public void setFmp4(StreamURL fmp4) { this.fmp4 = fmp4; } public void setHttps_fmp4(StreamURL https_fmp4) { this.https_fmp4 = https_fmp4; } public void setWs_fmp4(StreamURL ws_fmp4) { this.ws_fmp4 = ws_fmp4; } public void setWss_fmp4(StreamURL wss_fmp4) { this.wss_fmp4 = wss_fmp4; } public void setHls(StreamURL hls) { this.hls = hls; } public void setHttps_hls(StreamURL https_hls) { this.https_hls = https_hls; } public void setWs_hls(StreamURL ws_hls) { this.ws_hls = ws_hls; } public void setWss_hls(StreamURL wss_hls) { this.wss_hls = wss_hls; } public void setTs(StreamURL ts) { this.ts = ts; } public void setHttps_ts(StreamURL https_ts) { this.https_ts = https_ts; } public void setWs_ts(StreamURL ws_ts) { this.ws_ts = ws_ts; } public void setWss_ts(StreamURL wss_ts) { this.wss_ts = wss_ts; } public void setRtmp(StreamURL rtmp) { this.rtmp = rtmp; } public void setRtmps(StreamURL rtmps) { this.rtmps = rtmps; } public void setRtsp(StreamURL rtsp) { this.rtsp = rtsp; } public void setRtsps(StreamURL rtsps) { this.rtsps = rtsps; } public void setRtc(StreamURL rtc) { this.rtc = rtc; } public void setRtcs(StreamURL rtcs) { this.rtcs = rtcs; } public void setRtmp(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s%s", app, stream, callIdParam); if (port > 0) { this.rtmp = new StreamURL("rtmp", host, port, file); } if (sslPort > 0) { this.rtmps = new StreamURL("rtmps", host, sslPort, file); } } public void setRtsp(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s%s", app, stream, callIdParam); if (port > 0) { this.rtsp = new StreamURL("rtsp", host, port, file); } if (sslPort > 0) { this.rtsps = new StreamURL("rtsps", host, sslPort, file); } } public void setFlv(String host, int port, int sslPort, String file) { if (port > 0) { this.flv = new StreamURL("http", host, port, file); } this.ws_flv = new StreamURL("ws", host, port, file); if (sslPort > 0) { this.https_flv = new StreamURL("https", host, sslPort, file); this.wss_flv = new StreamURL("wss", host, sslPort, file); } } public void setWsFlv(String host, int port, int sslPort, String file) { if (port > 0) { this.ws_flv = new StreamURL("ws", host, port, file); } if (sslPort > 0) { this.wss_flv = new StreamURL("wss", host, sslPort, file); } } public void setFmp4(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s.live.mp4%s", app, stream, callIdParam); if (port > 0) { this.fmp4 = new StreamURL("http", host, port, file); this.ws_fmp4 = new StreamURL("ws", host, port, file); } if (sslPort > 0) { this.https_fmp4 = new StreamURL("https", host, sslPort, file); this.wss_fmp4 = new StreamURL("wss", host, sslPort, file); } } public void setHls(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s/hls.m3u8%s", app, stream, callIdParam); if (port > 0) { this.hls = new StreamURL("http", host, port, file); this.ws_hls = new StreamURL("ws", host, port, file); } if (sslPort > 0) { this.https_hls = new StreamURL("https", host, sslPort, file); this.wss_hls = new StreamURL("wss", host, sslPort, file); } } public void setTs(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s.live.ts%s", app, stream, callIdParam); if (port > 0) { this.ts = new StreamURL("http", host, port, file); this.ws_ts = new StreamURL("ws", host, port, file); } if (sslPort > 0) { this.https_ts = new StreamURL("https", host, sslPort, file); this.wss_ts = new StreamURL("wss", host, sslPort, file); } } public void setRtc(String host, int port, int sslPort, String app, String stream, String callIdParam, boolean isPlay) { if (callIdParam != null) { callIdParam = Objects.equals(callIdParam, "") ? callIdParam : callIdParam.replace("?", "&"); } String file = String.format("index/api/webrtc?app=%s&stream=%s&type=%s%s", app, stream, isPlay?"play":"push", callIdParam); if (port > 0) { this.rtc = new StreamURL("http", host, port, file); } if (sslPort > 0) { this.rtcs = new StreamURL("https", host, sslPort, file); } } public void channgeStreamIp(String localAddr) { if (this.flv != null) { this.flv.setHost(localAddr); } if (this.ws_flv != null ){ this.ws_flv.setHost(localAddr); } if (this.hls != null ) { this.hls.setHost(localAddr); } if (this.ws_hls != null ) { this.ws_hls.setHost(localAddr); } if (this.ts != null ) { this.ts.setHost(localAddr); } if (this.ws_ts != null ) { this.ws_ts.setHost(localAddr); } if (this.fmp4 != null ) { this.fmp4.setHost(localAddr); } if (this.ws_fmp4 != null ) { this.ws_fmp4.setHost(localAddr); } if (this.rtc != null ) { this.rtc.setHost(localAddr); } if (this.https_flv != null) { this.https_flv.setHost(localAddr); } if (this.wss_flv != null) { this.wss_flv.setHost(localAddr); } if (this.https_hls != null) { this.https_hls.setHost(localAddr); } if (this.wss_hls != null) { this.wss_hls.setHost(localAddr); } if (this.wss_ts != null) { this.wss_ts.setHost(localAddr); } if (this.https_fmp4 != null) { this.https_fmp4.setHost(localAddr); } if (this.wss_fmp4 != null) { this.wss_fmp4.setHost(localAddr); } if (this.rtcs != null) { this.rtcs.setHost(localAddr); } if (this.rtsp != null) { this.rtsp.setHost(localAddr); } if (this.rtsps != null) { this.rtsps.setHost(localAddr); } if (this.rtmp != null) { this.rtmp.setHost(localAddr); } if (this.rtmps != null) { this.rtmps.setHost(localAddr); } } public static class TransactionInfo{ public String callId; public String localTag; public String remoteTag; public String branch; } private TransactionInfo transactionInfo; public String getApp() { return app; } public void setApp(String app) { this.app = app; } public String getDeviceID() { return deviceID; } public void setDeviceID(String deviceID) { this.deviceID = deviceID; } public String getChannelId() { return channelId; } public void setChannelId(String channelId) { this.channelId = channelId; } public String getStream() { return stream; } public void setStream(String stream) { this.stream = stream; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public StreamURL getFlv() { return flv; } public StreamURL getHttps_flv() { return https_flv; } public StreamURL getWs_flv() { return ws_flv; } public StreamURL getWss_flv() { return wss_flv; } public StreamURL getFmp4() { return fmp4; } public StreamURL getHttps_fmp4() { return https_fmp4; } public StreamURL getWs_fmp4() { return ws_fmp4; } public StreamURL getWss_fmp4() { return wss_fmp4; } public StreamURL getHls() { return hls; } public StreamURL getHttps_hls() { return https_hls; } public StreamURL getWs_hls() { return ws_hls; } public StreamURL getWss_hls() { return wss_hls; } public StreamURL getTs() { return ts; } public StreamURL getHttps_ts() { return https_ts; } public StreamURL getWs_ts() { return ws_ts; } public StreamURL getWss_ts() { return wss_ts; } public StreamURL getRtmp() { return rtmp; } public StreamURL getRtmps() { return rtmps; } public StreamURL getRtsp() { return rtsp; } public StreamURL getRtsps() { return rtsps; } public StreamURL getRtc() { return rtc; } public StreamURL getRtcs() { return rtcs; } public String getMediaServerId() { return mediaServerId; } public void setMediaServerId(String mediaServerId) { this.mediaServerId = mediaServerId; } public MediaInfo getMediaInfo() { return mediaInfo; } public void setMediaInfo(MediaInfo mediaInfo) { this.mediaInfo = mediaInfo; } public String getStartTime() { return startTime; } public void setStartTime(String startTime) { this.startTime = startTime; } public String getEndTime() { return endTime; } public void setEndTime(String endTime) { this.endTime = endTime; } public double getProgress() { return progress; } public void setProgress(double progress) { this.progress = progress; } public boolean isPause() { return pause; } public void setPause(boolean pause) { this.pause = pause; } public TransactionInfo getTransactionInfo() { return transactionInfo; } public void setTransactionInfo(TransactionInfo transactionInfo) { this.transactionInfo = transactionInfo; } public StreamInfo getTranscodeStream() { return transcodeStream; } public void setTranscodeStream(StreamInfo transcodeStream) { this.transcodeStream = transcodeStream; } @Override public StreamInfo clone() { StreamInfo instance = null; try{ instance = (StreamInfo)super.clone(); if (this.flv != null) { instance.flv=this.flv.clone(); } if (this.ws_flv != null ){ instance.ws_flv= this.ws_flv.clone(); } if (this.hls != null ) { instance.hls= this.hls.clone(); } if (this.ws_hls != null ) { instance.ws_hls= this.ws_hls.clone(); } if (this.ts != null ) { instance.ts= this.ts.clone(); } if (this.ws_ts != null ) { instance.ws_ts= this.ws_ts.clone(); } if (this.fmp4 != null ) { instance.fmp4= this.fmp4.clone(); } if (this.ws_fmp4 != null ) { instance.ws_fmp4= this.ws_fmp4.clone(); } if (this.rtc != null ) { instance.rtc= this.rtc.clone(); } if (this.https_flv != null) { instance.https_flv= this.https_flv.clone(); } if (this.wss_flv != null) { instance.wss_flv= this.wss_flv.clone(); } if (this.https_hls != null) { instance.https_hls= this.https_hls.clone(); } if (this.wss_hls != null) { instance.wss_hls= this.wss_hls.clone(); } if (this.wss_ts != null) { instance.wss_ts= this.wss_ts.clone(); } if (this.https_fmp4 != null) { instance.https_fmp4= this.https_fmp4.clone(); } if (this.wss_fmp4 != null) { instance.wss_fmp4= this.wss_fmp4.clone(); } if (this.rtcs != null) { instance.rtcs= this.rtcs.clone(); } if (this.rtsp != null) { instance.rtsp= this.rtsp.clone(); } if (this.rtsps != null) { instance.rtsps= this.rtsps.clone(); } if (this.rtmp != null) { instance.rtmp= this.rtmp.clone(); } if (this.rtmps != null) { instance.rtmps= this.rtmps.clone(); } }catch(CloneNotSupportedException e) { e.printStackTrace(); } return instance; } /*=========================设备主子码流逻辑START====================*/ @Schema(description = "是否为子码流(true-是,false-主码流)") private boolean subStream; public boolean isSubStream() { return subStream; } public void setSubStream(boolean subStream) { this.subStream = subStream; } public DownloadFileInfo getDownLoadFilePath() { return downLoadFilePath; } public void setDownLoadFilePath(DownloadFileInfo downLoadFilePath) { this.downLoadFilePath = downLoadFilePath; } public int getOriginType() { return originType; } public void setOriginType(int originType) { this.originType = originType; } } ycl-pojo/src/main/java/com/ycl/platform/wvp/StreamURL.java
New file @@ -0,0 +1,84 @@ package com.ycl.platform.wvp; import io.swagger.v3.oas.annotations.media.Schema; import java.io.Serializable; @Schema(description = "流地址信息") public class StreamURL implements Serializable,Cloneable { @Schema(description = "协议") private String protocol; @Schema(description = "主机地址") private String host; @Schema(description = "端口") private int port = -1; @Schema(description = "定位位置") private String file; @Schema(description = "拼接后的地址") private String url; public StreamURL() { } public StreamURL(String protocol, String host, int port, String file) { this.protocol = protocol; this.host = host; this.port = port; this.file = file; } public String getProtocol() { return protocol; } public void setProtocol(String protocol) { this.protocol = protocol; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getFile() { return file; } public void setFile(String file) { this.file = file; } public String getUrl() { return this.toString(); } @Override public String toString() { if (protocol != null && host != null && port != -1 ) { return String.format("%s://%s:%s/%s", protocol, host, port, file); }else { return null; } } @Override public StreamURL clone() throws CloneNotSupportedException { return (StreamURL) super.clone(); } } ycl-pojo/src/main/java/com/ycl/platform/wvp/WVPResult.java
New file @@ -0,0 +1,75 @@ package com.ycl.platform.wvp; import io.swagger.v3.oas.annotations.media.Schema; @Schema(description = "统一返回结果") public class WVPResult<T> implements Cloneable{ public WVPResult() { } public WVPResult(int code, String msg, T data) { this.code = code; this.msg = msg; this.data = data; } @Schema(description = "错误码,0为成功") private int code; @Schema(description = "描述,错误时描述错误原因") private String msg; @Schema(description = "数据") private T data; public static <T> WVPResult<T> success(T t, String msg) { return new WVPResult<>(ErrorCode.SUCCESS.getCode(), msg, t); } public static WVPResult success() { return new WVPResult<>(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), null); } public static <T> WVPResult<T> success(T t) { return success(t, ErrorCode.SUCCESS.getMsg()); } public static <T> WVPResult<T> fail(int code, String msg) { return new WVPResult<>(code, msg, null); } public static <T> WVPResult<T> fail(ErrorCode errorCode) { return fail(errorCode.getCode(), errorCode.getMsg()); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } } ycl-pojo/src/main/java/com/ycl/platform/wvp/ZLMServerConfig.java
New file @@ -0,0 +1,1224 @@ package com.ycl.platform.wvp; import com.alibaba.fastjson2.annotation.JSONField; public class ZLMServerConfig extends HookParam { @JSONField(name = "api.apiDebug") private String apiDebug; @JSONField(name = "api.secret") private String apiSecret; @JSONField(name = "api.snapRoot") private String apiSnapRoot; @JSONField(name = "api.defaultSnap") private String apiDefaultSnap; @JSONField(name = "ffmpeg.bin") private String ffmpegBin; @JSONField(name = "ffmpeg.cmd") private String ffmpegCmd; @JSONField(name = "ffmpeg.snap") private String ffmpegSnap; @JSONField(name = "ffmpeg.log") private String ffmpegLog; @JSONField(name = "ffmpeg.restart_sec") private String ffmpegRestartSec; @JSONField(name = "protocol.modify_stamp") private String protocolModifyStamp; @JSONField(name = "protocol.enable_audio") private String protocolEnableAudio; @JSONField(name = "protocol.add_mute_audio") private String protocolAddMuteAudio; @JSONField(name = "protocol.continue_push_ms") private String protocolContinuePushMs; @JSONField(name = "protocol.enable_hls") private String protocolEnableHls; @JSONField(name = "protocol.enable_mp4") private String protocolEnableMp4; @JSONField(name = "protocol.enable_rtsp") private String protocolEnableRtsp; @JSONField(name = "protocol.enable_rtmp") private String protocolEnableRtmp; @JSONField(name = "protocol.enable_ts") private String protocolEnableTs; @JSONField(name = "protocol.enable_fmp4") private String protocolEnableFmp4; @JSONField(name = "protocol.mp4_as_player") private String protocolMp4AsPlayer; @JSONField(name = "protocol.mp4_max_second") private String protocolMp4MaxSecond; @JSONField(name = "protocol.mp4_save_path") private String protocolMp4SavePath; @JSONField(name = "protocol.hls_save_path") private String protocolHlsSavePath; @JSONField(name = "protocol.hls_demand") private String protocolHlsDemand; @JSONField(name = "protocol.rtsp_demand") private String protocolRtspDemand; @JSONField(name = "protocol.rtmp_demand") private String protocolRtmpDemand; @JSONField(name = "protocol.ts_demand") private String protocolTsDemand; @JSONField(name = "protocol.fmp4_demand") private String protocolFmp4Demand; @JSONField(name = "general.enableVhost") private String generalEnableVhost; @JSONField(name = "general.flowThreshold") private String generalFlowThreshold; @JSONField(name = "general.maxStreamWaitMS") private String generalMaxStreamWaitMS; @JSONField(name = "general.streamNoneReaderDelayMS") private int generalStreamNoneReaderDelayMS; @JSONField(name = "general.resetWhenRePlay") private String generalResetWhenRePlay; @JSONField(name = "general.mergeWriteMS") private String generalMergeWriteMS; @JSONField(name = "general.mediaServerId") private String generalMediaServerId; @JSONField(name = "general.wait_track_ready_ms") private String generalWaitTrackReadyMs; @JSONField(name = "general.wait_add_track_ms") private String generalWaitAddTrackMs; @JSONField(name = "general.unready_frame_cache") private String generalUnreadyFrameCache; @JSONField(name = "ip") private String ip; private String sdpIp; private String streamIp; private String hookIp; private String updateTime; private String createTime; @JSONField(name = "hls.fileBufSize") private String hlsFileBufSize; @JSONField(name = "hls.filePath") private String hlsFilePath; @JSONField(name = "hls.segDur") private String hlsSegDur; @JSONField(name = "hls.segNum") private String hlsSegNum; @JSONField(name = "hls.segRetain") private String hlsSegRetain; @JSONField(name = "hls.broadcastRecordTs") private String hlsBroadcastRecordTs; @JSONField(name = "hls.deleteDelaySec") private String hlsDeleteDelaySec; @JSONField(name = "hls.segKeep") private String hlsSegKeep; @JSONField(name = "hook.access_file_except_hls") private String hookAccessFileExceptHLS; @JSONField(name = "hook.admin_params") private String hookAdminParams; @JSONField(name = "hook.alive_interval") private Float hookAliveInterval; @JSONField(name = "hook.enable") private String hookEnable; @JSONField(name = "hook.on_flow_report") private String hookOnFlowReport; @JSONField(name = "hook.on_http_access") private String hookOnHttpAccess; @JSONField(name = "hook.on_play") private String hookOnPlay; @JSONField(name = "hook.on_publish") private String hookOnPublish; @JSONField(name = "hook.on_record_mp4") private String hookOnRecordMp4; @JSONField(name = "hook.on_rtsp_auth") private String hookOnRtspAuth; @JSONField(name = "hook.on_rtsp_realm") private String hookOnRtspRealm; @JSONField(name = "hook.on_shell_login") private String hookOnShellLogin; @JSONField(name = "hook.on_stream_changed") private String hookOnStreamChanged; @JSONField(name = "hook.on_stream_none_reader") private String hookOnStreamNoneReader; @JSONField(name = "hook.on_stream_not_found") private String hookOnStreamNotFound; @JSONField(name = "hook.on_server_started") private String hookOnServerStarted; @JSONField(name = "hook.on_server_keepalive") private String hookOnServerKeepalive; @JSONField(name = "hook.on_send_rtp_stopped") private String hookOnSendRtpStopped; @JSONField(name = "hook.on_rtp_server_timeout") private String hookOnRtpServerTimeout; @JSONField(name = "hook.timeoutSec") private String hookTimeoutSec; @JSONField(name = "http.charSet") private String httpCharSet; @JSONField(name = "http.keepAliveSecond") private String httpKeepAliveSecond; @JSONField(name = "http.maxReqCount") private String httpMaxReqCount; @JSONField(name = "http.maxReqSize") private String httpMaxReqSize; @JSONField(name = "http.notFound") private String httpNotFound; @JSONField(name = "http.port") private int httpPort; @JSONField(name = "http.rootPath") private String httpRootPath; @JSONField(name = "http.sendBufSize") private String httpSendBufSize; @JSONField(name = "http.sslport") private int httpSSLport; @JSONField(name = "multicast.addrMax") private String multicastAddrMax; @JSONField(name = "multicast.addrMin") private String multicastAddrMin; @JSONField(name = "multicast.udpTTL") private String multicastUdpTTL; @JSONField(name = "record.appName") private String recordAppName; @JSONField(name = "record.filePath") private String recordFilePath; @JSONField(name = "record.fileSecond") private String recordFileSecond; @JSONField(name = "record.sampleMS") private String recordFileSampleMS; @JSONField(name = "rtmp.handshakeSecond") private String rtmpHandshakeSecond; @JSONField(name = "rtmp.keepAliveSecond") private String rtmpKeepAliveSecond; @JSONField(name = "rtmp.modifyStamp") private String rtmpModifyStamp; @JSONField(name = "rtmp.port") private int rtmpPort; @JSONField(name = "rtmp.sslport") private int rtmpSslPort; @JSONField(name = "rtp.audioMtuSize") private String rtpAudioMtuSize; @JSONField(name = "rtp.clearCount") private String rtpClearCount; @JSONField(name = "rtp.cycleMS") private String rtpCycleMS; @JSONField(name = "rtp.maxRtpCount") private String rtpMaxRtpCount; @JSONField(name = "rtp.videoMtuSize") private String rtpVideoMtuSize; @JSONField(name = "rtp_proxy.checkSource") private String rtpProxyCheckSource; @JSONField(name = "rtp_proxy.dumpDir") private String rtpProxyDumpDir; @JSONField(name = "rtp_proxy.port") private int rtpProxyPort; @JSONField(name = "rtp_proxy.port_range") private String portRange; @JSONField(name = "rtp_proxy.timeoutSec") private String rtpProxyTimeoutSec; @JSONField(name = "rtsp.authBasic") private String rtspAuthBasic; @JSONField(name = "rtsp.handshakeSecond") private String rtspHandshakeSecond; @JSONField(name = "rtsp.keepAliveSecond") private String rtspKeepAliveSecond; @JSONField(name = "rtsp.port") private int rtspPort; @JSONField(name = "rtsp.sslport") private int rtspSSlport; @JSONField(name = "shell.maxReqSize") private String shellMaxReqSize; @JSONField(name = "shell.shell") private String shellPhell; @JSONField(name = "transcode.suffix") private String transcodeSuffix; public String getHookIp() { return hookIp; } public void setHookIp(String hookIp) { this.hookIp = hookIp; } public String getApiDebug() { return apiDebug; } public void setApiDebug(String apiDebug) { this.apiDebug = apiDebug; } public String getApiSecret() { return apiSecret; } public void setApiSecret(String apiSecret) { this.apiSecret = apiSecret; } public String getFfmpegBin() { return ffmpegBin; } public void setFfmpegBin(String ffmpegBin) { this.ffmpegBin = ffmpegBin; } public String getFfmpegCmd() { return ffmpegCmd; } public void setFfmpegCmd(String ffmpegCmd) { this.ffmpegCmd = ffmpegCmd; } public String getFfmpegLog() { return ffmpegLog; } public void setFfmpegLog(String ffmpegLog) { this.ffmpegLog = ffmpegLog; } public String getGeneralEnableVhost() { return generalEnableVhost; } public void setGeneralEnableVhost(String generalEnableVhost) { this.generalEnableVhost = generalEnableVhost; } public String getGeneralMediaServerId() { return generalMediaServerId; } public void setGeneralMediaServerId(String generalMediaServerId) { this.generalMediaServerId = generalMediaServerId; } public String getGeneralFlowThreshold() { return generalFlowThreshold; } public void setGeneralFlowThreshold(String generalFlowThreshold) { this.generalFlowThreshold = generalFlowThreshold; } public String getGeneralMaxStreamWaitMS() { return generalMaxStreamWaitMS; } public void setGeneralMaxStreamWaitMS(String generalMaxStreamWaitMS) { this.generalMaxStreamWaitMS = generalMaxStreamWaitMS; } public int getGeneralStreamNoneReaderDelayMS() { return generalStreamNoneReaderDelayMS; } public void setGeneralStreamNoneReaderDelayMS(int generalStreamNoneReaderDelayMS) { this.generalStreamNoneReaderDelayMS = generalStreamNoneReaderDelayMS; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getSdpIp() { return sdpIp; } public void setSdpIp(String sdpIp) { this.sdpIp = sdpIp; } public String getStreamIp() { return streamIp; } public void setStreamIp(String streamIp) { this.streamIp = streamIp; } public String getUpdateTime() { return updateTime; } public void setUpdateTime(String updateTime) { this.updateTime = updateTime; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } public String getHlsFileBufSize() { return hlsFileBufSize; } public void setHlsFileBufSize(String hlsFileBufSize) { this.hlsFileBufSize = hlsFileBufSize; } public String getHlsFilePath() { return hlsFilePath; } public void setHlsFilePath(String hlsFilePath) { this.hlsFilePath = hlsFilePath; } public String getHlsSegDur() { return hlsSegDur; } public void setHlsSegDur(String hlsSegDur) { this.hlsSegDur = hlsSegDur; } public String getHlsSegNum() { return hlsSegNum; } public void setHlsSegNum(String hlsSegNum) { this.hlsSegNum = hlsSegNum; } public String getHookAccessFileExceptHLS() { return hookAccessFileExceptHLS; } public void setHookAccessFileExceptHLS(String hookAccessFileExceptHLS) { this.hookAccessFileExceptHLS = hookAccessFileExceptHLS; } public String getHookAdminParams() { return hookAdminParams; } public void setHookAdminParams(String hookAdminParams) { this.hookAdminParams = hookAdminParams; } public String getHookEnable() { return hookEnable; } public void setHookEnable(String hookEnable) { this.hookEnable = hookEnable; } public String getHookOnFlowReport() { return hookOnFlowReport; } public void setHookOnFlowReport(String hookOnFlowReport) { this.hookOnFlowReport = hookOnFlowReport; } public String getHookOnHttpAccess() { return hookOnHttpAccess; } public void setHookOnHttpAccess(String hookOnHttpAccess) { this.hookOnHttpAccess = hookOnHttpAccess; } public String getHookOnPlay() { return hookOnPlay; } public void setHookOnPlay(String hookOnPlay) { this.hookOnPlay = hookOnPlay; } public String getHookOnPublish() { return hookOnPublish; } public void setHookOnPublish(String hookOnPublish) { this.hookOnPublish = hookOnPublish; } public String getHookOnRecordMp4() { return hookOnRecordMp4; } public void setHookOnRecordMp4(String hookOnRecordMp4) { this.hookOnRecordMp4 = hookOnRecordMp4; } public String getHookOnRtspAuth() { return hookOnRtspAuth; } public void setHookOnRtspAuth(String hookOnRtspAuth) { this.hookOnRtspAuth = hookOnRtspAuth; } public String getHookOnRtspRealm() { return hookOnRtspRealm; } public void setHookOnRtspRealm(String hookOnRtspRealm) { this.hookOnRtspRealm = hookOnRtspRealm; } public String getHookOnShellLogin() { return hookOnShellLogin; } public void setHookOnShellLogin(String hookOnShellLogin) { this.hookOnShellLogin = hookOnShellLogin; } public String getHookOnStreamChanged() { return hookOnStreamChanged; } public void setHookOnStreamChanged(String hookOnStreamChanged) { this.hookOnStreamChanged = hookOnStreamChanged; } public String getHookOnStreamNoneReader() { return hookOnStreamNoneReader; } public void setHookOnStreamNoneReader(String hookOnStreamNoneReader) { this.hookOnStreamNoneReader = hookOnStreamNoneReader; } public String getHookOnStreamNotFound() { return hookOnStreamNotFound; } public void setHookOnStreamNotFound(String hookOnStreamNotFound) { this.hookOnStreamNotFound = hookOnStreamNotFound; } public String getHookTimeoutSec() { return hookTimeoutSec; } public void setHookTimeoutSec(String hookTimeoutSec) { this.hookTimeoutSec = hookTimeoutSec; } public String getHttpCharSet() { return httpCharSet; } public void setHttpCharSet(String httpCharSet) { this.httpCharSet = httpCharSet; } public String getHttpKeepAliveSecond() { return httpKeepAliveSecond; } public void setHttpKeepAliveSecond(String httpKeepAliveSecond) { this.httpKeepAliveSecond = httpKeepAliveSecond; } public String getHttpMaxReqCount() { return httpMaxReqCount; } public void setHttpMaxReqCount(String httpMaxReqCount) { this.httpMaxReqCount = httpMaxReqCount; } public String getHttpMaxReqSize() { return httpMaxReqSize; } public void setHttpMaxReqSize(String httpMaxReqSize) { this.httpMaxReqSize = httpMaxReqSize; } public String getHttpNotFound() { return httpNotFound; } public void setHttpNotFound(String httpNotFound) { this.httpNotFound = httpNotFound; } public int getHttpPort() { return httpPort; } public void setHttpPort(int httpPort) { this.httpPort = httpPort; } public String getHttpRootPath() { return httpRootPath; } public void setHttpRootPath(String httpRootPath) { this.httpRootPath = httpRootPath; } public String getHttpSendBufSize() { return httpSendBufSize; } public void setHttpSendBufSize(String httpSendBufSize) { this.httpSendBufSize = httpSendBufSize; } public int getHttpSSLport() { return httpSSLport; } public void setHttpSSLport(int httpSSLport) { this.httpSSLport = httpSSLport; } public String getMulticastAddrMax() { return multicastAddrMax; } public void setMulticastAddrMax(String multicastAddrMax) { this.multicastAddrMax = multicastAddrMax; } public String getMulticastAddrMin() { return multicastAddrMin; } public void setMulticastAddrMin(String multicastAddrMin) { this.multicastAddrMin = multicastAddrMin; } public String getMulticastUdpTTL() { return multicastUdpTTL; } public void setMulticastUdpTTL(String multicastUdpTTL) { this.multicastUdpTTL = multicastUdpTTL; } public String getRecordAppName() { return recordAppName; } public void setRecordAppName(String recordAppName) { this.recordAppName = recordAppName; } public String getRecordFilePath() { return recordFilePath; } public void setRecordFilePath(String recordFilePath) { this.recordFilePath = recordFilePath; } public String getRecordFileSecond() { return recordFileSecond; } public void setRecordFileSecond(String recordFileSecond) { this.recordFileSecond = recordFileSecond; } public String getRecordFileSampleMS() { return recordFileSampleMS; } public void setRecordFileSampleMS(String recordFileSampleMS) { this.recordFileSampleMS = recordFileSampleMS; } public String getRtmpHandshakeSecond() { return rtmpHandshakeSecond; } public void setRtmpHandshakeSecond(String rtmpHandshakeSecond) { this.rtmpHandshakeSecond = rtmpHandshakeSecond; } public String getRtmpKeepAliveSecond() { return rtmpKeepAliveSecond; } public void setRtmpKeepAliveSecond(String rtmpKeepAliveSecond) { this.rtmpKeepAliveSecond = rtmpKeepAliveSecond; } public String getRtmpModifyStamp() { return rtmpModifyStamp; } public void setRtmpModifyStamp(String rtmpModifyStamp) { this.rtmpModifyStamp = rtmpModifyStamp; } public int getRtmpPort() { return rtmpPort; } public void setRtmpPort(int rtmpPort) { this.rtmpPort = rtmpPort; } public int getRtmpSslPort() { return rtmpSslPort; } public void setRtmpSslPort(int rtmpSslPort) { this.rtmpSslPort = rtmpSslPort; } public String getRtpAudioMtuSize() { return rtpAudioMtuSize; } public void setRtpAudioMtuSize(String rtpAudioMtuSize) { this.rtpAudioMtuSize = rtpAudioMtuSize; } public String getRtpClearCount() { return rtpClearCount; } public void setRtpClearCount(String rtpClearCount) { this.rtpClearCount = rtpClearCount; } public String getRtpCycleMS() { return rtpCycleMS; } public void setRtpCycleMS(String rtpCycleMS) { this.rtpCycleMS = rtpCycleMS; } public String getRtpMaxRtpCount() { return rtpMaxRtpCount; } public void setRtpMaxRtpCount(String rtpMaxRtpCount) { this.rtpMaxRtpCount = rtpMaxRtpCount; } public String getRtpVideoMtuSize() { return rtpVideoMtuSize; } public void setRtpVideoMtuSize(String rtpVideoMtuSize) { this.rtpVideoMtuSize = rtpVideoMtuSize; } public String getRtpProxyCheckSource() { return rtpProxyCheckSource; } public void setRtpProxyCheckSource(String rtpProxyCheckSource) { this.rtpProxyCheckSource = rtpProxyCheckSource; } public String getRtpProxyDumpDir() { return rtpProxyDumpDir; } public void setRtpProxyDumpDir(String rtpProxyDumpDir) { this.rtpProxyDumpDir = rtpProxyDumpDir; } public int getRtpProxyPort() { return rtpProxyPort; } public void setRtpProxyPort(int rtpProxyPort) { this.rtpProxyPort = rtpProxyPort; } public String getRtpProxyTimeoutSec() { return rtpProxyTimeoutSec; } public void setRtpProxyTimeoutSec(String rtpProxyTimeoutSec) { this.rtpProxyTimeoutSec = rtpProxyTimeoutSec; } public String getRtspAuthBasic() { return rtspAuthBasic; } public void setRtspAuthBasic(String rtspAuthBasic) { this.rtspAuthBasic = rtspAuthBasic; } public String getRtspHandshakeSecond() { return rtspHandshakeSecond; } public void setRtspHandshakeSecond(String rtspHandshakeSecond) { this.rtspHandshakeSecond = rtspHandshakeSecond; } public String getRtspKeepAliveSecond() { return rtspKeepAliveSecond; } public void setRtspKeepAliveSecond(String rtspKeepAliveSecond) { this.rtspKeepAliveSecond = rtspKeepAliveSecond; } public int getRtspPort() { return rtspPort; } public void setRtspPort(int rtspPort) { this.rtspPort = rtspPort; } public int getRtspSSlport() { return rtspSSlport; } public void setRtspSSlport(int rtspSSlport) { this.rtspSSlport = rtspSSlport; } public String getShellMaxReqSize() { return shellMaxReqSize; } public void setShellMaxReqSize(String shellMaxReqSize) { this.shellMaxReqSize = shellMaxReqSize; } public String getShellPhell() { return shellPhell; } public void setShellPhell(String shellPhell) { this.shellPhell = shellPhell; } public Float getHookAliveInterval() { return hookAliveInterval; } public void setHookAliveInterval(Float hookAliveInterval) { this.hookAliveInterval = hookAliveInterval; } public String getPortRange() { return portRange; } public void setPortRange(String portRange) { this.portRange = portRange; } public String getApiSnapRoot() { return apiSnapRoot; } public void setApiSnapRoot(String apiSnapRoot) { this.apiSnapRoot = apiSnapRoot; } public String getApiDefaultSnap() { return apiDefaultSnap; } public void setApiDefaultSnap(String apiDefaultSnap) { this.apiDefaultSnap = apiDefaultSnap; } public String getFfmpegSnap() { return ffmpegSnap; } public void setFfmpegSnap(String ffmpegSnap) { this.ffmpegSnap = ffmpegSnap; } public String getFfmpegRestartSec() { return ffmpegRestartSec; } public void setFfmpegRestartSec(String ffmpegRestartSec) { this.ffmpegRestartSec = ffmpegRestartSec; } public String getProtocolModifyStamp() { return protocolModifyStamp; } public void setProtocolModifyStamp(String protocolModifyStamp) { this.protocolModifyStamp = protocolModifyStamp; } public String getProtocolEnableAudio() { return protocolEnableAudio; } public void setProtocolEnableAudio(String protocolEnableAudio) { this.protocolEnableAudio = protocolEnableAudio; } public String getProtocolAddMuteAudio() { return protocolAddMuteAudio; } public void setProtocolAddMuteAudio(String protocolAddMuteAudio) { this.protocolAddMuteAudio = protocolAddMuteAudio; } public String getProtocolContinuePushMs() { return protocolContinuePushMs; } public void setProtocolContinuePushMs(String protocolContinuePushMs) { this.protocolContinuePushMs = protocolContinuePushMs; } public String getProtocolEnableHls() { return protocolEnableHls; } public void setProtocolEnableHls(String protocolEnableHls) { this.protocolEnableHls = protocolEnableHls; } public String getProtocolEnableMp4() { return protocolEnableMp4; } public void setProtocolEnableMp4(String protocolEnableMp4) { this.protocolEnableMp4 = protocolEnableMp4; } public String getProtocolEnableRtsp() { return protocolEnableRtsp; } public void setProtocolEnableRtsp(String protocolEnableRtsp) { this.protocolEnableRtsp = protocolEnableRtsp; } public String getProtocolEnableRtmp() { return protocolEnableRtmp; } public void setProtocolEnableRtmp(String protocolEnableRtmp) { this.protocolEnableRtmp = protocolEnableRtmp; } public String getProtocolEnableTs() { return protocolEnableTs; } public void setProtocolEnableTs(String protocolEnableTs) { this.protocolEnableTs = protocolEnableTs; } public String getProtocolEnableFmp4() { return protocolEnableFmp4; } public void setProtocolEnableFmp4(String protocolEnableFmp4) { this.protocolEnableFmp4 = protocolEnableFmp4; } public String getProtocolMp4AsPlayer() { return protocolMp4AsPlayer; } public void setProtocolMp4AsPlayer(String protocolMp4AsPlayer) { this.protocolMp4AsPlayer = protocolMp4AsPlayer; } public String getProtocolMp4MaxSecond() { return protocolMp4MaxSecond; } public void setProtocolMp4MaxSecond(String protocolMp4MaxSecond) { this.protocolMp4MaxSecond = protocolMp4MaxSecond; } public String getProtocolMp4SavePath() { return protocolMp4SavePath; } public void setProtocolMp4SavePath(String protocolMp4SavePath) { this.protocolMp4SavePath = protocolMp4SavePath; } public String getProtocolHlsSavePath() { return protocolHlsSavePath; } public void setProtocolHlsSavePath(String protocolHlsSavePath) { this.protocolHlsSavePath = protocolHlsSavePath; } public String getProtocolHlsDemand() { return protocolHlsDemand; } public void setProtocolHlsDemand(String protocolHlsDemand) { this.protocolHlsDemand = protocolHlsDemand; } public String getProtocolRtspDemand() { return protocolRtspDemand; } public void setProtocolRtspDemand(String protocolRtspDemand) { this.protocolRtspDemand = protocolRtspDemand; } public String getProtocolRtmpDemand() { return protocolRtmpDemand; } public void setProtocolRtmpDemand(String protocolRtmpDemand) { this.protocolRtmpDemand = protocolRtmpDemand; } public String getProtocolTsDemand() { return protocolTsDemand; } public void setProtocolTsDemand(String protocolTsDemand) { this.protocolTsDemand = protocolTsDemand; } public String getProtocolFmp4Demand() { return protocolFmp4Demand; } public void setProtocolFmp4Demand(String protocolFmp4Demand) { this.protocolFmp4Demand = protocolFmp4Demand; } public String getGeneralResetWhenRePlay() { return generalResetWhenRePlay; } public void setGeneralResetWhenRePlay(String generalResetWhenRePlay) { this.generalResetWhenRePlay = generalResetWhenRePlay; } public String getGeneralMergeWriteMS() { return generalMergeWriteMS; } public void setGeneralMergeWriteMS(String generalMergeWriteMS) { this.generalMergeWriteMS = generalMergeWriteMS; } public String getGeneralWaitTrackReadyMs() { return generalWaitTrackReadyMs; } public void setGeneralWaitTrackReadyMs(String generalWaitTrackReadyMs) { this.generalWaitTrackReadyMs = generalWaitTrackReadyMs; } public String getGeneralWaitAddTrackMs() { return generalWaitAddTrackMs; } public void setGeneralWaitAddTrackMs(String generalWaitAddTrackMs) { this.generalWaitAddTrackMs = generalWaitAddTrackMs; } public String getGeneralUnreadyFrameCache() { return generalUnreadyFrameCache; } public void setGeneralUnreadyFrameCache(String generalUnreadyFrameCache) { this.generalUnreadyFrameCache = generalUnreadyFrameCache; } public String getHlsSegRetain() { return hlsSegRetain; } public void setHlsSegRetain(String hlsSegRetain) { this.hlsSegRetain = hlsSegRetain; } public String getHlsBroadcastRecordTs() { return hlsBroadcastRecordTs; } public void setHlsBroadcastRecordTs(String hlsBroadcastRecordTs) { this.hlsBroadcastRecordTs = hlsBroadcastRecordTs; } public String getHlsDeleteDelaySec() { return hlsDeleteDelaySec; } public void setHlsDeleteDelaySec(String hlsDeleteDelaySec) { this.hlsDeleteDelaySec = hlsDeleteDelaySec; } public String getHlsSegKeep() { return hlsSegKeep; } public void setHlsSegKeep(String hlsSegKeep) { this.hlsSegKeep = hlsSegKeep; } public String getHookOnServerStarted() { return hookOnServerStarted; } public void setHookOnServerStarted(String hookOnServerStarted) { this.hookOnServerStarted = hookOnServerStarted; } public String getHookOnServerKeepalive() { return hookOnServerKeepalive; } public void setHookOnServerKeepalive(String hookOnServerKeepalive) { this.hookOnServerKeepalive = hookOnServerKeepalive; } public String getHookOnSendRtpStopped() { return hookOnSendRtpStopped; } public void setHookOnSendRtpStopped(String hookOnSendRtpStopped) { this.hookOnSendRtpStopped = hookOnSendRtpStopped; } public String getHookOnRtpServerTimeout() { return hookOnRtpServerTimeout; } public void setHookOnRtpServerTimeout(String hookOnRtpServerTimeout) { this.hookOnRtpServerTimeout = hookOnRtpServerTimeout; } public String getTranscodeSuffix() { return transcodeSuffix; } public void setTranscodeSuffix(String transcodeSuffix) { this.transcodeSuffix = transcodeSuffix; } } ycl-server/pom.xml
@@ -18,6 +18,13 @@ <dependencies> <!--视频处理--> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.7</version> </dependency> <!--netty--> <dependency> <groupId>io.netty</groupId> ycl-server/src/main/java/com/ycl/platform/mapper/DeviceInfoMapper.java
New file @@ -0,0 +1,22 @@ package com.ycl.platform.mapper; import com.ycl.platform.domain.entity.DeviceInfo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.platform.domain.vo.DeviceInfoVO; import com.ycl.platform.domain.form.DeviceInfoForm; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * 国标级联同步数据 Mapper 接口 * * @author xp * @since 2024-08-21 */ @Mapper public interface DeviceInfoMapper extends BaseMapper<DeviceInfo> { } ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.platform.domain.entity.WorkOrder; import com.ycl.platform.domain.query.*; import com.ycl.platform.domain.vo.DeviceInfoVO; import com.ycl.platform.domain.vo.WorkOrderVO; import com.ycl.platform.domain.vo.YwPointJobVO; import com.ycl.platform.domain.vo.screen.ScreenWorkOrderVO; @@ -63,4 +64,10 @@ * @return 数据 */ List<WorkOrderRegionVO> workOrderRegion(DashboardQuery dashboardQuery); /** * 查询工单设备信息 * @return */ List<DeviceInfoVO> hasErrorWorkOrderList(); } ycl-server/src/main/java/com/ycl/platform/service/DeviceInfoService.java
New file @@ -0,0 +1,15 @@ package com.ycl.platform.service; import com.ycl.platform.domain.entity.DeviceInfo; import com.baomidou.mybatisplus.extension.service.IService; /** * 国标级联同步数据 服务类 * * @author xp * @since 2024-08-21 */ public interface DeviceInfoService extends IService<DeviceInfo> { } ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java
@@ -4,6 +4,7 @@ import com.ycl.platform.domain.entity.WorkOrder; import com.ycl.platform.domain.form.*; import com.ycl.platform.domain.query.*; import com.ycl.platform.domain.vo.DeviceInfoVO; import com.ycl.platform.domain.vo.DistributeWorkOrderVO; import com.ycl.platform.domain.vo.screen.WorkOrderRegionVO; import com.ycl.platform.domain.vo.screen.WorkOrderTotalVO; @@ -175,4 +176,29 @@ */ List<WorkOrderRegionVO> workOrderRegion(DashboardQuery dashboardQuery); /** * 工单设备点播获取一帧图片 * * @param deviceId 设备国标码 * @param channelId 设备通道编号 * @return 数据 */ String getFrameImgByDevice(String deviceId, String channelId); /** * 查询工单:已下发、已处理、已完成的工单 * * @return 数据 */ List<DeviceInfoVO> hasErrorWorkOrderList(); /** * 查询工单:已下发、已处理、已完成的工单 * * @param workOrderId 工单ID * @param imgPath 图像地址 * @return 数据 */ void updateImgById(Integer workOrderId, String imgPath); } ycl-server/src/main/java/com/ycl/platform/service/impl/DeviceInfoServiceImpl.java
New file @@ -0,0 +1,23 @@ package com.ycl.platform.service.impl; import com.ycl.platform.domain.entity.DeviceInfo; import com.ycl.platform.mapper.DeviceInfoMapper; import com.ycl.platform.service.DeviceInfoService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; /** * 国标级联同步数据 服务实现类 * * @author xp * @since 2024-08-21 */ @Service @RequiredArgsConstructor public class DeviceInfoServiceImpl extends ServiceImpl<DeviceInfoMapper, DeviceInfo> implements DeviceInfoService { private final DeviceInfoMapper deviceInfoMapper; } ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -1,14 +1,18 @@ package com.ycl.platform.service.impl; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.config.PlatformConfig; import com.ycl.config.ServerConfig; import com.ycl.exception.ServiceException; import com.ycl.platform.domain.entity.*; import com.ycl.platform.domain.form.*; import com.ycl.platform.domain.query.*; import com.ycl.platform.domain.vo.DeviceInfoVO; import com.ycl.platform.domain.vo.DistributeWorkOrderVO; import com.ycl.platform.domain.vo.WorkOrderVO; import com.ycl.platform.domain.vo.WorkOrderYwConditionRecordVO; @@ -20,6 +24,8 @@ import com.ycl.platform.service.WorkOrderAuditingRecordService; import com.ycl.platform.service.WorkOrderService; import com.ycl.platform.service.YwPointService; import com.ycl.platform.wvp.StreamContent; import com.ycl.platform.wvp.WVPResult; import com.ycl.system.Result; import com.ycl.system.domain.SysConfig; import com.ycl.system.mapper.SysConfigMapper; @@ -27,20 +33,29 @@ import com.ycl.system.page.PageUtil; import com.ycl.utils.DateUtils; import com.ycl.utils.SecurityUtils; import com.ycl.utils.http.HttpUtils; import com.ycl.utils.redis.RedisCache; import com.ycl.utils.uuid.IdUtils; import enumeration.general.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.Java2DFrameConverter; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; @@ -66,6 +81,10 @@ private final WorkOrderDistributeRecordMapper workOrderDistributeRecordMapper; private final TMonitorMapper monitorMapper; private final SysConfigMapper configMapper; private final ServerConfig serverConfig; @Value("${rtsp.server:http://127.0.0.1:7788}") private String rtspServer; private final String DISTRIBUTE_LOCK_KEY = "distributeLock"; private final static String IMPORTANT = "important"; @@ -557,4 +576,53 @@ public List<WorkOrderRegionVO> workOrderRegion(DashboardQuery dashboardQuery) { return baseMapper.workOrderRegion(dashboardQuery); } @Override public String getFrameImgByDevice(String deviceId, String channelId) { String url = String.format(this.rtspServer + "/start/%s/%s", deviceId, channelId); String result = HttpUtils.sendGet(url); WVPResult wvpResult = JSON.parseObject(result, WVPResult.class); if (0 == wvpResult.getCode()) { StreamContent data = (StreamContent) wvpResult.getData(); String rtspUrl = data.getRtsp(); if (StringUtils.hasText(rtspUrl)) { try { // 创建FFmpegFrameGrabber对象 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtspUrl); grabber.start(); // 开始捕获 Frame frame; if ((frame = grabber.grabFrame()) != null) { // 将帧转换为图片 Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage image = converter.convert(frame); File outputfile = new File(serverConfig.getUrl() + PlatformConfig.getUploadPath() + deviceId + IdUtils.fastSimpleUUID() + ".png"); ImageIO.write(image, "png", outputfile); String imgPath = outputfile.getAbsolutePath(); System.out.println("Saved " + imgPath); return imgPath; } grabber.stop(); // 停止捕获 grabber.release(); // 释放资源 } catch (IOException e) { e.printStackTrace(); } } } return null; } @Override public List<DeviceInfoVO> hasErrorWorkOrderList() { List<DeviceInfoVO> list = baseMapper.hasErrorWorkOrderList(); return list; } @Override public void updateImgById(Integer workOrderId, String imgPath) { new LambdaUpdateChainWrapper<>(baseMapper) .eq(WorkOrder::getId, workOrderId) .set(WorkOrder::getYwCheckCondition, imgPath); } } ycl-server/src/main/java/com/ycl/task/WorkOrderImgTask.java
New file @@ -0,0 +1,48 @@ package com.ycl.task; import com.ycl.platform.domain.vo.DeviceInfoVO; import com.ycl.platform.service.WorkOrderService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 工单恢复图片获取 * * @author:xp * @date:2024/8/21 11:56 */ @RequiredArgsConstructor @Component("workOrderImgTask") public class WorkOrderImgTask { private final WorkOrderService workOrderService; private static final ExecutorService executorService = new ThreadPoolExecutor(8, 24, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new ThreadPoolExecutor.CallerRunsPolicy() ); public void run() { // 查出故障的设备 List<DeviceInfoVO> deviceList = workOrderService.hasErrorWorkOrderList(); for (DeviceInfoVO deviceInfo : deviceList) { executorService.submit(() -> { String frameImg = workOrderService.getFrameImgByDevice(deviceInfo.getDeviceId(), deviceInfo.getChannelId()); if (StringUtils.hasText(frameImg)) { workOrderService.updateImgById(deviceInfo.getWorkOrderId(), frameImg); } }); } } } ycl-server/src/main/resources/application-dev.yml
@@ -138,3 +138,7 @@ passwd: Yesc@123 apikey: 72fcfd6825304f7fa0453134de620f3a accesskey: fc9503a521544e76a8e69b912a2f177bc6362b19 # gb281视频网关地址,用于获取rtsp格式的流地址 rtsp: server: http://192.168.3.88:7788 ycl-server/src/main/resources/application-prod.yml
@@ -138,3 +138,7 @@ passwd: Yesc@123 apikey: 72fcfd6825304f7fa0453134de620f3a accesskey: fc9503a521544e76a8e69b912a2f177bc6362b19 # gb281视频网关地址,用于获取rtsp格式的流地址 rtsp: server: http://192.168.3.88:7788 ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -171,4 +171,14 @@ ORDER BY d.dept_id </select> <select id="hasErrorWorkOrderList" resultType="com.ycl.platform.domain.vo.DeviceInfoVO"> SELECT wo.id as workOrderId, di.device_id, di.channel_id FROM t_work_order wo INNER JOIN t_device_info di ON wo.serial_number = di.device_id </select> </mapper>