foodpm/timecut

GitHub: foodpm/timecut

一款部署在 NAS 上的智能监控录像系统,结合 FFmpeg 循环录像与多模态大模型,自动筛选每日精华画面并生成日记。

Stars: 6 | Forks: 0

# TimeCut 智能监控录像系统 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Python 3.12](https://img.shields.io/badge/Python-3.12-blue.svg)](https://www.python.org/) [![FastAPI](https://img.shields.io/badge/FastAPI-0.115-green.svg)](https://fastapi.tiangolo.com/) [![Docker](https://img.shields.io/badge/Docker-Compose-blue.svg)](https://www.docker.com/)

TimeCut Logo

一个跑在 NAS Docker 上的监控摄像头录像管理系统。接入摄像头实时流,支持**循环录像**、**按天保留**、**每日精华视频自动剪辑**(可选**大模型识别**有价值画面),并提供浏览器 Web 管理界面。 ## ✨ 功能特性 - **📺 实时画面**:通过 go2rtc 接入摄像头 RTSP/小米流,浏览器低延迟实时查看(MSE/WebRTC) - **📹 循环录像**:FFmpeg 分段录制,按天保留策略自动清理过期录像 - **🤖 大模型精华筛选**:每日自动分析录像,支持「系统自动(运动检测)」与「大模型识别」两种模式——大模型模式对运动片段抽帧,调用多模态大模型判断画面是否含人员、车辆、包裹等有价值事件,识别更智能 - **✂️ 自动剪辑**:将活跃片段智能拼接为精华视频,永久保存;支持一键手动生成 - **� 大模型日记**:每日自动分析录像运动片段,调用多模态大模型总结当天发生的事并生成一篇日记;可开关、按日期网格浏览、点击查看详情 - **� 画面缩略图**:录像回看与精华视频列表均展示画面缩略图,精华视频支持在线播放 - **🌐 Web 管理**:浏览器访问面板,配置摄像头、录像策略、精华参数;面板修改自动持久化,重启/升级不丢失 - **🔄 自动恢复**:录制进程异常退出后自动重启,保证录像连续性 - **🐳 Docker 部署**:Docker Compose 一键启动,适配群晖/威联通等主流 NAS ## 🏗 系统架构 ┌──────────┐ RTSP ┌──────────┐ WebSocket/MSE ┌──────────┐ │ 摄像头 │ ──────────→ │ go2rtc │ ──────────────────→ │ 浏览器 │ └──────────┘ └────┬─────┘ └──────────┘ │ RTSP (Docker 内网) ┌────▼─────┐ │ app │ (Python + FFmpeg) │ │ │ ├─ recorder 循环录像 │ ├─ highlighter 精华检测+剪辑 │ ├─ diary 大模型日记 │ └─ web FastAPI + Web UI └────┬─────┘ │ ┌──────────┴──────────┐ │ /data/recordings/ │ 循环录像(按天删除) │ /data/highlights/ │ 精华视频(永久保存) │ /data/db/ │ SQLite 数据库 └─────────────────────┘ ## 🚀 快速开始 ### Docker 部署(推荐,免编译) **1. 获取部署文件** 只需 3 个文件:`docker-compose.yml`、`go2rtc.yaml.example`、`.env.example` git clone https://github.com/foodpm/timecut.git cd timecut # 复制配置模板 cp go2rtc.yaml.example go2rtc.yaml cp .env.example .env **2. 启动服务**(自动拉取预构建镜像) docker compose up -d **3. 访问管理面板** 打开浏览器访问 `http://你的NAS地址:8090` ### 离线部署(国内 / 无外网环境) **1. 下载镜像包** 到 [Releases](https://github.com/foodpm/timecut/releases) 页面,按 NAS 的 CPU 架构下载对应文件: | NAS 架构 | 下载文件 | |---------|---------| | x86_64(Intel/AMD,群晖、威联通、绿联的大部分机型) | `timecut-amd64.tar` | | ARM(群晖/威联通等 ARM 机型) | `timecut-arm64.tar` | **2. 上传并导入镜像** 将 tar 文件上传到 NAS,然后执行: docker load -i timecut-amd64.tar # 按实际下载的文件名调整 **3. 修改 compose 文件中的镜像版本** 按上文「步骤一」准备 `docker-compose.yml`、`go2rtc.yaml`、`.env` 后,把 `docker-compose.yml` 里的镜像改为与下载版本一致(**不带 `v` 前缀**): image: ghcr.io/foodpm/timecut:0.3.1 # 替换为下载时对应的版本号,如 0.3.1 **4. 启动** docker compose up -d 浏览器访问 `http://你的NAS地址:8090` ### 本地开发 # 启动 go2rtc(拉流转码) go2rtc -config go2rtc.yaml # 启动 Web 服务(虚拟环境) python3 -m venv .venv && source .venv/bin/activate pip install -r app/requirements.txt cd app && python main.py 浏览器访问 `http://localhost:8090` ## ⚙️ 配置说明 | 环境变量 | 默认值 | 说明 | |---------|--------|------| | `CAMERA_RTSP_URL` | - | 摄像头 RTSP 地址 | | `CAMERA_NAME` | 摄像头 | 摄像头显示名称 | | `RECORDING_RETENTION_DAYS` | 7 | 录像保留天数,超期自动清理 | | `RECORDING_SEGMENT_MINUTES` | 60 | 录像分段时长(分钟) | | `RECORDING_INTERVAL_MINUTES` | 0 | 录制间隔(分钟,0=连续录制;如 30=每录一段后间隔 30 分钟再录) | | `RECORDING_START_TIME` | 00:00 | 每天开始录制时间(24 小时制,支持跨午夜) | | `RECORDING_END_TIME` | 23:59 | 每天结束录制时间(24 小时制) | | `HIGHLIGHT_DURATION_MINUTES` | 5 | 精华视频时长(分钟) | | `HIGHLIGHT_SCHEDULE_TIME` | 03:00 | 每日精华检测时间(24 小时制) | | `HIGHLIGHT_ENABLED` | true | 是否启用精华检测 | | `DETECTION_SENSITIVITY` | 30 | 运动检测灵敏度(1-100,越小越灵敏) | | `AI_ENABLED` | false | 是否启用大模型精华识别(需在面板填 API Key) | | `AI_BASE_URL` | https://dashscope.aliyuncs.com/compatible-mode/v1 | 大模型 API 地址(OpenAI 兼容) | | `AI_MODEL` | qwen-vl-plus | 多模态模型 ID(需支持图片输入) | | `AI_API_KEY` | - | 大模型 API Key | | `AI_MAX_SEGMENTS` | 20 | 每天最多用大模型分析的片段数(即 API 调用次数上限) | | `DIARY_ENABLED` | false | 是否启用大模型日记(需在面板填大模型 API Key,与精华识别共用) | | `WEB_PORT` | 8090 | Web 管理端口 | | `DATA_DIR` | /data | 数据存储目录(Docker 内勿改) | | `TZ` | Asia/Shanghai | 时区 | ## ❓ 常见问题 **Q:浏览器无法查看实时画面?** - 确认 `go2rtc.yaml` 中 `api.origin: "*"` 已配置(Web UI 与 go2rtc 跨端口访问必需) - 确认 go2rtc 端口 `1984` 与 Web 端口 `8090` 均可访问 - 按 `F12` 查看控制台错误信息 **Q:录像文件被切成几秒的碎片?** - 碎片通常出现在录制启动初期(流不稳定)。系统会自动过滤时长 <10 秒的无效片段 - 可适当调大 `RECORDING_SEGMENT_MINUTES` 减少切割频率 **Q:go2rtc 重启后录像中断?** - 录制进程异常退出后会自动重启(5 秒后),无需手动干预 ## 📁 目录结构 timecut/ ├── app/ # 后端应用 │ ├── main.py # FastAPI 入口 │ ├── config.py # 配置管理 │ ├── database.py # SQLite 数据模型 │ ├── recorder/ # 录像模块(FFmpeg 循环录制) │ ├── highlighter/ # 精华检测与剪辑模块 │ └── web/ # Web UI(FastAPI 路由 + 静态资源) ├── go2rtc.yaml.example # go2rtc 配置模板(含摄像头流) ├── docker-compose.yml # Docker 编排 ├── Dockerfile # 后端镜像构建 ├── .env.example # 环境变量模板 └── README.md ## 🛠 技术栈 - **go2rtc** — 摄像头流管理(拉流、转码、MSE/WebRTC/HLS) - **FFmpeg** — 录像录制、视频分析、片段剪辑 - **Python / FastAPI** — 后端 API 与业务逻辑 - **SQLite** — 录像元数据存储 - **Tailwind CSS** — 前端界面 - **Docker Compose** — 容器编排 ## 📄 License [MIT](LICENSE)
标签:AV绕过, Docker, FastAPI, FFmpeg, NAS应用, 多模态大模型, 安全防御评估, 版权保护, 视频剪辑, 视频监控系统, 逆向工具