🚀 飞牛 NAS 部署小米监控视频自动合并工具(终极完美版)
教程简介: 本教程通过 Docker Compose 方式,在飞牛 NAS (fnOS) 上部署 xiaomi-camera-combine。 功能特点:
自动将小米摄像头1分钟/个的碎视频,合并为1小时/个的大视频。
防卡死机制:自动清理因摄像头断网/断电产生的 <100KB 损坏文件。
音频兼容修复:自动将老式
pcm_alaw音频转码为标准格式,防止合并失败。空间回收:合并成功后,自动删除原碎片视频。
强迫症福音:自动清理原视频被删光后留下的空文件夹。



第一步:准备文件与文件夹
下载源码:前往原作者 GitHub (xiaomi-camera-combine),点击绿色的
Code->Download ZIP,下载并解压到电脑上。在飞牛 NAS 中创建 3 个关键文件夹:
📁 代码文件夹:命名为
xiaomi-combine(建议建在存放 Docker 数据的盘里),将刚才解压出来的所有文件上传到这里。📁 输出文件夹:命名为
CombineVideo,用来存放以后合并好的大视频。📁 监控源文件夹:找到你小米监控原本录像保存的位置(路径最后一层必须是设备的 MAC 地址,比如
.../b88880053c90,点进去能看到以时间命名的文件夹)。
获取绝对路径:在飞牛文件管理器中,分别右键这三个文件夹 -> 【属性】,把它们的“位置/路径”复制并记录到备忘录里备用。
第二步:提前给代码打补丁(解决音频报错)
由于小米部分摄像头的音频格式太老,直接合并会报错,我们需要提前改两行代码。
在飞牛的文件管理中,进入你的代码文件夹。
找到并双击打开
mi-camera-combine.py文件。往下翻(大概在第 183 行附近),找到以下这段原代码:
Python
def get_ffmpeg_merge_command(temp_file_list, output_file): # ...省略部分注释... base_command = [ FFMPEG_PATH, "-f", "concat", "-safe", "0", "-i", str(temp_file_list) ] if COMPRESS_VIDEO == 0: # Direct copy without compression # 不压缩,直接复制 base_command += ["-c:v", "copy", "-c:a", "copy"]将其修改为(加了
-y和把copy改成了aac):Python
def get_ffmpeg_merge_command(temp_file_list, output_file): # ...省略部分注释... base_command = [ FFMPEG_PATH, "-y", "-f", "concat", "-safe", "0", "-i", str(temp_file_list) ] if COMPRESS_VIDEO == 0: # Direct copy without compression # 不压缩,直接复制 base_command += ["-c:v", "copy", "-c:a", "aac"]点击右上角【保存】并关闭编辑器。
第三步:Docker 一键部署(核心)
打开飞牛桌面上的 【Docker】,在左侧菜单栏点击 【项目】,然后点击右上角的 【新增】。
项目名称 填:
xiaomi-camera-combine。路径 选:你在第一步建好的代码文件夹。
来源 选:【创建 docker-compose.yml】。
将下方最终版代码完整粘贴进去(⚠️ 注意:必须把
volumes下面的三行中文提示,替换成你在第一步获取的真实路径!):
YAML
version: '3.8'
services:
xiaomi-combine:
image: python:3.11-alpine
container_name: xiaomi-camera-combine
user: root
working_dir: /app
volumes:
# 👇 警告:只替换冒号【左边】的路径!冒号和右边的 /app 等千万别改别删!
- /此处替换为你的【代码文件夹】绝对路径:/app
- /此处替换为你的【监控源文件夹】绝对路径:/data/monitor
- /此处替换为你的【输出文件夹】绝对路径:/data/output
environment:
- MONITOR_PATH=/data/monitor
- OUTPUT_PATH=/data/output
- COMBINE_DURATION=60 # 每次合并60个视频(即1小时)
- DELETE_SOURCE=Y # Y=合并后删除原视频,释放空间
- LOOP=Y # Y=循环运行
- COMPRESS_VIDEO=0 # 0=不压缩(合并极快且画质无损)
- FFMPEG_PATH=/usr/bin/ffmpeg
- TZ=Asia/Shanghai
command: >
/bin/sh -c "
apk add --no-cache ffmpeg tzdata &&
pip install --no-cache-dir python-dotenv &&
while true; do
echo '>>> 🧹 正在执行坏文件防御扫描 (清理小于 100KB 的残缺文件)... <<<';
find /data/monitor -type f -name '*.mp4' -size -100k -exec rm -f {} ;
echo '>>> 🚀 开始扫描并执行视频合并任务 <<<';
python mi-camera-combine.py;
chmod -R 777 /data/output 2>/dev/null;
echo '>>> 🗑️ 正在打扫战场 (自动删除监控目录下的空文件夹)... <<<';
find /data/monitor -mindepth 1 -type d -empty -delete 2>/dev/null;
echo '>>> 💤 本次任务全部圆满结束,容器将休眠 1 小时后再次自动扫描 <<<';
sleep 3600;
done"
restart: unless-stopped
检查路径无误后,点击右下角的 【确认】 或 【部署】。
第四步:运行与查看
部署成功后,在 Docker 的 【容器】 列表中,你会看到
xiaomi-camera-combine亮起绿灯。点击容器名称,进入 【日志】 页面。
前 1 分钟程序会自动安装
ffmpeg等运行环境。随后,你就能看到程序开始一行行扫描视频、合成了。日常逻辑:它会一口气把你积压的所有视频合并完。当它发现没活干了,就会进入 1 小时的休眠。1 小时后自动醒来,处理刚录制的新视频,如此往复,完全不需要人工干预。
🎉 大功告成! 你现在可以去泡杯茶,然后打开 CombineVideo 文件夹,欣赏干净清爽的整小时监控大片了!
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
