🏫 智慧园区视频监控系统

基于服务器本地地图和深度学习的智能园区视频监控 Web 系统


📖 简介

传统园区视频监控系统不存储园区 GIS 地图,也没有精确记录摄像头的地理位置和相对位置关系,不便于监控调取和管理。同时,传统系统还需人工值守监视画面并研判上报事件,限制了易用性、实时性和效率。

本系统通过服务器本地地图HLS 低延迟直播YOLOv8 深度学习检测,实现:

  • 🗺️ 园区自定义地图的本地存储、加载和渲染
  • 📹 多摄像头实时直播(HLS 协议,秒级延迟)
  • 📍 基于地理位置的摄像头管理
  • 🤖 AI 实时异常检测与自动报警
  • ⚙️ 报警触发规则自定义
  • 👥 角色权限管理

📸 功能截图

登录页园区态势
登录页园区态势
监控大屏异常报警
监控大屏报警事件
地图管理摄像头管理报警规则
地图管理摄像头管理报警规则

🚀 快速开始

前置要求

  • Docker & Docker Compose v2+
  • 2GB+ 可用磁盘空间
  • 网络可访问摄像头 RTSP 流

一键部署

git clone https://github.com/290008282/campus-surveillance-system.git
cd campus-surveillance-system
docker compose up -d --build

访问系统

📖 详细部署说明请参阅 DEPLOY.md


🏗️ 系统架构

技术架构

┌─────────────┐     ┌──────────────────┐     ┌──────────────┐
│   Frontend   │────▶│   Backend (Nest) │────▶│    MySQL     │
│  UmiJS+React │     │   HTTP + WS      │     │    8.0       │
└─────────────┘     └────────┬─────────┘     └──────────────┘
       ▲                     │
       │                     │ WebSocket
       │                     ▼
       │              ┌──────────────┐
       │              │    AI End    │
       │              │ Python+YOLOv8│
       │              └──────┬───────┘
       │                     │ FFmpeg
       │                     ▼
       │              ┌──────────────┐
       └──────────────│  nginx-rtmp  │
         HLS Stream   │ RTMP → HLS   │
                      └──────────────┘

核心流程

  1. AI 端通过 WebSocket 连接后端,获取摄像头列表
  2. 为每个摄像头启动 FFmpeg 子进程:RTSP → RTMP 推流
  3. nginx-rtmp 将 RTMP 转为 HLS 切片(.m3u8 + .ts)
  4. 前端通过 hls.js 播放 HLS 直播流
  5. 同时 YOLOv8 对画面进行实时目标检测,异常时通过 WebSocket 上报报警

组件说明

组件技术栈说明
前端UmiJS + React + Leaflet + hls.js管理界面、地图渲染、直播播放
后端NestJS + TypeORM + Socket.IOREST API、WebSocket、数据库操作
AI 端Python + YOLOv8 + FFmpeg目标检测、RTSP→RTMP 推流、报警上报
媒体服务nginx-rtmpRTMP 收流、HLS 切片分发
数据库MySQL 8.0用户、摄像头、报警事件等数据存储

📡 API 端点

用户认证

方法路径说明
POST/api/user/login用户登录

摄像头

方法路径说明
GET/api/user/getCameraInfo获取摄像头信息
GET/api/ai/getOfflineCameraList获取离线摄像头列表
GET/api/ai/getAllCameraList获取所有摄像头列表

AI 端通信

AI 端通过 WebSocket (/ws/ai/socket.io) 与后端实时通信:

  • 摄像头列表同步(每 60 秒)
  • 进程存活检查(每 30 秒)
  • 异常事件实时上报
  • 报警去重(节流 300 秒)

⚙️ 环境变量

AI 端

变量默认值说明
HTTP_SERVER_URLhttp://front-backend:3000后端地址
RTMP_SERVER_URLrtmp://front-backend:1515/liveRTMP 推流地址
ADMIN_USERNAMEadmin管理员用户名
ADMIN_PASSWORDadmin管理员密码
HLS_HOSTlocalhostHLS 流地址(跨设备访问需设为实际 IP)

后端

变量默认值说明
MYSQL_HOSTmysqlMySQL 主机
MYSQL_PORT3306MySQL 端口
MYSQL_DATABASEcampus-surveillance-system数据库名
MYSQL_USERroot数据库用户
MYSQL_PASSWORDroot数据库密码
JWT_SECRETcampus-secret-keyJWT 签名密钥

🔧 已知问题与解决方案

问题原因解决方案
HEVC 摄像头解码警告H.265 编码不完全兼容FFmpeg 添加 -err_detect ignore_err 容错
HLS 流 404nginx alias 缺尾部斜杠已修复:location /hls/ { alias /dev/shm/nginx-live/; }
/dev/shm 空间不足默认 64MB 不够 3 路流docker-compose.yml 添加 shm_size: '512m'
FFmpeg 音频不兼容FLV 不支持 8000Hz MP3FFmpeg 添加 -an 禁用音频
宿主机 80 端口被占宝塔面板占 80使用 8088 端口映射

📂 项目结构

campus-surveillance-system/
├── docker-compose.yml          # 服务编排
├── front-backend.Dockerfile    # 前端+后端+RTMP 镜像
├── ai-end.Dockerfile           # AI 检测端镜像
├── init.sql                    # 数据库初始化
├── DEPLOY.md                   # 部署指南
├── backend/
│   ├── nginx.conf              # Nginx + RTMP + HLS 配置
│   ├── server.config.env
│   └── src/
│       ├── controllers/
│       ├── services/           # camera / user / alarm-event
│       └── types/
├── frontend/
│   └── src/                    # UmiJS + React
├── ai-end/
│   ├── main.py                 # FFmpeg 推流 + YOLOv8 检测
│   ├── wsClient.py             # WebSocket 客户端
│   └── requirements.txt
└── docs/                       # 截图和文档

🤝 致谢

本项目 Fork 自 CrazyHer/campus-surveillance-system,基于 MIT 协议开源。

📄 许可证

MIT License