Fork me on GitHub

WVP-PRO视频服务器jar包部署(单独部署zlm)

WVP-PRO 部署实践:已有 MySQL/Redis,Docker 安装 ZLM,启动国标视频平台

环境:CentOS 8 云服务器(下文以 YOUR_SERVER_IP 表示,请替换为实际地址)
组件:MySQL · Redis · ZLMediaKit(Docker)· WVP-PRO(Java)
场景:海康 NVR 等国标设备接入、Web 管理预览

说明: 文中 IP、数据库密码、Redis 密码、ZLM secret、SIP 密码均为占位符。


一、架构一览

国标视频监控平台不是「一个 Jar 包」就完事,至少涉及四类服务:

flowchart TB subgraph 设备侧 NVR[海康 NVR / 摄像机] end subgraph 服务器 YOUR_SERVER_IP WVP[WVP-PRO :18080<br/>SIP 信令 :8116] ZLM[ZLMediaKit :9092<br/>RTP 40000-45000] MySQL[(MySQL :3315)] Redis[(Redis :6379)] end subgraph 浏览器 Web[Vue 前端 :9528 <br/>或打包进 18080] end NVR -->|GB28181 SIP| WVP NVR -->|RTP 视频流| ZLM WVP -->|REST API| ZLM ZLM -->|Web Hook| WVP WVP --> MySQL WVP --> Redis Web --> WVP
组件 作用 是否单独安装
MySQL 设备、通道、用户、节点等持久化 已有
Redis 缓存、会话、消息通道 已有
ZLMediaKit 收 RTP、转 FLV/HLS/RTSP 等 Docker 安装
WVP-PRO 国标信令 + 管理后台 API Java 启动(内置 SIP)
Vue 前端 管理界面 开发:npm run dev;生产:打包进 Jar

要点: SIP 信令在 WVP 进程内,不需要再装 FreeSWITCH 等;视频流走 ZLM。


二、前置条件(环境已具备)

2.1 MySQL

  • 地址:YOUR_SERVER_IP:3315
  • 库名:wvp-pro(按实际库名)
  • 执行 WVP 初始化脚本:数据库/2.7.4/初始化-mysql-2.7.4.sql(全新库)
  • 从旧版升级再执行:数据库/2.7.4/更新-mysql-2.7.4.sql

2.2 Redis

  • 地址:YOUR_SERVER_IP:6379
  • 建议单独使用一个 database 编号(如 7),避免与其它业务冲突

2.3 端口规划(防火墙 / 安全组需放行)

WVP 服务端口

SIP 信令接入端口必须同时开TCP和UDP,否则会导致TCP/UDP的设备无法注册

端口 协议 用途 开放范围
18080 TCP WVP Web 管理平台 必须 公网
8116 TCP和UDP(必须都开) GB28181 SIP 信令(设备/平台接入) 必须 公网

ZLMediaKit 流媒体端口

端口 协议 用途 开放范围
9092 TCP ZLM HTTP API(WebSocket/FLV 播放) 必须 公网
554 TCP RTSP 播放(标准协议拉流) 必须 公网
1935 TCP RTMP 推流(可选,NVR 推流用) 按需 公网
40000~45000 UDP+TCP ZLM 接收 RTP 流(国标设备推流) 必须 公网
50000~55000 UDP+TCP ZLM 发送 RTP 流(WVP 主动发流给设备/平台) 必须 公网

数据库/缓存(同机运行,无需额外开放)

端口 用途
6379 Redis
3315 MySQL

端口清单

# ===== WVP =====
18080/tcp   # Web 管理界面
8116/udp    # GB28181 SIP 信令

# ===== ZLMediaKit =====
9092/tcp    # HTTP API / WebSocket-FLV 播放
554/tcp     # RTSP 播放
# 1935/tcp  # RTMP 推流(按需开启)
40000-45000/tcp   # RTP 收流
40000-45000/udp   # RTP 收流
50000-55000/tcp   # RTP 发流
50000-55000/udp   # RTP 发流

防火墙命令(CentOS firewalld)

sudo firewall-cmd --permanent --add-port=18080/tcp
sudo firewall-cmd --permanent --add-port=8116/udp
sudo firewall-cmd --permanent --add-port=9092/tcp
sudo firewall-cmd --permanent --add-port=554/tcp
sudo firewall-cmd --permanent --add-port=1935/tcp
sudo firewall-cmd --permanent --add-port=40000-45000/tcp
sudo firewall-cmd --permanent --add-port=40000-45000/udp
sudo firewall-cmd --permanent --add-port=50000-55000/tcp
sudo firewall-cmd --permanent --add-port=50000-55000/udp
sudo firewall-cmd --reload

云服务器安全组也需要同步放行上述端口。

说明

  • 1935(RTMP)如果 NVR/设备不用 RTMP 推流,可以不开放
  • 40000-4500050000-55000 是国标通信的核心端口,必须全部开放
  • ZLM 的 [srt][rtc][shell] 端口都已设为 0(禁用),无需开放

