在流媒体日趋成熟的今天,大家每天都会刷大量视频,又或者拥有一部手机就能远程查看家里的监控;那作为新手的你,怎么从无到有打造自己的流媒体平台呢?这里我们选用wvp+ZLMediaKit开源平台,WEB VIDEO PLATFORM(wvp)是一个基于GB28181-2016标准实现的网络视频平台,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。
支持国标级联,支持rtsp/rtmp等视频流转发到国标平台,支持rtsp/rtmp等推流转发到国标平台。
一、准备工作1.安装所需工具maven(管理java代码依赖)、ffmpeg、nodejs(版本根据自己项目的需要安装,我本人安装的是v16.15.0)、git工具、npm/yarn、IntelliJ IDEA(jdk我用的是1.8)、Visual Studio 2017(可根据个人情况下载不同版本,本人使用的是2017,windows最好也用这个版本)、cmake、redis、mysql(工具本人用的是Navicat Premium 15);vue编辑器可自行选择,我使用的是HBuilder X。
2.从github克隆zlm代码# 国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKitcd ZLMediaKit# 千万不要忘记执行这句命令git submodule update --init3.同理克隆wvp代码git clone https://github.com/648540858/wvp-GB28181-pro.git二、开始编译工作1.编译前端代码前端代码采用的是vue+element编写,所以你如果想要深入学习,可以相应的去熟悉一下vue的语法和element的组件用法。
# 进入前端目录cd wvp-GB28181-pro/web_src/# 安装依赖命令npm --registry=https://registry.npm.taobao.org install# 打包命令npm run build# 本地运行命令npm run dev# 当然,如果你喜欢用yarn,这里也可以换成yarn命令去操作,具体实现可以自行研究一下2.编译wvp在编译之前,我们需要对配置文件进行配置,项目目录如下所示:项目文件目录预览该项目数据库在sql文件夹里,点击打开之后就会看到一个sql文件。
数据库文件开发者可以自行导入数据库里。
随着wvp版本更新,数据库可能会有差异,具体以实际文件为准。
数据库表预览(具体以新版本数据库为准)项目配置文件位于srcmainresources目录下,如果开发者采用打包即用,不用指定配置文件的情况下,可以修改application-local.yml,如果指定其他配置文件,可以在application.yml里修改。
配置文件路径预览注意,以下配置的操作都是在application-local.yml配置文件里完成。
(1)配置数据库spring: devtools: restart: additional-paths: src/main/java thymeleaf: cache: false # 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: # 使用mysql 打开23-28行注释, 删除29-36行 # name: eiot # url: jdbc:sqlite::resource:wvp.sqlite # username: # password: # type: com.alibaba.druid.pool.DruidDataSource # driver-class-name: org.sqlite.JDBC name: wvp url: jdbc:mysql://127.0.0.1:3306/wvp-1?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=UTC username: root password: root type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver(2)配置server服务器启动端口# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口server: port: 18080(3)28181服务配置# 作为28181服务器的配置sip: # [必须修改] 本机的IP,这里是我本地ip ip: 10.10.10.110 # [可选] 28181服务监听的端口 port: 6060 # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。
国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) # 后两位为行业编码,定义参照附录D.3 # 3701020049标识山东济南历下区 信息行业接入 # [可选] domain: 4401020049 # [可选] id: 44010200492000000001 # [可选] 默认设备认证密码,移除密码将不进行校验 password: 1234567890(4)zlm默认服务器配置(wvp启动的时候会去寻找默认的zlm服务器)#zlm 默认服务器配置media: # [必须修改] zlm服务器唯一id,用于触发hook时区别是哪台服务器,general.mediaServerId id: # [必须修改] zlm服务器的内网IP ip: 10.10.10.110 # [可选] 返回流地址时的ip,置空使用 media.ip stream-ip: # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip sdp-ip: # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip hook-ip: # [必须修改] zlm服务器的http.port http-port: 80 # [可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置 http-ssl-port: # [可选] zlm服务器的rtmp.port, 置空使用zlm配置文件配置 rtmp-port: # [可选] zlm服务器的rtmp.sslport, 置空使用zlm配置文件配置 rtmp-ssl-port: # [可选] zlm服务器的 rtp_proxy.port, 置空使用zlm配置文件配置 rtp-proxy-port: # [可选] zlm服务器的 rtsp.port, 置空使用zlm配置文件配置 rtsp-port: # [可选] zlm服务器的 rtsp.sslport, 置空使用zlm配置文件配置 rtsp-ssl-port: # [可选] 是否自动配置ZLM, 如果希望手动配置ZLM, 可以设为false, 不建议新接触的用户修改 auto-config: true # [可选] zlm服务器的hook.admin_params=secret secret: hgfgfhky-m87t-p09u-ayth-u76tyred25cc # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。
单端口使用流的ssrc区分, 点播超时建议使用多端口测试 rtp: # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输 enable: true # [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功 port-range: 30000,30500 # 端口范围 # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用 record-assist-port: 0(5)其他配置(具体可根据业务自行调整)# [根据业务需求配置]user-settings: # 推流直播是否录制 record-push-live: true auto-apply-play: false # [可选] 部分设备需要扩展SDP,需要打开此设置 senior-sdp: false # 保存移动位置历史轨迹:true:保留历史数据,false:仅保留最后的位置(默认) save-position-history: false # 点播/录像回放 等待超时时间,单位:毫秒 play-timeout: 18000 # 上级点播等待超时时间,单位:毫秒 platform-play-timeout: 60000 # 是否开启接口鉴权 interface-authentication: true # 接口鉴权例外的接口, 即不进行接口鉴权的接口,尽量详细书写,尽量不用/**,至少两级目录 interface-authentication-excludes: - /api/v1/** # 国标是否录制 record-sip: true # 是否将日志存储进数据库 logInDatebase: true # 使用推流状态作为推流通道状态 use-pushing-as-status: true # 使用