# camera-ops **Repository Path**: wsxrafael/camera-ops ## Basic Information - **Project Name**: camera-ops - **Description**: 摄像头视频文件处理工具 - 自动检测并裁剪含有人/猫/狗等变化画面的视频片段 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-09 - **Last Updated**: 2026-04-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 小米摄像头视频处理工具 - 需求文档 ## 1. 概述 对小米摄像头录制的视频文件进行处理: 1. 按小时合并视频 2. 检测画面中是否有目标(人、猫、狗等) 3. 只保留有有效内容的视频段 ## 2. 小米摄像头文件规则 ### 2.1 目录规则 `/xiaomi_camera_videos/607ea4c1faea/yyyymmddHH` - `xiaomi_camera_videos`:小米摄像头根目录 - `607ea4c1faea`:小米摄像头 MAC 地址 - `yyyymmddHH`:按小时建立的目录,如 `2026040515` 表示 2026年4月5日 15点的所有视频 ### 2.2 文件规则 - 每分钟一个视频文件 - 命名格式:`MMMSS_timestamp.mp4` - `MM`:分钟(00-59) - `SS`:秒(00-59) - `timestamp`:UTC 时间戳 - 示例:`16M13S_1775373373.mp4` 表示 15:16:13 开始的一分钟视频 ## 3. 技术路线 ### 3.1 Python 版 #### 3.1.1 程序架构 分为两个程序:`xiaomi-move-one.py` 和 `xiaomi-move.py`。 - `xiaomi-move-one.py` - 处理单个视频文件 - `xiaomi-move.py` - 处理整个目录 #### 3.1.2 程序参数 **xiaomi-move-one.py**: ```bash python xiaomi-move-one.py --input <输入文件> --output <输出文件> ``` - `--input`(`-i`):一个小米摄像头视频源文件(必填) - `--output`(`-o`):处理结果输出目录(必填) **xiaomi-move.py**: ```bash python xiaomi-move.py --input <输入目录> --output <输出目录> ``` - `--input`(`-i`):小米摄像头视频源目录(必填) - `--output`(`-o`):处理结果输出目录(必填) - `--deltmp`:是否删除临时数据(默认 true) #### 3.1.3 输出格式 单文件输出(txt): ``` HHMMSS-HHMMSS HHMMSS-HHMMSS ``` 目录输出(每小时): ``` xxxx.mp4,HHMMSS-HHMMSS,HHMMSS-HHMMSS,... xxxx.mp4,000000 ``` #### 3.1.4 环境依赖 ```bash # 创建虚拟环境 python3 -m venv ./.env # 激活环境 source ./.env/bin/activate # 安装依赖 pip install opencv-python ultralytics ``` #### 3.1.5 运行示例 ```bash # 激活环境 source ./.env/bin/activate # 处理单个视频 python xiaomi-move-one.py --input /path/to/video.mp4 --output /tmp/ # 处理整个目录 python xiaomi-move.py --input ./.video/test/2026010515 --output ./.video/done/ ``` --- ### 3.2 C++ 版(开发中) #### 3.2.1 技术选型 | 模块 | 技术选型 | |------|----------| | 视频解码 | **FFmpeg + NVDEC** (CUDA 硬解) | | 前处理 | **CUDA Kernel** (零拷贝) | | 目标检测 | **TensorRT** 推理 | | 视频处理 | FFmpeg (命令行) | #### 3.2.2 架构 ``` 视频文件 → FFmpeg (NVDEC) → GPU 显存 → CUDA Kernel → TensorRT → 结果 ``` #### 3.2.3 环境搭建计划 **目标**:全程 GPU 零拷贝,200+ FPS **当前环境**: - CUDA 12.8 ✅ 已安装 - RTX 5060 ✅ 正常 - TensorRT ✅ 已安装 (/usr/local/TensorRT-10.16.1.11) - FFmpeg + CUDA ❌ 未安装 **环境搭建步骤**: 1. **安装 TensorRT** ✅ 已就绪 (/usr/local/TensorRT-10.16.1.11) 2. **安装 FFmpeg (CUDA 支持)** ⏳ 待安装 (通过 PPA 或手动编译) sudo apt install ffmpeg # 方法2:手动编译 FFmpeg (带 CUDA 支持) # 略复杂,不推荐 # 验证 ffmpeg -hide_banner -hwaccels # 应显示 cuda ``` 3. **安装 OpenCV (带 CUDA 支持)** ```bash # 从源码编译 OpenCV,启用 CUDA 支持 # 略复杂,不推荐 ``` 4. **模型转换** ```bash # YOLOv8 → ONNX yolo export model=yolov8n.pt format=onnx # ONNX → TensorRT (.engine) # 使用 TensorRT Python API 转换 ``` 5. **代码编译** ```bash cd cpp mkdir build && cd build cmake .. make ``` #### 3.2.4 待实现 - `cpp/main.cpp` - 主程序 - `cpp/CMakeLists.txt` - 构建配置 - `cpp/yolo.cpp` - YOLO 推理模块 - `cpp/video.cpp` - 视频解码模块 - `cpp/preprocess.cu` - CUDA 前处理 --- ## 4. 目录结构 ``` camera-ops/ ├── python/ # Python 版 │ ├── xiaomi-move-one.py │ └── xiaomi-move.py ├── cpp/ # C++ 版(开发中) │ └── .gitkeep ├── .env/ # Python 虚拟环境 ├── .video/ # 测试视频目录 ├── README.md └── .gitignore ``` --- ## 5. 已知问题 ### 5.1 Python 版:视频解码慢 - OpenCV + FFMPEG 不支持 GPU 硬件解码 - 实测:1199帧视频,解码耗时 ~9秒,YOLO推理 ~9秒 - 瓶颈在视频解码(OpenCV),而非 YOLO 推理 ### 5.2 GPU 视频解码测试结果 | 方案 | 耗时 | FPS | |------|------|-----| | OpenCV CPU | 9.74s | 123 | | FFmpeg CUDA | 7.32s | 164 | | PyNvVideoCodec GPU | 1.01s | 1188 | - **PyNvVideoCodec** 解码最快(9倍提升),但帧无法直接转 PyTorch Tensor(API 不友好) - 需额外 OpenCV 读取帧,总耗时 3.21s,优势消失 - **结论**:当前 WSL2 环境下,视频解码 GPU 加速方案不成熟,暂不采用