三、Docker 安装 ZLMediaKit

3.1 安装 Docker(CentOS 8)

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker

3.2 部署目录

zlm独立docker编排目录,上传到服务器:

sudo mkdir -p /opt/zlm-standalone
# 上传 docker/zlm-standalone/ 下全部文件
cd /opt/zlm-standalone
sudo mkdir -p data/record data/log

目录结构:

/opt/zlm-standalone/
├── docker-compose.yml
├── config.ini
└── data/
    ├── record/
    └── log/

3.3 核心配置说明(config.ini)

与 WVP 的 media 段必须对齐:
主要是mediaServerId、secret、port、port_range、hook的on_*回调接口

[api]
secret=YOUR_ZLM_SECRET    # 与 WVP application.yml配置的 media.secret 一致

[general]
mediaServerId=zlmediakit-local              # 与 WVP media.id 一致

[http]
port=9092
allow_ip_range=                            # 空=允许所有 IP 访问 API

[rtp_proxy]
port_range=40000-45000                     # 与 WVP media.rtp.port-range 一致

[hook]
enable=1
on_server_started=http://YOUR_SERVER_IP:18080/index/hook/on_server_started
# ... 其余 on_* 均指向 WVP视频服务器 18080 的 /index/hook/... (YOUR_SERVER_IP得是公网IP)

# 重要:关闭占用 9000 的服务,避免启动失败
[shell]
port=0
[srt]
port=0

3.4 启动 ZLM

cd /opt/zlm-standalone
sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f zlm

docker-compose.yml 使用 network_mode: host,容器端口即宿主机端口,国标多端口 RTP 更简单。

3.5 测试 ZLM 服务

浏览器直接打开9092端口
image

curl "http://127.0.0.1:9092/index/api/getServerConfig?secret=YOUR_ZLM_SECRET"

image
成功标志: 返回 JSON,且 "code": 0,例如:

{
  "code": 0,
  "data": [
    {
      "http.port": "9092",
      "general.mediaServerId": "zlmediakit-local",
      "api.secret": "YOUR_ZLM_SECRET",
      "rtp_proxy.port_range": "40000-45000"
    }
  ]
}

3.6 常见 ZLM 故障

日志 原因 处理
Listen on 0.0.0.0 9000 failed: address already in use shell/srt 默认占 9000 config.ini[shell] port=0[srt] port=0
Your ip is not allowed to access the service HTTP 仅允许内网 [http] allow_ip_range= 置空
容器反复重启 端口冲突未解决 docker compose down → 改配置 → 再 up -d

四、配置并启动 WVP-PRO

4.1 配置文件

主配置:src/main/resources/application.yml 指定 Profile:

spring:
  profiles:
    active: 274-dev

环境配置:src/main/resources/application-274-dev.yml(该文件通常在 .gitignore,需本地维护)。

数据库与 Redis 示例:

spring:
  data:
    redis:
      host: YOUR_SERVER_IP
      port: 6379
      database: 7
      password: <你的 Redis 密码>
  datasource:
    url: jdbc:mysql://YOUR_SERVER_IP:3315/wvp-pro?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
    username: <数据库用户>
    password: <数据库密码>

server:
  port: 18080

国标 SIP(扬州示例):

sip:
  show-ip: YOUR_SERVER_IP
  port: 8116
  domain: 3210000049
  id: 32100000492000000001
  password: <设备注册密码>

对接 ZLM:

media:
  id: zlmediakit-local
  ip: YOUR_SERVER_IP
  http-port: 9092
  secret: YOUR_ZLM_SECRET
  hook-ip: YOUR_SERVER_IP
  stream-ip: YOUR_SERVER_IP
  sdp-ip: YOUR_SERVER_IP
  rtp:
    enable: true
    port-range: 40000,45000
    send-port-range: 50000,55000

4.2 编译与启动(本地开发)

环境要求: JDK 21(项目 pom.xml 指定,JDK 8 无法运行)。

# 后端
export JAVA_HOME=/path/to/jdk-21
cd wvp-GB28181-pro
mvn spring-boot:run -DskipTests

看到日志:

Started VManageBootstrap
[SIP SERVER] tcp://x.x.x.x:8116 启动成功
Tomcat started on port 18080

前端(开发模式,二选一):

cd web
npm install --registry=https://registry.npmmirror.com
npm run dev
# 浏览器访问 http://localhost:9528

或生产打包(只需访问 18080):

cd web
npm run build:prod   # 输出到 src/main/resources/static
mvn package -DskipTests
java -jar target/wvp-pro-*.jar

4.3 测试 WVP

步骤 操作 预期
1 打开 http://localhost:9528http://服务器IP:18080 出现登录页
2 登录 admin / admin(默认,首次部署后建议修改) 进入首页
3 节点管理 出现 zlmediakit-local,状态在线
4 配置海康 NVR 国标上级(见下文) 国标设备 列表设备在线
5 点击通道播放 能出画面(依赖 ZLM + RTP 端口)

