增加zlm代理的secret自动添加, 增加配置文件的默认值,缺少非关键参数不会无法启动,简化配置文件给新手带来的压力,前端使用wvp代理流。
16个文件已修改
1个文件已添加
419 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/ApplicationCheckRunner.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerManger.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/record/RecoderProxyController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/all-application.yml 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/dialog/devicePlayer.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/main.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
@@ -3,6 +3,7 @@
import java.util.logging.LogManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import springfox.documentation.oas.annotations.EnableOpenApi;
src/main/java/com/genersoft/iot/vmp/conf/ApplicationCheckRunner.java
@@ -31,9 +31,5 @@
            System.exit(1);
        }
        if (mediaConfig.getIp().equals("localhost") || (mediaConfig.getIp().equals("127.0.0.1") && mediaConfig.getWanIp() == null)) {
            logger.warn("mediaIp.ip使用 {} ,将无法收到网络内其他设备的推流!!!", mediaConfig.getIp() );
        }
    }
}
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
@@ -1,7 +1,9 @@
package com.genersoft.iot.vmp.conf;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
@Configuration("mediaConfig")
public class MediaConfig {
@@ -9,40 +11,40 @@
    @Value("${media.ip}")
    private String ip;
    @Value("${media.wanIp}")
    private String wanIp;
    @Value("${media.hookIp}")
    @Value("${media.hookIp:${sip.ip}}")
    private String hookIp;
    @Value("${media.sdpIp:${media.ip}}")
    private String sdpIp;
    @Value("${media.httpPort}")
    private String httpPort;
    @Value("${media.httpSSlPort}")
    @Value("${media.httpSSlPort:}")
    private String httpSSlPort;
    @Value("${media.rtmpPort}")
    @Value("${media.rtmpPort:}")
    private String rtmpPort;
    @Value("${media.rtmpSSlPort}")
    @Value("${media.rtmpSSlPort:}")
    private String rtmpSSlPort;
    @Value("${media.rtpProxyPort}")
    @Value("${media.rtpProxyPort:}")
    private String rtpProxyPort;
    @Value("${media.rtspPort}")
    @Value("${media.rtspPort:}")
    private String rtspPort;
    @Value("${media.rtspSSLPort}")
    @Value("${media.rtspSSLPort:}")
    private String rtspSSLPort;
    @Value("${media.autoConfig}")
    @Value("${media.autoConfig:true}")
    private boolean autoConfig;
    @Value("${media.secret}")
    private String secret;
    @Value("${media.streamNoneReaderDelayMS}")
    @Value("${media.streamNoneReaderDelayMS:18000}")
    private String streamNoneReaderDelayMS;
    @Value("${media.rtp.enable}")
@@ -60,14 +62,6 @@
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getWanIp() {
        return wanIp;
    }
    public void setWanIp(String wanIp) {
        this.wanIp = wanIp;
    }
    public String getHookIp() {
@@ -185,4 +179,16 @@
    public void setRecordAssistPort(int recordAssistPort) {
        this.recordAssistPort = recordAssistPort;
    }
    public String getSdpIp() {
        if (StringUtils.isEmpty(sdpIp)) {
            return ip;
        }else {
            return sdpIp;
        }
    }
    public void setSdpIp(String sdpIp) {
        this.sdpIp = sdpIp;
    }
}
src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java
@@ -2,6 +2,8 @@
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.HttpClientBuilder;
import org.mitre.dsmiley.httpproxy.ProxyServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -12,9 +14,14 @@
import org.springframework.util.StringUtils;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.ConnectException;
import java.util.Locale;
import java.util.Map;
@Configuration
@@ -27,10 +34,10 @@
    @Bean
    public ServletRegistrationBean zlmServletRegistrationBean(){
        String ip = StringUtils.isEmpty(mediaConfig.getWanIp())? mediaConfig.getIp(): mediaConfig.getWanIp();
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ZLMProxySerlet(),"/zlm/*");
        servletRegistrationBean.setName("zlm_Proxy");
        servletRegistrationBean.addInitParameter("targetUri", String.format("http://%s:%s", ip, mediaConfig.getHttpPort()));
        servletRegistrationBean.addInitParameter("targetUri", String.format("http://%s:%s", mediaConfig.getIp(), mediaConfig.getHttpPort()));
        servletRegistrationBean.addUrlMappings();
        if (logger.isDebugEnabled()) {
            servletRegistrationBean.addInitParameter("log", "true");
        }
@@ -38,6 +45,21 @@
    }
    class  ZLMProxySerlet extends ProxyServlet{
        @Override
        protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
            String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
            if (queryStr != null) {
                queryStr += "&";
            }else {
                queryStr = "?";
            }
            queryStr += "secret=" + mediaConfig.getSecret();
            return queryStr;
        }
        @Override
        protected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResonse, Exception e){
            System.out.println(e.getMessage());
src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java
@@ -9,18 +9,32 @@
    @Value("${sip.ip}")
    private String sipIp;
    /**
     * 默认使用sip.ip
     */
    @Value("${sip.monitorIp:0.0.0.0}")
    private String monitorIp;
    @Value("${sip.port}")
    private Integer sipPort;
    @Value("${sip.domain}")
    private String sipDomain;
    @Value("${sip.id}")
    private String sipId;
    @Value("${sip.password}")
    private String sipPassword;
    
    @Value("${sip.ptz.speed:50}")
    Integer speed;
    public String getMonitorIp() {
        return monitorIp;
    }
    public String getSipIp() {
        return sipIp;
    }
src/main/java/com/genersoft/iot/vmp/conf/UserSetup.java
@@ -5,19 +5,19 @@
@Configuration("userSetup")
public class UserSetup {
    @Value("${userSettings.savePositionHistory}")
    @Value("${userSettings.savePositionHistory:false}")
    boolean savePositionHistory;
    @Value("${userSettings.autoApplyPlay}")
    private boolean autoApplyPlay;
    @Value("${userSettings.seniorSdp}")
    @Value("${userSettings.seniorSdp:false}")
    private boolean seniorSdp;
    @Value("${userSettings.playTimeout}")
    @Value("${userSettings.playTimeout:18000}")
    private long playTimeout;
    @Value("${userSettings.waitTrack}")
    @Value("${userSettings.waitTrack:false}")
    private boolean waitTrack;
    @Value("${userSettings.interfaceAuthentication}")
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
@@ -68,6 +68,12 @@
     */
    private Long registerTimeMillis;
    /**
     * 心跳时间
     */
    private Long KeepaliveTimeMillis;
    /**
     * 通道个数
     */
@@ -176,4 +182,12 @@
    public void setRegisterTimeMillis(Long registerTimeMillis) {
        this.registerTimeMillis = registerTimeMillis;
    }
    public Long getKeepaliveTimeMillis() {
        return KeepaliveTimeMillis;
    }
    public void setKeepaliveTimeMillis(Long keepaliveTimeMillis) {
        KeepaliveTimeMillis = keepaliveTimeMillis;
    }
}
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -379,9 +379,9 @@
            StringBuffer content = new StringBuffer(200);
            content.append("v=0\r\n");
//            content.append("o=" + sipConfig.getSipId() + " 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
            content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
            content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getSdpIp()+"\r\n");
            content.append("s=Play\r\n");
            content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
            content.append("c=IN IP4 "+mediaInfo.getSdpIp()+"\r\n");
            content.append("t=0 0\r\n");
            if (userSetup.isSeniorSdp()) {
@@ -482,7 +482,7 @@
            content.append("o="+sipConfig.getSipId()+" 0 0 IN IP4 "+sipConfig.getSipIp()+"\r\n");
            content.append("s=Playback\r\n");
            content.append("u="+channelId+":0\r\n");
            content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
            content.append("c=IN IP4 "+mediaInfo.getSdpIp()+"\r\n");
            content.append("t="+DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime)+" "
                    +DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) +"\r\n");
            String mediaPort = null;
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -198,9 +198,9 @@
                        ZLMServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
                        StringBuffer content = new StringBuffer(200);
                        content.append("v=0\r\n");
                        content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
                        content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getSdpIp()+"\r\n");
                        content.append("s=Play\r\n");
                        content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
                        content.append("c=IN IP4 "+mediaInfo.getSdpIp()+"\r\n");
                        content.append("t=0 0\r\n");
                        content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n");
                        content.append("a=sendonly\r\n");
