当前位置: 首页 > news >正文

基于Docker的wvp-GB28181-pro与ZLMediaKit集成部署实战指南

1. 环境准备与基础概念

在开始部署之前,我们需要先理解几个关键组件的作用。wvp-GB28181-pro是一个开源的视频监控平台,支持国标GB/T28181协议,能够对接各类网络摄像头和NVR设备。而ZLMediaKit则是轻量级的流媒体服务器,负责处理视频流的转发、转码和录制。用Docker来部署这两个组件,最大的好处就是避免了繁琐的环境配置,真正做到开箱即用。

我建议准备一台至少4核CPU、8GB内存的Linux服务器(Ubuntu 20.04/22.04或CentOS 7+),并确保已经安装好Docker和docker-compose。这里有个小技巧:如果你用的是云服务器,记得在安全组里提前放行后续要用到的端口(比如554、1935、18080等),免得部署完发现外网访问不了。

说到网络配置,有个容易踩坑的地方:GB28181设备注册时需要双向通信。这意味着不仅服务器要能访问设备,设备也要能访问服务器的SIP端口(默认8116)。如果是内网测试环境,直接用192.168.x.x这样的内网IP就行;如果是公网部署,就需要配置端口映射或者使用云厂商的负载均衡服务。

2. ZLMediaKit容器化部署

2.1 快速拉起基础服务

我们先从ZLMediaKit开始,这是整个系统的流媒体处理核心。官方已经提供了现成的Docker镜像,直接运行以下命令就能拉起服务:

docker pull zlmediakit/zlmediakit:master docker run -d --name zlmediakit-tmp zlmediakit/zlmediakit:master

这里有个实用技巧:先启动临时容器获取默认配置。因为直接修改容器内的配置不方便维护,我们应该把配置文件挂载到宿主机。执行以下命令提取配置:

mkdir -p /docker_container_data/zlmediakit/conf docker cp zlmediakit-tmp:/opt/media/conf/config.ini /docker_container_data/zlmediakit/conf/ docker rm -f zlmediakit-tmp

2.2 关键配置项详解

打开提取的config.ini文件,这几个参数必须重点关注:

[api] secret = your_custom_secret # 这个密钥要和wvp的配置一致 [general] mediaServerId = your_server_id # 服务器唯一标识 [rtp_proxy] port_range = 30000-30500 # RTP端口范围

实测中发现,如果RTP端口范围设置过小,在多路视频并发时会出现端口耗尽的问题。建议生产环境至少预留1000个端口(比如30000-31000)。另外记得把时区设为Asia/Shanghai,否则录像文件的时间戳会不对。

2.3 用docker-compose编排服务

推荐使用docker-compose管理服务,这里是我的配置模板:

version: '3.8' services: zlmediakit: image: zlmediakit/zlmediakit:master container_name: zlmediakit restart: always environment: TZ: Asia/Shanghai ports: - "1935:1935" # RTMP - "8080:80" # HTTP-FLV/HLS - "554:554" # RTSP - "30000-30500:30000-30500/tcp" # RTP over TCP - "30000-30500:30000-30500/udp" # RTP over UDP volumes: - /docker_container_data/zlmediakit/conf/config.ini:/opt/media/conf/config.ini - /etc/localtime:/etc/localtime:ro

启动后可以用docker logs -f zlmediakit查看实时日志,正常会看到"HTTP API启动成功"的提示。这时候访问http://服务器IP:8080/index/api/getServerConfig?secret=your_secret应该能返回JSON格式的配置信息。

3. wvp-GB28181-pro部署实战

3.1 源码编译与打包

wvp项目需要自己编译打包,先克隆源码:

git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git

前端编译可能会遇到node-sass报错的问题,实测用以下命令最稳定:

cd wvp-GB28181-pro/web_src/ npm --registry=https://registry.npmmirror.com install --force npm run build

后端打包直接用Maven:

cd wvp-GB28181-pro mvn package

编译完成后会在target目录生成wvp-pro-*.jar文件。这里有个小技巧:如果编译失败,可以尝试先执行mvn clean清除缓存。

3.2 配置文件精讲

application.yml是wvp的核心配置,有几个关键部分需要注意:

spring: redis: host: redis # 如果redis单独部署要改这里 password: your_redis_password datasource: url: jdbc:mysql://mysql:3306/wvp?useSSL=false username: root password: your_db_password sip: ip: 0.0.0.0 # 监听所有网卡 port: 8116 # SIP服务端口 media: id: zlmediakit # 必须和ZLMediaKit的mediaServerId一致 ip: 192.168.1.100 # ZLM服务器内网IP http-port: 8080 # ZLM的HTTP端口 secret: your_shared_secret # 两边要相同

特别提醒:如果wvp和ZLMediaKit不在同一台服务器,media.hook-ip必须设置为wvp服务器的可访问IP,否则ZLM无法回调通知事件。

3.3 Docker镜像构建

我优化过的Dockerfile包含时区设置和启动脚本:

FROM openjdk:8-jre RUN mkdir -p /home/wvp WORKDIR /home/wvp ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone COPY start.sh /home/wvp/ RUN chmod +x /home/wvp/start.sh COPY target/wvp-pro-*.jar /home/wvp/ EXPOSE 18080 8116 ENTRYPOINT ["./start.sh"]

配套的start.sh脚本内容如下:

#!/bin/sh JAR_FILE=$(ls -t /home/wvp/wvp-pro-*.jar | head -n 1) exec java -jar "$JAR_FILE"

