增加zlm代理的secret自动添加, 增加配置文件的默认值,缺少非关键参数不会无法启动,简化配置文件给新手带来的压力,前端使用wvp代理流。
| | |
| | | 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;
|
| | |
| | | System.exit(1); |
| | | } |
| | | |
| | | if (mediaConfig.getIp().equals("localhost") || (mediaConfig.getIp().equals("127.0.0.1") && mediaConfig.getWanIp() == null)) { |
| | | logger.warn("mediaIp.ip使用 {} ,将无法收到网络内其他设备的推流!!!", mediaConfig.getIp() ); |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | 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 { |
| | |
| | | @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}") |
| | |
| | | |
| | | public void setIp(String ip) { |
| | | this.ip = ip; |
| | | } |
| | | |
| | | public String getWanIp() { |
| | | return wanIp; |
| | | } |
| | | |
| | | public void setWanIp(String wanIp) { |
| | | this.wanIp = wanIp; |
| | | } |
| | | |
| | | public String getHookIp() { |
| | |
| | | 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; |
| | | } |
| | | } |
| | |
| | | |
| | | 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; |
| | |
| | | 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 |
| | |
| | | |
| | | @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"); |
| | | } |
| | |
| | | } |
| | | |
| | | 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()); |
| | |
| | | |
| | | @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; |
| | | } |
| | |
| | | |
| | | @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}") |
| | |
| | | */ |
| | | private Long registerTimeMillis; |
| | | |
| | | |
| | | /** |
| | | * 心跳时间 |
| | | */ |
| | | private Long KeepaliveTimeMillis; |
| | | |
| | | /** |
| | | * 通道个数 |
| | | */ |
| | |
| | | public void setRegisterTimeMillis(Long registerTimeMillis) { |
| | | this.registerTimeMillis = registerTimeMillis; |
| | | } |
| | | |
| | | public Long getKeepaliveTimeMillis() { |
| | | return KeepaliveTimeMillis; |
| | | } |
| | | |
| | | public void setKeepaliveTimeMillis(Long keepaliveTimeMillis) { |
| | | KeepaliveTimeMillis = keepaliveTimeMillis; |
| | | } |
| | | } |
| | |
| | | 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()) {
|
| | |
| | | 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;
|
| | |
| | | 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");
|
| | |
| | | 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");
|
| | |
| | | package com.genersoft.iot.vmp.media.zlm; |
| | | |
| | | import com.alibaba.fastjson.annotation.JSONField; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | public class ZLMServerConfig { |
| | | |
| | |
| | | @JSONField(name = "general.streamNoneReaderDelayMS") |
| | | private String generalStreamNoneReaderDelayMS; |
| | | |
| | | private String localIP; |
| | | private String ip; |
| | | |
| | | private String wanIp; |
| | | private String sdpIp; |
| | | |
| | | private long updateTime; |
| | | |
| | |
| | | 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() { |
| | |
| | | this.shellPhell = shellPhell; |
| | | } |
| | | |
| | | public String getWanIp() { |
| | | return wanIp; |
| | | } |
| | | |
| | | public void setWanIp(String wanIp) { |
| | | this.wanIp = wanIp; |
| | | } |
| | | |
| | | public long getUpdateTime() { |
| | | return updateTime; |
| | | } |
| | |
| | | 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; |
| | | } |
| | | } |
| | |
| | | |
| | | 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())) |
| | |
| | | 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; |
| | | } |
| | |
| | | // 后续改为根据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()) |
New file |
| | |
| | | |
| | | |
| | | |
| | | # 此配置文件只是用作展示所有配置项, 不可不直接使用 |
| | | |
| | | |
| | | 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 |
| | |
| | | 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: |
| | |
| | | # [可选] 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 |
| | |
| | | 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范围内选择端口用于媒体流传输 |
| | |
| | | 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: |
| | |
| | | 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 |
| | |
| | | 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; |
| | |
| | | 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('关闭视频'); |
| | |
| | | }).then(function (res) { |
| | | var streamInfo = res.data; |
| | | that.streamId = streamInfo.streamId; |
| | | that.videoUrl = streamInfo.ws_flv; |
| | | that.videoUrl = this.getUrlByStreamInfo(streamInfo); |
| | | that.recordPlay = true; |
| | | }); |
| | | } |
| | |
| | | |
| | | Vue.prototype.$cookies.config(60*30); |
| | | |
| | | |
| | | new Vue({ |
| | | router: router, |
| | | render: h => h(App), |