@@ -254,9 +254,9 @@
                    ZLMServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
                    StringBuffer content = new StringBuffer(200);
                    content.append("v=0\r\n");
                    content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
                    content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getSdpIp()+"\r\n");
                    content.append("s=Play\r\n");
                    content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
                    content.append("c=IN IP4 "+mediaInfo.getSdpIp()+"\r\n");
                    content.append("t=0 0\r\n");
                    content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n");
                    content.append("a=sendonly\r\n");
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerConfig.java
@@ -1,6 +1,7 @@
package com.genersoft.iot.vmp.media.zlm;
import com.alibaba.fastjson.annotation.JSONField;
import org.springframework.util.StringUtils;
public class ZLMServerConfig {
@@ -34,9 +35,9 @@
    @JSONField(name = "general.streamNoneReaderDelayMS")
    private String generalStreamNoneReaderDelayMS;
    private String localIP;
    private String ip;
    private String wanIp;
    private String sdpIp;
    private long updateTime;
@@ -281,12 +282,12 @@
        this.generalStreamNoneReaderDelayMS = generalStreamNoneReaderDelayMS;
    }
    public String getLocalIP() {
        return localIP;
    public String getIp() {
        return ip;
    }
    public void setLocalIP(String localIP) {
        this.localIP = localIP;
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getHlsFileBufSize() {
@@ -729,14 +730,6 @@
        this.shellPhell = shellPhell;
    }
    public String getWanIp() {
        return wanIp;
    }
    public void setWanIp(String wanIp) {
        this.wanIp = wanIp;
    }
    public long getUpdateTime() {
        return updateTime;
    }
@@ -760,4 +753,16 @@
    public void setRtmpSslPort(String rtmpSslPort) {
        this.rtmpSslPort = rtmpSslPort;
    }
    public String getSdpIp() {
        if (StringUtils.isEmpty(sdpIp)) {
            return ip;
        }else {
            return sdpIp;
        }
    }
    public void setSdpIp(String sdpIp) {
        this.sdpIp = sdpIp;
    }
}
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMServerManger.java
@@ -18,8 +18,8 @@
    public void updateServerCatch(ZLMServerConfig zlmServerConfig) {
        zlmServerConfig.setLocalIP(mediaConfig.getIp());
        zlmServerConfig.setWanIp(StringUtils.isEmpty(mediaConfig.getWanIp())? mediaConfig.getIp(): mediaConfig.getWanIp());
        zlmServerConfig.setIp(mediaConfig.getIp());
        zlmServerConfig.setSdpIp(mediaConfig.getSdpIp());
        zlmServerConfig.setHttpPort(mediaConfig.getHttpPort());
        if(!StringUtils.isEmpty(mediaConfig.getHttpSSlPort()))
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -32,17 +32,17 @@
        StreamInfo streamInfoResult = new StreamInfo();
        streamInfoResult.setStreamId(stream);
        streamInfoResult.setApp(app);
        streamInfoResult.setRtmp(String.format("rtmp://%s:%s/%s/%s", mediaInfo.getWanIp(), mediaInfo.getRtmpPort(), app,  stream));
        streamInfoResult.setRtsp(String.format("rtsp://%s:%s/%s/%s", mediaInfo.getWanIp(), mediaInfo.getRtspPort(), app,  stream));
        streamInfoResult.setFlv(String.format("http://%s:%s/%s/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setWs_flv(String.format("ws://%s:%s/%s/%s.flv", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setHls(String.format("http://%s:%s/%s/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setWs_hls(String.format("ws://%s:%s/%s/%s/hls.m3u8", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setFmp4(String.format("http://%s:%s/%s/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setWs_fmp4(String.format("ws://%s:%s/%s/%s.live.mp4", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setTs(String.format("http://%s:%s/%s/%s.live.ts", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setWs_ts(String.format("ws://%s:%s/%s/%s.live.ts", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setRtc(String.format("http://%s:%s/index/api/webrtc?app=%s&stream=%s&type=play", mediaInfo.getWanIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setRtmp(String.format("rtmp://%s:%s/%s/%s", mediaInfo.getIp(), mediaInfo.getRtmpPort(), app,  stream));
        streamInfoResult.setRtsp(String.format("rtsp://%s:%s/%s/%s", mediaInfo.getIp(), mediaInfo.getRtspPort(), app,  stream));
        streamInfoResult.setFlv(String.format("http://%s:%s/%s/%s.flv", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setWs_flv(String.format("ws://%s:%s/%s/%s.flv", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setHls(String.format("http://%s:%s/%s/%s/hls.m3u8", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setWs_hls(String.format("ws://%s:%s/%s/%s/hls.m3u8", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setFmp4(String.format("http://%s:%s/%s/%s.live.mp4", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setWs_fmp4(String.format("ws://%s:%s/%s/%s.live.mp4", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setTs(String.format("http://%s:%s/%s/%s.live.ts", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setWs_ts(String.format("ws://%s:%s/%s/%s.live.ts", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setRtc(String.format("http://%s:%s/index/api/webrtc?app=%s&stream=%s&type=play", mediaInfo.getIp(), mediaInfo.getHttpPort(), app,  stream));
        streamInfoResult.setTracks(tracks);
        return streamInfoResult;
    }
src/main/java/com/genersoft/iot/vmp/vmanager/record/RecoderProxyController.java
@@ -48,7 +48,7 @@
        // 后续改为根据Id获取对应的ZLM
        ZLMServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
        String requestURI = String.format("http://%s:%s%s?%s",
                mediaInfo.getLocalIP(),
                mediaInfo.getSdpIp(),
                mediaConfig.getRecordAssistPort(),
                baseRequestURI.substring(baseRequestURI.indexOf(mediaId) + mediaId.length()),
                URLDecoder.decode(request.getQueryString())
src/main/resources/all-application.yml
New file
@@ -0,0 +1,140 @@
# 此配置文件只是用作展示所有配置项, 不可不直接使用
spring:
    # REDIS数据库配置
    redis:
        # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
        host: 127.0.0.1
        # [必须修改] 端口号
        port: 6379
        # [可选] 数据库 DB
        database: 6
        # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
        password:
        # [可选] 超时时间
        timeout: 10000
    # [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置
    datasource:
        # name: wvp
        # url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
        # username:
        # password:
        # type: com.alibaba.druid.pool.DruidDataSource
        # driver-class-name: com.mysql.cj.jdbc.Driver
        name: eiot
        url: jdbc:sqlite::resource:wvp.sqlite
        username:
        password:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name:  org.sqlite.JDBC
        max-active: 1
        min-idle: 1
# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:
    port: 18080
    # [可选] HTTPS配置, 默认不开启
    ssl:
        # [可选] 是否开启HTTPS访问
        enabled: false
        # [可选] 证书文件路径,放置在resource/目录下即可,修改xxx为文件名
        key-store: classpath:xxx.jks
        # [可选] 证书密码
        key-password: password
        # [可选] 证书类型, 默认为jks,根据实际修改
        key-store-type: JKS
# 作为28181服务器的配置
sip:
    # [必须修改] 本机的IP, 必须是网卡上的IP,用于sip下协议栈监听ip,如果监听所有设置为0.0.0.0
    monitorIp: 0.0.0.0
    # [必须修改] 本机的IP
    ip: 192.168.0.100
    # [可选] 28181服务监听的端口
    port: 5060
    # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
    # 后两位为行业编码,定义参照附录D.3
    # 3701020049标识山东济南历下区 信息行业接入
    # [可选]
    domain: 4401020049
    # [可选]
    id: 44010200492000000001
    # [可选] 默认设备认证密码,后续扩展使用设备单独密码
    password: admin123
#zlm服务器配置
media:
    # [必须修改] 本机的IP, 必须是网卡上的IP,用于sip下协议栈监听ip,如果监听所有设置为0.0.0.0
    monitorIp: 0.0.0.0
    # [必须修改] zlm服务器的内网IP
    ip: 192.168.0.100
    # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip
    sdpIp:
    # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip
    hookIp:
    # [必须修改] zlm服务器的http.port
    httpPort: 80
    # [可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置
    httpSSlPort:
    # [可选] zlm服务器的rtmp.port, 置空使用zlm配置文件配置
    rtmpPort:
    # [可选] zlm服务器的rtmp.sslport, 置空使用zlm配置文件配置
    rtmpSSlPort:
    # [可选] zlm服务器的 rtp_proxy.port, 置空使用zlm配置文件配置
    rtpProxyPort:
    # [可选] zlm服务器的 rtsp.port, 置空使用zlm配置文件配置
    rtspPort:
    # [可选] zlm服务器的 rtsp.sslport, 置空使用zlm配置文件配置
    rtspSSLPort:
    # [可选] 是否自动配置ZLM, 如果希望手动配置ZLM, 可以设为false, 不建议新接触的用户修改
    autoConfig: true
    # [可选] zlm服务器的hook.admin_params=secret
    secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
    # [可选] zlm服务器的general.streamNoneReaderDelayMS
    streamNoneReaderDelayMS:  18000  # 无人观看多久自动关闭流, -1表示永不自动关闭,即 关闭按需拉流
    # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
    rtp:
        # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
        enable: true
        # [可选] 在此范围内选择端口用于媒体流传输,
        portRange: 30000,30500 # 端口范围
    # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
    recordAssistPort: 0
# [可选] 日志配置, 一般不需要改
logging:
    file:
        name: logs/wvp.log
        max-history: 30
        max-size: 10MB
        total-size-cap: 300MB
    level:
        com:
            genersoft:
                iot: info
# [根据业务需求配置]
userSettings:
    # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
    autoApplyPlay: false
    # [可选] 部分设备需要扩展SDP,需要打开此设置
    seniorSdp: false
    # 保存移动位置历史轨迹:true:保留历史数据,false:仅保留最后的位置(默认)
    savePositionHistory: false
    # 点播等待超时时间,单位:毫秒
    playTimeout: 3000
    # 等待音视频编码信息再返回, true: 可以根据编码选择合适的播放器,false: 可以更快点播
    waitTrack: false
    # 是否开启接口鉴权
    interfaceAuthentication: true
    # 推流直播是否录制
    recordPushLive: true
# 在线文档: swagger-ui(生产环境建议关闭)
springfox:
    documentation:
        swagger-ui:
            enabled: true
src/main/resources/application-dev.yml
@@ -13,12 +13,6 @@
        timeout: 10000
    # [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置
    datasource:
        # name: wvp
        # url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
        # username:
        # password:
        # type: com.alibaba.druid.pool.DruidDataSource
        # driver-class-name: com.mysql.cj.jdbc.Driver
        name: eiot
        url: jdbc:sqlite::resource:wvp.sqlite
        username:
@@ -31,20 +25,10 @@
# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:
    port: 18080
    # [可选] HTTPS配置, 默认不开启
    ssl:
        # [可选] 是否开启HTTPS访问
        enabled: false
        # [可选] 证书文件路径,放置在resource/目录下即可,修改xxx为文件名
        key-store: classpath:xxx.jks
        # [可选] 证书密码
        key-password: password
        # [可选] 证书类型, 默认为jks,根据实际修改
        key-store-type: JKS
# 作为28181服务器的配置
sip:
    # [必须修改] 本机的IP, 必须是网卡上的IP
    # [必须修改] 本机的IP
    ip: 192.168.0.100
    # [可选] 28181服务监听的端口
    port: 5060
@@ -62,30 +46,10 @@
media:
    # [必须修改] zlm服务器的内网IP
    ip: 192.168.0.100
    # [可选] zlm服务器的公网IP, 内网部署置空即可
    wanIp:
    # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip
    hookIp:
    # [必须修改] zlm服务器的http.port
    httpPort: 80
    # [可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置
    httpSSlPort:
    # [可选] zlm服务器的rtmp.port, 置空使用zlm配置文件配置
    rtmpPort:
    # [可选] zlm服务器的rtmp.sslport, 置空使用zlm配置文件配置
    rtmpSSlPort:
    # [可选] zlm服务器的 rtp_proxy.port, 置空使用zlm配置文件配置
    rtpProxyPort:
    # [可选] zlm服务器的 rtsp.port, 置空使用zlm配置文件配置
    rtspPort:
    # [可选] zlm服务器的 rtsp.sslport, 置空使用zlm配置文件配置
    rtspSSLPort:
    # [可选] 是否自动配置ZLM, 如果希望手动配置ZLM, 可以设为false, 不建议新接触的用户修改
    autoConfig: true
    # [可选] zlm服务器的hook.admin_params=secret
    secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
    # [可选] zlm服务器的general.streamNoneReaderDelayMS
    streamNoneReaderDelayMS:  18000  # 无人观看多久自动关闭流, -1表示永不自动关闭,即 关闭按需拉流
    # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
    rtp:
        # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
@@ -94,6 +58,21 @@
        portRange: 30000,30500 # 端口范围
    # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
    recordAssistPort: 0
# [根据业务需求配置]
userSettings:
    # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
    autoApplyPlay: false
    # 是否开启接口鉴权
    interfaceAuthentication: true
    # 推流直播是否录制
    recordPushLive: true
# 在线文档: swagger-ui(生产环境建议关闭)
springfox:
    documentation:
        swagger-ui:
            enabled: true
# [可选] 日志配置, 一般不需要改
logging:
@@ -105,26 +84,4 @@
    level:
        com:
            genersoft:
                iot: info
# [根据业务需求配置]
userSettings:
    # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
    autoApplyPlay: false
    # [可选] 部分设备需要扩展SDP,需要打开此设置
    seniorSdp: false
    # 保存移动位置历史轨迹:true:保留历史数据,false:仅保留最后的位置(默认)
    savePositionHistory: false
    # 点播等待超时时间,单位:毫秒
    playTimeout: 3000
    # 等待音视频编码信息再返回, true: 可以根据编码选择合适的播放器,false: 可以更快点播
    waitTrack: false
    # 是否开启接口鉴权
    interfaceAuthentication: true
    # 推流直播是否录制
    recordPushLive: true
# 在线文档: swagger-ui(生产环境建议关闭)
springfox:
    documentation:
        swagger-ui:
            enabled: true
                iot: info
web_src/src/components/dialog/devicePlayer.vue
@@ -270,10 +270,17 @@
            this.hasaudio = hasAudio;
            this.isLoging = false;
            // this.videoUrl = streamInfo.rtc;
            this.videoUrl = streamInfo.ws_flv;
            this.videoUrl = this.getUrlByStreamInfo(streamInfo);
            this.streamId = streamInfo.streamId;
            this.app = streamInfo.app;
            this.playFromStreamInfo(false, streamInfo)
        },
        getUrlByStreamInfo(streamInfo){
            let baseZlmApi = process.env.NODE_ENV === 'development'?`${location.host}/debug/zlm`:`${location.host}/zlm`
            console.log(12121212)
            console.log(baseZlmApi)
            // return `${baseZlmApi}/${streamInfo.app}/${streamInfo.streamId}.flv`;
            return `http://${baseZlmApi}/${streamInfo.app}/${streamInfo.streamId}.flv`;
        },
        coverPlay: function () {
            var that = this;
@@ -335,7 +342,7 @@
        playFromStreamInfo: function (realHasAudio, streamInfo) {
          this.showVideoDialog = true;
          this.hasaudio = realHasAudio && this.hasaudio;
          this.$refs.videoPlayer.play(streamInfo.ws_flv)
          this.$refs.videoPlayer.play(this.getUrlByStreamInfo(streamInfo))
        },
        close: function () {
            console.log('关闭视频');
@@ -418,7 +425,7 @@
                }).then(function (res) {
                    var streamInfo = res.data;
                    that.streamId = streamInfo.streamId;
                    that.videoUrl = streamInfo.ws_flv;
                    that.videoUrl = this.getUrlByStreamInfo(streamInfo);
                    that.recordPlay = true;
                });
            }
web_src/src/main.js
@@ -55,7 +55,6 @@
Vue.prototype.$cookies.config(60*30);
new Vue({
    router: router,
    render: h => h(App),