构建命令示例:

docker build -t wvp-pro:2.0 -f Dockerfile .

3.4 容器化部署

完整的docker-compose.yml应该包含MySQL、Redis和wvp服务:

version: '3.8' services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: your_db_password MYSQL_DATABASE: wvp volumes: - /docker_container_data/mysql:/var/lib/mysql redis: image: redis:6 command: redis-server --requirepass your_redis_password volumes: - /docker_container_data/redis:/data wvp: image: wvp-pro:2.0 depends_on: - mysql - redis ports: - "18080:18080" - "8116:8116/tcp" - "8116:8116/udp" volumes: - /docker_container_data/wvp/record:/home/wvp/record

启动后用docker-compose logs -f wvp查看日志,正常会看到"SIP服务启动成功"的提示。访问http://服务器IP:18080应该能看到登录页面,默认账号admin,密码admin。

4. 常见问题排查指南

4.1 设备注册失败分析

如果摄像头无法注册到wvp,建议按这个顺序检查:

  1. 确认wvp的SIP配置中ip不是127.0.0.1
  2. 检查设备配置的SIP服务器地址和端口是否正确
  3. tcpdump -i any port 8116抓包看是否有SIP报文到达
  4. 查看wvp日志中的REGISTER相关日志

我遇到过一种特殊情况:某些设备要求SIP ID必须完全匹配domain配置。比如domain设为4101050000时,设备SIP ID必须是41010500001320000001这样的格式。

4.2 视频播放异常处理

当网页能显示设备列表但无法播放时:

  1. 先确认ZLMediaKit的secret配置和wvp一致
  2. 检查端口映射是否正确,特别是RTP端口范围
  3. 在ZLM管理界面查看流是否已经生成
  4. 尝试用VLC直接播放RTSP流测试

有个典型错误是"端口被占用",这通常是因为之前容器异常退出没有释放端口。解决方法是用netstat -tunlp | grep 端口号找到占用进程并kill掉。

4.3 性能优化建议

在高并发场景下,建议:

  1. 为Docker分配至少4GB内存
  2. 调整ZLMediaKit的thread_num参数(建议CPU核数×2)
  3. 启用Redis缓存设备状态
  4. 对录像存储目录使用SSD磁盘

对于大规模部署,可以考虑将ZLMediaKit和wvp部署在不同服务器,并通过内网专线通信。我曾经在32路1080P并发的场景下,将ZLM单独部署在4核8G的服务器上,CPU利用率能控制在60%以下。

http://www.jsqmd.com/news/646723/

相关文章:

  • STM32CubeMX实战指南:内部温度传感器的精准测量与应用
  • 太阳能供电选型避坑指南:为什么50W电池板配38AH电池在这个项目中刚好够用?
  • 告别手动计算!用ST MCSDK6.2.0的Motor Profiler,5分钟自动搞定电机参数辨识
  • 突然想明白了论文的套路
  • 2026.04.07 作业- # AT_abc452_f [ABC452F] Interval Inversion Count
  • 【技巧】MAC外接显示屏的实用设置与优化
  • 从无人机到平衡车:深入聊聊STM32上IMU数据融合里的那些‘权重’游戏
  • 串口调试翻车实录:当Stick Parity遇到CH340芯片时的诡异丢包问题
  • 34岁产品经理硬核转型AI!2年踩坑经验告诉你:想转行?先掌握这个核心能力!
  • 中医AI革命:如何用7B参数打造超越GPT-4的专业中医助手?
  • 卷积改进与轻量化:大核卷积的极致:使用 31×31 深度卷积 + 结构重参数化,有效感受野翻倍
  • Ostrakon-VL-8B开源镜像实测:无需CUDA驱动预装,容器内自动适配GPU环境
  • NVIDIA Profile Inspector终极指南:解锁显卡隐藏性能的4个秘密
  • RePaint: 基于去噪扩散概率模型的图像修复技术解析与实践
  • 华为认证如何助力职业跃迁?HCIA到HCIE的进阶路径与薪资增长分析
  • 基于主从博弈的动态定价策略与电动汽车充电管理优化研究在智能小区的实践探索
  • 别再乱用Hive分区了!手把手教你用日期和地域分区优化TB级数据查询(附实战SQL)
  • Ubuntu Autoinstall Generator:终极自动化部署解决方案
  • 5分钟在macOS上安装Whisky:终极Windows应用兼容解决方案
  • 告别振铃!用PSIM和Simulink手把手教你调Boost双闭环PI参数(附完整计算过程)
  • Substance Painter高效快捷键指南
  • GPT-6震撼发布!OpenAI引领AI革命,200万Token大模型将如何重塑未来?
  • 1.6-抓包实战:从Burp Suite到Yakit,打通Web、APP、小程序流量分析
  • 避坑指南:GraalVM Native-Image在Windows环境下的5个常见错误及解决方法
  • DPO VS GRPO
  • 专业无人机日志数据分析:UAV Log Viewer完整实战指南
  • Office2021完美兼容Mathtype6的保姆级教程(附文件路径详解)
  • 生成式AI不是烧钱游戏:用ROI驱动型架构设计法,90天重构盈利路径(附金融/医疗/制造三大行业落地方案)
  • BCI Competition IV 2a数据集深度解析:除了读取.gdf,你更该关注这些实验设计与数据细节
  • OpenHarmony XTS测试实战:从零手把手教你为智能手表写一个C语言兼容性用例