海康 NVR 配置详见项目文档:doc/海康NVR接入WVP配置对照.md


五、配置对照速查(ZLM ↔ WVP)

配置项 ZLM config.ini WVP application-274-dev.yml
API 密钥 [api] secret media.secret
HTTP 端口 [http] port media.http-port
节点 ID [general] mediaServerId media.id
服务器 IP media.ip
RTP 范围 [rtp_proxy] port_range media.rtp.port-range
Hook [hook] on_* WVP 地址 :18080/index/hook/...

任意一项不一致,典型现象:

  • 节点不在线 → secret / Hook / WVP 未启动
  • 能注册不能播 → RTP 端口或 stream-ip / sdp-ip 错误

六、海康 NVR 配置SIP

上级平台(SIP 服务器)

NVR 填写字段 填写值 对应 application.yml
启用 ✅ 勾选
协议版本 GB/T28181-2016
传输协议 UDP(优先)
SIP 服务器地址 YOUR_SERVER_IP sip.show-ip
SIP 服务器端口 8116 sip.port
SIP 服务器 ID 32100000492000000001 sip.id
SIP 服务器域 3210000049 sip.domain
密码 YOUR_SIP_PASSWORD sip.password
启用鉴权 ✅ 必须勾选

NVR 本机参数

NVR 填写字段 填写值
SIP 用户认证 ID(设备 ID) 32100000492123456789
注册有效期 3600
心跳周期 60
注册间隔 60

设备 ID 不能和 SIP 服务器 ID 相同,必须另行填写。


设备 ID / 通道编码编写规则

规则

20 位国标编码 = 前10位(行政区划+行业码) + 后10位(自定义序号)

前10位(与 sip.domain 一致): 3210000049
后10位(自定义,不重复):     xx....xxxx
20位完整ID:                   3210000049xxxxxxxxxx

编写示例

NVR 设备 ID(填在「SIP 用户认证 ID」):

32100000492123456789
↑ 前10位      ↑ 后10位自定义

摄像头通道编码(每路一个,后10位末尾递增):

通道1: 32100000492123456701
通道2: 32100000492123456702
通道3: 32100000492123456703
通道4: 32100000492123456704

application.yml 对应SIP配置

sip:
  show-ip: YOUR_SERVER_IP      # ← SIP 服务器地址(NVR 填这里)
  port: 8116                   # ← SIP 服务器端口
  domain: 3210000049            # ← SIP 服务器域(前10位)
  id: 32100000492000000001     # ← SIP 服务器 ID(平台唯一)
  password: YOUR_SIP_PASSWORD  # ← 注册密码

网络要求

NVR 必须能访问:

目标 地址:端口 协议
WVP SIP YOUR_SERVER_IP:8116 UDP
WVP Web YOUR_SERVER_IP:18080 TCP

防火墙 / 云安全组需放行 8116/udp,否则无法注册。

六、推荐部署顺序

1. MySQL 建库 + 执行 2.7.4 初始化 SQL
2. 确认 Redis 可连
3. Docker 启动 ZLM → curl 验证 code=0
4. 配置 application-274-dev.yml(MySQL / Redis / sip / media)
5. 启动 WVP → 登录 Web → 看节点是否在线
6. 海康 NVR 填国标参数 → 设备注册 → 点播测试
7. 防火墙放行 8116、9092、40000-45000 等

七、个人踩坑记录

  1. ZLM 9000 端口冲突
    新版镜像默认开 shell/srt,占 9000,导致 Start server failed,容器无限重启。关闭 [shell][srt] 后正常。

  2. 前端未编译
    只访问 18080 没有页面时,需 npm run dev(9528)或 npm run build:prod 打进 Jar。

  3. 海康鉴权
    NVR 必须勾选「启用鉴权」才能填密码;平台 ID 与设备 ID 不要填反。


八、相关文件索引

文件 说明
src/main/resources/application-274-dev.yml WVP 环境配置
数据库/2.7.4/初始化-mysql-2.7.4.sql 数据库建表
WVP 官方文档 功能与协议说明
ZLMediaKit 流媒体服务

九、总结

已有 MySQL + Redis 的前提下,国标平台落地关键是补上 ZLMediaKit

  1. 用 Docker 部署 ZLM,保证 secret、端口、Hook 与 WVP 一致,并用 curl 验证 API。
  2. 配置 WVP 的 datasourceredissipmedia 后启动 Java 服务。
  3. 前端开发用 9528,上线用 npm run build:prod 合并到后端。
  4. 设备侧按国标参数注册,即可在 Web 上管理预览。

十、启动前后端界面

image
image

posted @ 2026-05-19 20:26  秋夜雨巷  阅读(295)  评论(0)    收藏  举报