从零搭建一个轻量级视频监控平台:用wvp-pro + ZLMediaKit管理你的NVR和IPC
从零搭建轻量级视频监控平台:wvp-pro + ZLMediaKit实战指南
监控摄像头早已不再是银行和政府的专属设备,如今连小区的水果店老板都会在门口装两个IPC。但问题来了——当你手上有十几个不同品牌的摄像头和NVR时,怎么把它们统一管理起来?去年我给本地连锁超市部署监控系统时就遇到这个痛点:海康的摄像头用iVMS-4200,大华的用SmartPSS,还有几个杂牌摄像头只能用厂商提供的垃圾客户端,切换起来简直要命。
直到发现wvp-pro+ZLMediaKit这对黄金组合,一切才变得简单。这个开源方案最吸引我的地方在于:用浏览器就能管理所有设备,还能自定义开发业务功能。下面我就把从设备选型到二次开发的完整经验分享给大家。
1. 为什么选择wvp-pro + ZLMediaKit组合
市面上监控平台方案大致分三类:
- 商业软件(如海康iVMS):功能完善但价格昂贵,且存在厂商锁定风险
- 云服务(如萤石云):使用简单但持续收费,数据安全性存疑
- 开源方案:自主可控但需要技术投入
经过三个月的技术选型测试,我们最终锁定wvp-pro+ZLMediaKit方案,核心优势对比如下:
| 对比维度 | 商业方案 | 云服务方案 | wvp-pro+ZLMediaKit |
|---|---|---|---|
| 成本 | 高(license+硬件绑定) | 持续订阅费用 | 仅服务器成本 |
| 扩展性 | 依赖厂商SDK | API功能受限 | 全开源可任意定制 |
| 协议支持 | 厂商私有协议为主 | 有限公有协议 | GB28181/RTSP/RTMP全支持 |
| 部署复杂度 | 一键安装 | 即开即用 | 需技术部署 |
| 典型适用场景 | 大型安防项目 | 个人/小微企业 | 中小型技术团队 |
技术栈解析:
- wvp-pro:基于Spring Boot+Vue.js的开源视频平台,提供设备管理、用户权限、录像回放等完整后台功能
- ZLMediaKit:高性能流媒体服务器,支持GB28181/RTSP/RTMP等协议,单机可承载500+路视频流
实际测试中,我们在2核4G的云服务器上稳定运行了32路1080P视频流(H.264编码),CPU占用率长期低于60%。这个性能对于中小型监控项目已经完全够用。
2. 环境搭建与基础部署
2.1 硬件准备建议
虽然说是"轻量级",但硬件配置也不能太寒酸。根据我们的压力测试结果,推荐配置如下:
开发测试环境:
- CPU:4核(Intel i5同级)
- 内存:8GB
- 存储:SSD 100GB(视频存储需额外扩展)
- 网络:100Mbps带宽
生产环境:
- 视频路数 ≤ 32路:4核8GB
- 32-64路:8核16GB
- 每增加1路1080P视频,需预留2-4Mbps带宽
特别注意:如果使用云服务器,务必选择计算优化型实例。我们曾因贪便宜选了共享型实例,结果在20路视频时就会出现卡顿。
2.2 Docker一键部署方案
对于大多数用户,推荐使用Docker Compose部署,省去依赖安装的麻烦。以下是经过优化的docker-compose.yml配置:
version: '3' services: zlm: image: zlmediakit/zlmediakit:latest ports: - "1935:1935" # RTMP - "554:554" # RTSP - "10000:10000" # HTTP API - "30000-30500:30000-30500/udp" # RTP端口范围 volumes: - ./zlmediakit.conf:/etc/zlmediakit.conf restart: always wvp: image: 648540858/wvp-pro:latest ports: - "18080:18080" environment: - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/wvp?useSSL=false - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=wvp123 depends_on: - db - zlm restart: always db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=wvp123 - MYSQL_DATABASE=wvp volumes: - ./mysql:/var/lib/mysql restart: always启动命令:
docker-compose up -d部署完成后访问http://服务器IP:18080即可进入管理后台(默认账号admin/123456)。
常见问题排查:
- 如果ZLMediaKit无法启动,检查30000-30500 UDP端口是否开放
- 视频流延迟高?尝试在zlmediakit.conf中调整以下参数:
[rtp] timeout_sec=60 [hls] seg_num=3 seg_duration=2
3. 设备接入实战技巧
3.1 海康/大华NVR批量接入
传统监控项目最头疼的就是添加大量摄像头。通过wvp-pro的自动发现功能,可以极大提升效率:
GB28181协议接入(推荐):
- 在NVR的【网络】-【高级配置】中开启GB28181
- 填写SIP服务器地址(wvp-pro服务器IP)
- 设置SIP ID格式:34020000001320000001(前6位行政区划码+后13位随机)
注:不同厂商菜单位置可能不同,大华设备在【系统设置】-【平台接入】中
RTSP直连方式: 对于不支持GB28181的老设备,可使用RTSP地址模板:
rtsp://[username]:[password]@[ip]:[port]/Streaming/Channels/[channelID]海康通道号规则:
- 主码流:/101
- 子码流:/102
- 如通道1主码流:/Streaming/Channels/101
批量导入技巧: 准备CSV文件(设备IP,端口,用户名,密码,通道数),使用以下Python脚本自动生成配置:
import csv template = "rtsp://{username}:{password}@{ip}:{port}/Streaming/Channels/{channel}" with open('devices.csv') as f: reader = csv.DictReader(f) for row in reader: for chan in range(1, int(row['channels'])+1): url = template.format( username=row['username'], password=row['password'], ip=row['ip'], port=row['port'], channel=f"{chan}02" # 子码流 ) print(url)3.2 网页播放器优化方案
原生HLS播放存在2-3秒延迟,对于安防监控场景可能不够。我们通过以下方案将延迟降至800ms内:
FLV低延迟模式: 修改ZLMediaKit配置:
[http] add_mutex=0 [general] enable_ffmpeg_log=0 [rtmp] handshake_timeout=10000前端播放器优化: 使用flv.js替代原生video标签:
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.6.2/dist/flv.min.js"></script> <video id="videoElement" controls muted></video> <script> if (flvjs.isSupported()) { const flvPlayer = flvjs.createPlayer({ type: 'flv', url: 'http://your-zlm-ip:port/rtp/streamId.flv' }); flvPlayer.attachMediaElement(videoElement); flvPlayer.load(); flvPlayer.play(); } </script>自适应码率方案:
// 根据网络状况动态切换码率 const bitrateLevels = { 0: '主码流', 1: '子码流', 2: '极速模式' }; function checkNetwork() { const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection; if (connection) { if (connection.downlink < 1) return 2; if (connection.downlink < 3) return 1; } return 0; }
4. 平台功能扩展开发
4.1 二次开发环境搭建
wvp-pro采用前后端分离架构,开发环境准备如下:
后端(Java):
git clone https://github.com/648540858/wvp-GB28181-pro.git # 导入IDEA后修改application-dev.yml spring: datasource: url: jdbc:mysql://localhost:3306/wvp?useSSL=false username: root password: yourpassword zlm: media-server-ip: 127.0.0.1前端(Vue):
cd web_src npm install # 修改.env.development VUE_APP_BASE_API = 'http://localhost:18080'调试技巧:
- 使用Swagger UI快速测试API:
http://localhost:18080/doc.html - 实时查看ZLMediaKit状态:
http://zlm-ip:10000/index/api/getServerConfig
4.2 典型业务功能扩展
案例1:智能分析告警推送在deviceAlarm表中添加处理状态字段后,开发告警处理流程:
// 新增告警处理接口 @PostMapping("/alarm/handle") public ResponseEntity<String> handleAlarm( @RequestParam String alarmId, @RequestParam String handler) { DeviceAlarm alarm = alarmService.findById(alarmId); alarm.setHandleStatus("PROCESSED"); alarm.setHandler(handler); alarm.setHandleTime(LocalDateTime.now()); alarmService.update(alarm); // 推送微信通知 wechatService.sendTemplateMsg( handler, "告警已处理", alarm.getDeviceName()); return ResponseEntity.ok("success"); }案例2:自定义视频广场布局修改src/views/live/index.vue,实现九宫格布局:
<template> <div class="grid-container"> <div v-for="(item,index) in deviceList" :key="index" class="grid-item" @click="playVideo(item)"> <video v-if="activeStreams[item.deviceId]" :src="activeStreams[item.deviceId]" autoplay muted /> <div v-else class="placeholder"> {{ item.name }} </div> </div> </div> </template> <style scoped> .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } .grid-item { aspect-ratio: 16/9; background: #222; } </style>4.3 性能监控与调优
生产环境必须建立监控体系,推荐配置:
Prometheus监控指标:
# ZLMediaKit指标配置 - job_name: 'zlm' static_configs: - targets: ['zlm-ip:10000'] metrics_path: '/index/api/getStatistic' # wvp-pro Spring Boot Actuator management: endpoints: web: exposure: include: "*" metrics: tags: application: wvp-pro关键性能阈值告警:
/* 数据库慢查询监控 */ SELECT device_id, AVG(response_time) as avg_time, COUNT(*) as request_count FROM stream_log WHERE create_time > NOW() - INTERVAL 1 HOUR GROUP BY device_id HAVING avg_time > 500;日志分析技巧:
# 实时查看错误日志 tail -f logs/wvp-pro.log | grep -E "ERROR|WARN" # 统计设备离线频率 awk '/设备离线/{print $1,$2,$NF}' logs/wvp-pro.log | sort | uniq -c
这套系统已经在本地三个商业综合体稳定运行超过半年,最让我惊喜的是它的扩展性——当需要增加智能分析功能时,我们只用两周就完成了算法对接。现在维护人员通过手机就能处理大部分异常情况,再也不用像以前那样跑到每个现场调试设备了。
