装修监控这事最花钱的往往不是摄像头。内存卡两三个月就被循环写入搞报废厂商云套餐一个月十几二十块一年下来又是小两百。我用手头一台乞丐版摄像头 一块闲置单板机 免费夸克网盘把 24×7 监控存储与回放系统搭了起来单板机用 ffmpeg 拉摄像头的 RTSP 流切成一段段 mp4再让 alist 把夸克网盘挂成 WebDAV由 rclone 自动同步上去。整条链路跑下来除了几块钱电费一分钱订阅费没花内存卡也不用再买了。这套方案适合谁家里有老摄像头但嫌厂商 App 难用的人手里有树莓派、橙派这类吃灰板子的人以及不想为云存储持续付费的人。哪怕你对 Linux 只懂个皮毛照着后面的命令抄也能搭起来。下面我把思路、参数和踩过的坑一起写清楚。1. 整体架构为什么是“摄像头 → 单板机 → 夸克网盘”1.1 先想清楚数据流整套系统的数据流其实就是一个典型的分层存储模型摄像头负责采集单板机负责短期本地缓冲夸克网盘负责长期异地备份。摄像头 RTSP 流 → ffmpeg 分段录制 → 本地磁盘 ↓ rclone 增量同步 夸克网盘通过 alist 挂载为 WebDAV这个架构的关键在于摄像头本身不需要插内存卡也不需要开厂商云。乞丐版摄像头开机后唯一的工作就是吐出一路 RTSP 码流剩余所有脏活累活都交给我闲置的那块单板机。单板机既当录像机又当上传网关本地硬盘留下的录像做热数据网盘里的录像做冷备两不耽误。为什么不在摄像头里插卡我在很多机器上试过内存卡方案有几个绕不开的死穴一是闪存颗粒有写入寿命1080p 每秒写 250KB 左右一张普通卡连续写入两三个月就开始掉速一年内大概率报错二是循环覆盖时文件系统碎片化严重突然断电极易丢文件甚至直接提示格式化三是一旦卡坏了录像就断了而你往往几天后才想起来去看。用单板机本地盘做缓冲这些问题都能绕开至少坏了也只是坏一块便宜硬盘换掉不影响摄像头本体。1.2 为什么必须分段录制而不是录成一个整文件最初的版本我图省事直接一条 ffmpeg 命令录一天生成一个 18GB 的 mp4。问题很快就来了网盘上传失败就得整个文件重新传想回看某个时间点要拖进度条拖半天文件损坏的话一整天全废。改成按 10 分钟一段之后体验完全不同。上传失败最多丢 10 分钟回放定位精确到文件名里的时分秒rclone 增量同步也更高效。分段导致的碎片化问题ffmpeg 的 segment muxer 本身处理得很好文件名自带时间戳配合-segment_atclocktime对齐自然时间找一段录像就像翻日历一样简单。1.3 先算一笔容量账不花一分钱的前提是你得知道自己有多少免费空间。夸克网盘新用户免费容量大概在 10GB 上下偶尔参加官方活动还能扩容但咱们先按 10GB 算。不同码率下每天的录像体积是这样的画质码率每日数据量免费网盘能存多久720P1Mbps约 10.8GB约 22 小时1080P2Mbps约 21.6GB约 11 小时1080P4Mbps约 43.2GB约 5 小时算清楚这笔账之后我的处理方式是本地留 3 到 7 天完整录像网盘作为滚动备份只存最近几天的关键内容。如果实在想全量存云端就老老实实把摄像头码率降到 720P 1Mbps或者只录有人的时段。容量有限这件事不是 bug而是免费方案的天然约束接受它、设计好策略反而比硬撑着全量上传稳定得多。另外单板机的本地存储建议用 USB 硬盘或者换了大容量 SD 卡的机器。我最初把录像写进系统 SD 卡一边跑 alist 一边写录像结果 SD 卡温度高得吓人后来换了一块闲置的 256GB 移动硬盘整个世界清静了。2. 硬件选型乞丐版摄像头和单板机怎么配2.1 乞丐版摄像头怎么选必须支持 RTSP市面上的垃圾摄像头鱼龙混杂但我只认一条死线必须支持 RTSP 或者 ONVIF 协议。不符合的直接排除哪怕它 App 做得再炫。因为我们的整条链路都建立在“能从摄像头拉流”这个前提上。海康、大华、宇视这些正经安防品牌不用说几十块的小厂 ANC、中维世纪、睿视之类只要参数页写了 RTSP 支持就基本能干活。反而是一些智能家居摄像头比如某些只能通过自家 App 看的云台机固件封闭、不开放 RTSP这种就不行买了没法进本方案。丐版摄像头绝大多数是 WiFi 连接回传 1 到 2Mbps 的码流WiFi 完全扛得住。但注意摄像头和单板机尽量放同一个交换机或同一面墙隔一堵厚墙后 2.4GHz 丢包率会飙升我现在遇到的所有断流事故一半以上都源自 WiFi 信号不稳。2.2 单板机的底线配置与系统准备单板机选哪块不重要重要的是一句大实话我们采用的是流复制-c copy不做转码所以 CPU 负载很低。树莓派 3B、橙派 Zero 2、香橙派 Zero 3甚至电视盒子刷 Armbian 都能跑。我自己用的是几年前买的橙派 Zero 21GB 内存跑 ffmpeg 录制一路 1080p alist rclone 同步CPU 占用常年不到 10%。底线配置大概是能跑 LinuxDebian/Ubuntu arm64 都行内存 512MB 以上有至少一个空闲 USB 口接移动硬盘供电稳定别省那一口电源钱单板机电压不稳轻则掉盘重则烧卡如果你选的是树莓派请直接装官方 Raspberry Pi OS Lite 64 位装完先别折腾桌面省下来的资源全给码流。另外记得把单板机设置成固定 IP否则路由器重启后找不到机器很烦。2.3 先把 RTSP 地址拿到手不同品牌的摄像头的 RTSP 路径格式差异很大常见的有海康威视rtsp://admin:密码IP:554/Streaming/Channels/101 宇视Univiewrtsp://admin:密码IP:554/unicast/c10/s0/live 大华rtsp://admin:密码IP:554/cam/realmonitor?channel1subtype0记不住路径没关系先装一个 ONVIF Device ManagerWindows或者直接在电脑上用 VLC 打开“网络串流”测试。很多乞丐版摄像头还支持在厂商 App 的“设备信息”页面直接看到拉流地址。拿到地址后先在本机用 ffprobe 验证一下流是否正常ffprobe -rtsp_transport tcp -i rtsp://admin:密码192.168.1.64:554/Streaming/Channels/101能输出视频流信息就说明这条路通了。这一步务必在本机做不要在单板机上遇到问题了再回来看排查线索会被锯齿化。注意改掉摄像头的默认密码。丐版摄像头是最容易被扫描攻击的设备之一初始密码 admin/admin 一旦暴露在局域网等于把家门钥匙放在门口地垫下面。后面我还会专门说安全。3. 核心实现用 ffmpeg 分段录制3.1 录制的完整命令这是整个系统的核心一环直接给能用的命令ffmpeg -y \ -rtsp_transport tcp \ -use_wallclock_as_timestamps 1 \ -i rtsp://admin:PASSWORD192.168.1.64:554/Streaming/Channels/101 \ -map 0:v -c copy \ -f segment \ -segment_time 600 \ -segment_atclocktime 1 \ -segment_time_delta 3 \ -reset_timestamps 1 \ -avoid_negative_ts make_zero \ -strftime 1 \ /mnt/record/%Y%m%d/%Y%m%d_%H%M%S.mp4先别急着跑把rtsp://...换成你自己的地址把/mnt/record指到你挂载的移动硬盘目录然后放后台。跑一天回来翻翻目录正常的话按小时均匀地躺着 6 个 mp4每个文件大小接近但不超过预期值。3.2 每个参数为什么要这么设-rtsp_transport tcp强制走 TCP 拉流。默认是 UDPUDP 在丢包时画面会花屏、卡顿且码流一抖就断。TCP 虽然多一点点延迟但稳定性和完整性完全不在一个等级。-use_wallclock_as_timestamps 1让 ffmpeg 使用单板机的系统时间作为时间戳基准而不是信摄像头给的时间戳。丐版摄像头的时钟常年跑偏有的甚至会随机跳变这个参数能避免你切出来的文件时间轴错乱。-map 0:v只保留视频流。很多摄像头带有 G.711 音频这种编码在网页端和网盘播放器里兼容性差云端回放很容易有声无画或有画无声。只要画面直接丢掉音频最省心。-c copy流复制不重新编码。这是整套方案能跑在乞丐版单板机上的根本原因。CPU 占用可以忽略缺点是没法调整分辨率帧率所以录制质量完全取决于摄像头输出的码流。-f segment -segment_time 600切成 10 分钟一段。10 分钟的文件大小约 100-200MB对网盘上传大小限制友好回放定位也不累。太短会文件碎片太多太长则失去了分段的优势。-segment_atclocktime 1让切割点对齐自然时间也就是每天 00:00、00:10、00:20……一刀切下去。这样你看到文件名里的时间就知道它的起止边界回放定位极其顺畅。-segment_time_delta 3允许在目标切割点前最多 3 秒内找关键帧。这能缓解复制模式下“段尾长出一截”的毛病后面会细说。-strftime 1让文件名模板里的%Y%m%d_%H%M%S按实际开始时间填充。如果不用这个文件名只能按递增数字排回放定位就废了。3.3 开机自启与断线自动重连ffmpeg 偶尔会因网络抖动退出所以不能指望手动拉起。我把它做成 systemd 服务负责开机自启和失败自动重启。先建工作脚本/usr/local/bin/record.sh#!/bin/bash CAMERA_URLrtsp://admin:PASSWORD192.168.1.64:554/Streaming/Channels/101 OUT_DIR/mnt/record while true; do ffmpeg -y \ -rtsp_transport tcp \ -use_wallclock_as_timestamps 1 \ -i $CAMERA_URL \ -map 0:v -c copy \ -f segment -segment_time 600 -segment_atclocktime 1 \ -segment_time_delta 3 -reset_timestamps 1 -avoid_negative_ts make_zero \ -strftime 1 \ $OUT_DIR/%Y%m%d/%Y%m%d_%H%M%S.mp4 \ /var/log/record.log 21 echo $(date %F %T) ffmpeg exited, restarting... /var/log/record.log sleep 10 done再写 systemd unit放在/etc/systemd/system/record.service[Unit] DescriptionRTSP segment recorder Afternetwork-online.target Wantsnetwork-online.target [Service] ExecStart/usr/local/bin/record.sh Restartalways RestartSec15 StartLimitIntervalSec0 [Install] WantedBymulti-user.target然后systemctl daemon-reload systemctl enable --now record。这个写法比单纯让 systemd 重启 ffmpeg 更稳因为循环里加了一层 network-online 等待开机网络没起来不会立刻空转。3.4 关键帧与切片的坑用-c copy切流有个绕不开的物理现象如果摄像头输出的 GOP关键帧间隔太长那么切割点很可能落在非关键帧上播放器从这段开头播放时得先等下一帧关键帧于是出现 1 到 3 秒的黑屏或花屏。ffmpeg 的 segment muxer 在复制模式下会尽量寻找关键帧作为切点但摄像头默认 GOP 如果是 4 到 8 秒你就会经常发现“这段 10 分钟实际时长 10 分 07 秒开头两秒黑屏”。解决思路有两个去摄像头管理页把 I 帧间隔调小到 1 秒或 2 秒大部分专业摄像头都有这个选项实在没法调乞丐版固件藏得深就接受-c copy的轻微瑕疵或者只对非关键帧问题严重的机位改用轻量级转码ffmpeg -rtsp_transport tcp -i rtsp://... \ -map 0:v -c:v libx264 -preset veryfast -crf 28 \ -force_key_frames expr:gte(t,n_forced*2) \ -f segment -segment_time 600 -segment_atclocktime 1 -strftime 1 \ /mnt/record/%Y%m%d/%Y%m%d_%H%M%S.mp4注意这里-crf 28画质会损失不少只建议作为最后的兜底手段。能用原编码就是最省算力的方案。4. 云端同步把夸克网盘变成自动备份盘4.1 安装 alist 并添加夸克网盘alist 是一个开源的文件列表程序支持把夸克网盘这类存储挂载成 WebDAV 接口。对咱们的方案来说alist 就是把“夸克网盘”和“单板机上的 rclone”之间的桥。安装方式很简单到 alist 的 GitHub Releases 页面下载对应架构的二进制文件单板机一般是 arm64上传到机器里解压然后执行./alist server首次启动会打印一段随机密码记下来。浏览器打开http://单板机IP:5244用 admin 和随机密码登录。为了让 alist 开机自启建议也做成 systemd 服务或者直接丢进 rc.local这步不展开官网文档很详细。登录之后在管理后台左侧找到“存储 → 添加存储”驱动类型选“Quark”夸克填一个存储名称然后把夸克网盘的 Cookie 粘进去保存。完成后回到“文件”页面刷新如果能看到你网盘里的目录列表说明挂载成功。4.2 获取夸克 Cookie 的几个注意点夸克网盘没有开放官方 APIalist 驱动是通过网页端接口工作的所以需要你在浏览器登录后抓取 Cookie。操作其实很简单用电脑浏览器打开https://pan.quark.cn并登录按 F12 打开开发者工具切到 Network网络标签刷新页面随便点一个pan.quark.cn开头的请求在请求头Request Headers里复制整个 Cookie 字段粘贴到 alist 的存储配置里这里有几个血泪教训首先Cookie 会过期通常一两个月过期后 rclone 同步会开始报错表现是文件列表能打开但上传一直 401。解法就是重新登录、重新复制 Cookie、在 alist 里更新保存。其次Cookie 相当于半个登录态手里有 Cookie 的人能直接操作你的网盘文件。所以 alist 管理面板千万不要暴露到公网更不要为了省事开个默认密码问题不断的旧版本。注意夸克账号建议开启异地登录验证。网盘里存的是自家监控录像这个保险必须买。4.3 rclone WebDAV 自动上传alist 挂载成功后它会在http://127.0.0.1:5244/dav提供 WebDAV 接口。我们用 rclone 把这个接口配置成一个远程盘rclone config按提示新配置一个 WebDAV remotetype 选webdavurl 填http://127.0.0.1:5244/davvendor 选otheruser 填 alist 的管理员账号pass 填 alist 的管理员密码配置完成后写一个同步脚本/usr/local/bin/sync_quark.sh#!/bin/bash rclone copy /mnt/record quarkdav:监控录像 \ --transfers 1 \ --checkers 2 \ --log-file /var/log/rclone_quark.log \ --log-level NOTICE find /mnt/record -type f -name *.mp4 -mtime 3 -delete find /mnt/record -type d -empty -delete然后用 cron 每 15 分钟跑一次crontab -e */15 * * * * /usr/local/bin/sync_quark.sh--transfers 1是故意限速为一个并发。夸克网盘对免费账号的请求频率比较敏感并发一多容易触发风控全任务直接失败。单路上传 10 分钟一个 150MB 的片段100M 上行带宽下大概一两分钟就传完稳定性和速度都能接受。4.4 本地清理与容量策略本地盘的清理逻辑就在上面那个脚本里上传完成后只保留 3 天内的录像更早的直接删掉。这样本地磁盘永远只留最近 72 小时的数据不会撑爆移动硬盘也不影响回放更早的去网盘翻就行。云端的清理策略要自己想清楚。免费空间有限我目前的做法是网盘目录按日期建例如监控录像/20250610/每天用手机往网盘里翻一眼确认前一天录像能播放然后手工删掉更早的如果你嫌手工麻烦也可以用 alist 的 API 写定时清理脚本但说实话不太建议在自己机器上跑太多常驻任务。丐版单板机每多一个进程就多一个出问题的点。手工清理还有个额外好处你会顺势检查一遍系统是否在正常工作比等出问题再后悔强多了。5. 回放体验怎样快速翻到想看的那一段5.1 三种回放方式回放路径其实已经不需要自己搭服务了有三条现成的路。第一条手机装夸克网盘 App登录账号后进入“监控录像”目录按日期翻目录在线播放对应 mp4。夸克对 H.264 AAC 视频的播放兼容性很好重点是不限速下载想看哪段可以直接下到手机里慢慢看。第二条局域网内直接打开 alist 的网页端在文件列表里点 mp4 文件新版 alist 自带在线预览。这个适合你在电脑上快速翻看不用经过网盘服务器。第三条直接到单板机本地目录/mnt/record/拷文件。适合单板机就在手边、或者通过移动硬盘挂载访问的场景省去一切中间环节。5.2 目录命名让回放不迷路分段录制最舒服的地方就是回放定位。我的结构是/mnt/record/ 20250610/ 20250610_000000.mp4 20250610_001000.mp4 20250610_002000.mp4 ...文件名里的_001000就是这段录像的开始时间。想回看 2025 年 6 月 10 日早上 8 点 35 分发生的事直接打开20250610_083000.mp4就行最多往后拖 10 分钟。这种定位方式不需要任何数据库比很多商业监控 App 里的时间轴还直观。5.3 免费空间的压缩取舍前面容量账算过了免费空间撑不住无限全量。在预算为零的前提下我的取舍建议是摄像头编码固定成 H.264码率上限设为 1Mbps720P画质能看清人形和车牌就够用如果只关心夜间可以在 record.sh 里加个时间判断21 点到次日 6 点用更高码率录主码流其他时间只录低码流如果摄像头有移动侦测报警功能大部分丐版都有可以只在报警时录一小段但这需要摄像头配置 FTP 推送或 ONVIF 事件折腾成本略高新手可以暂时跳过我自己试过一段时间的“全时段 1Mbps 事件高码率”组合体验还不错。录像体积降了 60%回放需求一点没减。6. 常见问题与排查技巧实录6.1 问题速查表现象可能原因解法录几小时就断流WiFi 丢包严重 / 摄像头过热换 TCP 拉流、加重启逻辑、插有线网线段与段之间开头黑屏 1-2 秒关键帧不在切点调小摄像头 I 帧间隔、加 -segment_time_deltarclone 同步一直 401夸克 Cookie 过期重新登录、更新 alist 里的 Cookie上传速度慢 / 失败并发过高触发风控保持 --transfers 1不要同时开多个任务录像文件名时间不对单板机系统时间漂移开启 NTP 自动校时回放有声音没画面摄像头音频是 G.711录制命令加 -map 0:v 丢弃音频mp4 在电脑上打不开段边界损坏或 H.265 编码用 ffprobe 检查摄像头切到 H.2646.2 两个真实翻车现场第一次翻车发生在设备装好后的第二天。我用的 WiFi 摄像头放在客厅角落单板机在书房中间隔了两堵墙。录像文件在本地能生成但经常出现 20 到 40 分钟的断档ffmpeg 日志里全是Could not demux和重连记录。查了一圈根本不是软件问题是 2.4GHz 信号在墙之间反复失联。最后把摄像头挪到了路由器直连网线附近插上 PoE 供电的转接头断档问题直接消失。所以能上有线就上有线实在不行的至少把摄像头和单板机放在同一个 AP 下。第二次翻车在网盘端。跑了一个多月某天突然发现 rclone 日志里全是HTTP 401。我一度以为是 alist 挂了后来才想起夸克的 Cookie 过期了。重新抓 Cookie、更新、保存系统恢复。这之后我养成了两个习惯每两周手动登录一次夸克网页端顺便看眼目录里有没有新文件在 sync 脚本里加了文件缺失告警连续两轮同步无新文件就往日志里打 ERROR。6.3 安全上的几条死线整套系统隐私浓度很高摄像头对着家里录像进了网盘这里有三条规定我必须强调第一摄像头的默认密码必须改出厂 admin/admin 等于没设密码。同时关闭乞丐版摄像头自带的 P2P 云通道也就是厂商 App 里那个“远程访问”开关只要你这套系统能自己回放就不需要厂商服务器当二道贩子。第二不要把摄像头的 RTSP 端口、alist 管理面板端口映射到公网。我见过很多人图方便在路由器里做端口转发结果就是把自己的监控流裸奔给全网扫描器看。你要远程回放用夸克 App 就够根本不需要直接访问摄像头。第三夸克 Cookie 要当密码一样对待。alist 后台里存着完整 Cookie谁拿到它谁就能操作你的网盘。别在公网面板里留默认密码别用同一个账号在不可信设备上登录有条件就开两步验证。7. 写在最后这套系统还能往哪走这套自建系统我已经稳定跑了三个多月中间只换过两次夸克 Cookie、重刷过一次系统。最大的感受不是省了多少钱而是录像终于不看厂商脸色了本地盘和网盘双保险任何一端挂了另一端还能兜底回放再也不用拔卡。最后分享一个小技巧第一次跑通之后别急着把所有参数调到位。先让系统裸跑两天观察录像文件大小、上传耗时、网盘剩余空间再根据实际情况决定是不是要降码率、改切段时间。监控系统最怕的不是配置低而是调得太满没有余量。留一点带宽和空间余量这台吃灰的单板机才能一直稳定跑下去。