树莓派+夸克网盘,零成本搭建7×24监控存储回放
监控这个需求很多人以为贵的不是硬件而是存储。我朋友开了一家小便利店买了两台摄像头问了一圈云存储一年一百多30天循环备份更贵两三个摄像头加起来一年就得小五百插内存卡呢64G的卡没几天就满循环覆盖写个一年半载卡基本就废了。后来我把家里吃灰的树莓派3B和一台几十块钱的二手摄像头翻出来用夸克网盘当远程存储搭了一套 24×7 监控存储与回放系统从采集、切片、同步到回放全程没再花一分钱。这篇就把这套玩法的完整思路、关键配置和踩坑过程手把手拆给你看。适合想低成本看店、看家、看仓库的朋友也适合手里正好有闲置单板机想折腾点实用项目的人。1. 设计思路先把“省钱”和“省心”都算清楚1.1 传统监控方案的钱到底花在哪很多人买摄像头的时候只看机器价格觉得一百多块的摄像头已经很便宜了结果装完才发现真正的持续支出在“让录像变得可回放”这件事上。厂商云存储通常是按年付7天循环和30天循环价格差不少。一台摄像头一年一百多看着不多但两三个摄像头、三五年下来就是一笔不小的数字而且数据锁在厂商的生态里想换平台就把历史录像全丢了。内存卡更尴尬60G左右的卡720p画质大概能循环覆盖三五天想留一个月得经常换卡监控的频繁写入还非常伤卡过热、坏块都是常见事。至于NVR整套方案设备加硬盘起步就要上千布线安装也麻烦一般家庭用户根本用不出它的价值。我搭这套系统时的核心逻辑是硬件尽量用闲置的存储用已经有的网盘空间外加一点手写脚本。本地只放一个很小的临时缓冲目录真正长期保存和远程回放都交给夸克网盘。这样不但云存储年费为零也不必为监控专门买存储卡。1.2 这套系统的数据流采集、切片、同步、回放这条链路其实不复杂简单说就是四个环节摄像头出视频流单板机定时把它们录成小段文件网盘客户端或同步脚本把本地录像传到云端最后用夸克网盘App或局域网网页播放回放。摄像头如果走RTSP协议输出的是H.264编码的实时流。单板机里的FFmpeg每隔10分钟启动一次抓取一段600秒的视频存成一个独立的MP4文件。为什么不用一个超大文件连续录因为单个文件一旦损坏后面的视频基本全没救切成10分钟一段坏也不过坏10分钟传输同步也方便网盘在线播放时定位某一时间点非常快。这就像快递分拣一大卡车散装货物运输容易出错但打包成一个个标准小箱转运、盘点、找回就轻松多了。后续回放时文件命名里已经带日期和时间按名字找片段就行。1.3 为什么不推荐成品云存、纯本地存储或自建NAS成品监控的云存储虽然省事但它是一个封闭的付费订阅服务续费断供就看不到历史摄像头换品牌后录像也基本带不走。纯本地存储则要面对两个现实问题设备要是被偷录像一起没了内存卡或USB盘长期连续写入寿命损耗很快坏一张卡就等于丢一段时间的录像。自建NAS能把数据掌握在自己手里但对多数家庭用户来说门槛偏高。要让外网随时访问家里的NAS要么做端口映射、内网穿透要么自己申请公网IP这些操作都会暴露家庭网络入口安全风险和维护成本都不低。网盘方案的最大优点就是这些事都不需要你自己做数据从单板机推上去远程回放直接走网盘App相当于把远程访问的运维全部外包了。代价只是上传带宽占用和网盘的容量限制这两点可以通过控制码率和定期清理来平衡。2. 硬件准备把吃灰设备配成监控“壳”2.1 摄像头怎么选老RTSP摄像头是首选我所说的“乞丐版摄像头”不是画质差到没法看而是指它至少能输出标准视频流分辨率720p起步。这里强烈建议优先找支持RTSP协议的老网络摄像头海康、大华、宇视这些牌子的老款基本都能开RTSP流格式通常直接是H.264单板机只需要-c copy就能把视频原样存下来CPU占用很低。如果手里只有USB摄像头也不是不行。二三十块钱的USB摄像头插上就能用但要注意两点一是它输出的多半是MJPG或YUV原始流单板机可能要转码成H.264对CPU有要求二是USB线的长度限制了安装位置摄像头只能放在单板机附近。拿到老摄像头后先用VLC或ONVIF工具扫一下它的RTSP地址。不同品牌路径格式不一样比如海康常见的是rtsp://admin:密码摄像头IP:554/Streaming/Channels/101大华、宇视的路径规则不同网上按“品牌 RTSP地址”都能查到或者直接在摄像头的后台网页里看“媒体设置”页面。总而言之先把画面拉出来后面所有事才有得谈。2.2 单板机怎么选树莓派、香橙派、闲置小主机都行单板机的任务其实不重拉流、写盘、同步上传。如果摄像头输出H.264且你直接copy单板机基本不需要转码双核就够跑如果要用USB摄像头转码那最好四核起步。树莓派3B、3B是我用得最稳的组合注意用质量好的5V电源别用手机充电器糊弄。树莓派4B性能更强但风扇和散热要跟上。香橙派之类国产板子更便宜就是有些型号的内核和驱动比较折腾需要确认系统镜像里的摄像头驱动和硬件编码器能否正常使用。家里有吃灰的x86小主机也可以跑Linux绰绰有余。供电和散热是决定7×24稳定性的关键。很多人的单板机装完就跑结果半夜过热降频摄像头流一断整个录像就断了。我的做法是树莓派加一个几块钱的散热片加小风扇摄像头用独立12V电源不要和单板机抢电。2.3 本地存储、带宽和网盘空间的底线准备本地存储不需要多大但必须和系统TF卡分开。树莓派的TF卡长期承受录像写入几个月就可能有坏块这是很现实的教训。我一般把录像临时目录放在外接的闲置U盘或USB硬盘上系统卡只负责运行系统。上传带宽决定了能同时传几路录像。按1Mbps码率计算一路摄像头一小时产生约450MB数据一天约10.8GB2Mbps码率对应约21.6GB/天。家宽上行一般有30Mbps以上同时传一两路1080p没问题。夸克网盘的免费空间通常也够存一周到一个月具体能存多少取决于码率和保留天数。如果网络断了录像会继续写本地等网络恢复后再由同步脚本补传上去所以本地临时目录的容量不能太抠。另外建议在路由器里给摄像头和单板机分配固定IP不然重启后IP一换脚本地址就全废了。3. 核心实现录像、同步与回放的完整落地3.1 先让摄像头在单板机上正常出画面拿到摄像头后先在单板机上确认设备能被系统看到。RTSP摄像头直接测试取一帧ffmpeg -rtsp_transport tcp \ -i rtsp://admin:密码192.168.1.64:554/Streaming/Channels/101 \ -frames:v 1 check.jpg如果能看到一张正常画面就说明地址、用户名、密码、端口四个要素全部正确。RTSP传输这里我建议强制加-rtsp_transport tcp虽然视频流会经过TCP封装稍大一点但比UDP稳定太多否则局域网稍有信号波动就花屏断流。如果是USB摄像头先看设备节点lsusb v4l2-ctl --list-devices然后用FFmpeg抓一帧确认编码格式ffmpeg -f v4l2 -input_format mjpeg \ -video_size 1280x720 -framerate 15 \ -i /dev/video0 -frames:v 1 snap.jpg比较坑的地方是USB摄像头的设备节点不固定有时候是/dev/video0有时候重启就变成/dev/video1。我的建议是先固定好摄像头插的USB口再通过udev规则给它绑定一个固定节点名省得录制脚本一个月后突然找不到设备。3.2 FFmpeg每10分钟录一段完整MP4不依赖segment这里我先说结论用定时任务启动FFmpeg每10分钟录一个独立MP4文件比让FFmpeg用-f segment持续切片更稳。segment模式对MP4的moov atom处理经常出幺蛾子而且在网盘同步时会容易把正在写的半截文件上传上去。独立进程的好处是每次录完都是完整文件同步、回放、校验都省心。录制脚本我放在/usr/local/bin/record_one.sh#!/bin/bash # 每10分钟录制一段600秒的视频先写临时目录再搬入录像目录 SRCrtsp://admin:123456192.168.1.64:554/Streaming/Channels/101 DIR/mnt/recordings TMP/mnt/tmp LOCK/tmp/record_one.lock flock -n $LOCK || exit 1 mkdir -p $DIR $TMP ffmpeg -hide_banner -loglevel error \ -rtsp_transport tcp -i $SRC \ -t 600 -c copy -an \ $TMP/$(date %Y%m%d_%H%M%S).mp4 mv $TMP/*.mp4 $DIR/ 2/dev/null这段脚本有几个细节值得说。-c copy表示直接复制视频流不重新编码老摄像头是H.264流时这点尤其关键CPU占用几乎可以忽略。-an是去掉音频监控场景大多数时候不需要声音能省不少体积。flock -n是为了防止上次录制还卡着没退出新一轮定时任务又启动导致两个FFmpeg抢同一个摄像头。然后配置cron定时任务*/10 * * * * /usr/local/bin/record_one.sh /var/log/cam_record.log 21注意cron环境里的PATH很短脚本里最好把ffmpeg写成绝对路径或者在脚本开头加一行export PATH/usr/local/bin:/usr/bin:/bin否则很容易出现“手动跑正常定时任务没反应”的情况。如果手头只有USB摄像头把-i参数换成v4l2源并把-c copy改成硬件编码树莓派用h264_omx性能强一点的机器用libx264 -preset veryfast -b:v 1500k。原因是USB摄像头输出的MJPG或YUV流不能直接塞进MP4里被播放器顺畅识别必须先转成H.264。3.3 把录像自动同步到夸克网盘同步是这套系统的灵魂。如果你家里有一台常开的Windows或macOS电脑最简单的办法是装夸克网盘官方客户端把录像目录通过Samba共享出来然后在电脑里把这个共享目录作为自动备份目录。树莓派那边只需要装个Samba服务sudo apt install samba然后在/etc/samba/smb.conf里加一个共享段把/mnt/recordings暴露给局域网。电脑端映射网络驱动器后夸克网盘客户端会自动把新出现的录像文件传到云端。这个方案的优势是完全用官方客户端稳不需要额外折腾缺点是你得有一台常开的电脑。纯Linux单板机环境下我用了另一个组合alist rclone。alist是一个开源网盘桥接工具可以把夸克网盘挂载成本地WebDAV服务然后rclone定时把/mnt/recordings同步上去。具体做法是在单板机上部署alist按官方文档完成夸克网盘的登录授权挂载好网盘存储。开启alist的WebDAV开关记下WebDAV地址一般类似http://127.0.0.1:5244/dav/网盘挂载目录。配置rclonerclone config选择webdav类型url填alist的WebDAV地址vendor选Other这样会生成一个叫quark的remote。同步命令rclone copy /mnt/recordings quark:监控录像 \ --transfers 2 --size-only \ --log-file/var/log/rclone.log这里我刻意用copy不用sync。sync会把remote端多余文件删掉我们只需要增量上传copy更安全。--size-only可以避免反复上传时间戳不一致的文件。最后再加一条cron*/30 * * * * rclone copy /mnt/recordings quark:监控录像 --transfers 2 --size-only /var/log/rclone.log 21录像文件到网盘后本地如果空间紧张可以等同步确认完成后再删旧文件。稳妥的做法是在rclone命令加同步成功后再执行本地清理find /mnt/recordings -name *.mp4 -mtime 7 -delete这个命令只删7天前的本地文件网盘端保留更长时间。有一点需要提前声明alist这类第三方桥接工具属于开源社区方案使用前请确认符合网盘服务条款个人备份量级问题不大但别拿去做超大规模商用转发。3.4 回放网盘在线播放和局域网网页播放两手准备录像都传上去了回放自然不用再装一堆厂商App。最直接的方式是打开夸克网盘App进“监控录像”目录按日期文件夹找到目标时间点在线播放MP4。网盘中视频播放器对H.264的MP4支持很好拖动到关键时间点也顺畅。如果设备在局域网内我更推荐在单板机上起一个极简网页服务python3 -m http.server 8080 --directory /mnt/recordings --bind 0.0.0.0手机浏览器访问http://单板机IP:8080就能看到按日期命名的目录和MP4文件列表直接点开就播。这个方案不依赖网盘也不暴露到外网纯局域网内回放速度最快。想要带着密码保护再加一层Basic Auth就行只是日常个人使用没必要搞复杂。文件命名是回放系统里最容易被忽略的细节。我的录像文件名是20250412_183000.mp4这种格式日期加时间一目了然。今天出事了看一眼时间戳再顺着网盘目录点进去10分钟内就能找到对应视频。4. 七天二十四小时跑下来我遇到的那些坑4.1 摄像头掉线、黑屏、花屏的排查顺序这套系统最怕的是摄像头掉线而掉线原因通常不是摄像头本身而是供电和网络。摄像头画面突然黑屏我一般按这个顺序查先看摄像头指示灯和后台管理页面确认设备本身还活着再ping一下摄像头IP确认网络通最后看单板机上的录制日志确认FFmpeg是否有重连报错。RTSP流用TCP传输后花屏情况会少很多。如果FFmpeg还是偶发报错比如出现method SETUP failed多半是摄像头同时被多个客户端连接有的老摄像头只允许一个主码流会话。这时候要么停掉VLC测试要么让录像脚本只拉一路流。还有一次我排查了半天结果是摄像头固件后台的RTSP开关被重置关了重新打开就好。USB摄像头的坑更多集中在设备节点和供电上。节点漂移问题前面提过供电不足的表现则是画面隔几十秒卡一下或者设备直接消失。换一根质量好的USB线和独立供电的USB HUB能解决掉大半症状。4.2 TF卡频繁损坏把写入量降下来树莓派最怕的是24小时不停写TF卡系统日志、录像文件一起堆进去半年到一年卡就会出坏块。我的解决办法是三层第一录像目录无论如何要放外接存储TF卡只放系统。第二把系统日志调到最小syslog和journald都限制体积临时文件尽量用tmpfs重启就清掉也不会伤卡。第三关掉swap树莓派对swap的使用频率很低但每次换页都在磨损TF卡。用iotop可以清楚看到是哪个进程在持续写盘。排查下来除了录像最常见的就是系统自带的日志转储和包管理器的自动更新。把不必要的计划任务一律停掉整个系统的安静程度会提升很多。如果实在没有USB硬盘只有一张老TF卡那就接受“卡会坏”的事实把录像文件不停往网盘传本地只保留最近一两天。这样即使卡突然坏了损失也就一两天录像。4.3 网盘同步失败、漏传先别急着怀疑网盘我一开始直接把录像目录设成同步目录结果发现总有些文件没传上去后来定位到原因FFmpeg写文件期间同步客户端就把还没写完的MP4抓去传了传了个半成品后面就跳过了。解决办法就是脚本里“先写临时目录再mv进录像目录”这个设计。alist/rclone方案里漏传更多是登录态过期和脚本并发导致的。夸克网盘在alist里的授权登录态会过期过期后rclone显示PermissionDenied日志里能看到401或403。我的做法是写一个小脚本定时检查rclone日志发现鉴权错误就用curl发个本地通知提醒我重扫一次alist授权。还有一点容易踩rclone上传大文件时如果网络中断残留的partial文件下次可能卡住。--transfers 1或2控制并发以后这类问题会少很多。再配合每30分钟一次的定时重试漏传事件基本能被自然消化。4.4 长期运行变慢、不稳定的自检清单7×24系统跑久了最常见的问题不是一次性的设备故障而是性能慢慢劣化。我给自己总结过一个自检清单摸机身温度看单板机是否降频查dmesg里有没有USB设备反复断开重连看网络连接数有没有进程崩溃后变成僵尸连接占满内存最后检查系统时间树莓派如果没有联网校时录像文件名会越偏越远回放定位直接乱掉。树莓派这种设备如果白天太阳直晒机箱温度超过70度就会开始降频FFmpeg录制偶发超时。解决办法是改善散热同时给录像脚本加一个超时退出timeout 650 ffmpeg ...这样哪怕一次录制卡在摄像头无响应650秒后也会自动杀掉进程下次定时任务还能正常启动。再加上cron每10分钟兜底整个系统就有了最基本的自愈能力。5. 还能怎么玩从看店到看家再到动作告警5.1 画质、存储与留档时长怎么平衡监控录像不是画质越高越好而是够用就好。720p可以看清人形轮廓和动作1080p能看清车牌2K以上在固定机位监控里往往只是浪费空间。码率决定了体积分辨率常见码率每天容量1TB空间可存720p1Mbps约10.8GB约90天1080p2Mbps约21.6GB约45天1080p4Mbps约43.2GB约23天如果你主要想看有没有人半夜进店720p、1Mbps完全够用还能多留一倍历史。如果追求更多细节就用1080p但控制码率在2Mbps以内。监控场景画面变化小H.264压缩效率很高不需要像影视视频那样追求高码率。网盘空间有限时建议设一个“本地留7天云端留30天”的默认策略。院子里或店门口的关键位置甚至可以只留动作触发前后的片段进一步压缩存储。5.2 多摄像头接入的统一规划一台单板机带多路摄像头关键是不要把所有FFmpeg进程挤在一起抢CPU。我的做法是给每个摄像头单独一个录制脚本脚本里把输出目录分开比如/mnt/recordings/cam01/、/mnt/recordings/cam02/。定时任务分别执行cron里错开一两分钟启动避免同时开始录制导致磁盘IO高峰。网盘同步时也是一样rclone按顶层目录慢慢传--transfers控制在2左右不要一梭子全传上去把上行带宽占满。多路同时写入时本地存储尽量用USB硬盘或SSDU盘扛不住并发写入。5.3 加一点动作检测录像和告警更省空间纯24小时循环录像是最笨的办法但也是零开发成本的办法。等系统稳定跑起来之后还可以给单板机装一个开源运动检测软件比如Motion或Frigate检测到画面变化时只保存事件前后30秒的视频很多时间静止的场景就能不录像存储占用直接砍掉一大半。告警侧的做法是在运动检测触发后让脚本发一条HTTP请求到手机推送服务相当于实现了“有人进入画面就通知你”的功能。这一层我不展开写了因为方案比较多而且涉及各家推送平台的配置更适合作为下一步折腾的方向。先把录像链路跑稳再谈智能告警顺序不能反。最后再分享一个心得这套系统跑起来后真正让我觉得值的地方不是省了那几百块云存储费而是它把几个本来吃灰的东西串成了每天真正在干活的生产力工具。第一次出回放需求时打开夸克网盘App直接翻到对应时间点把视频拉出来那种踏实感挺强的。摄像头对着公共区域时注意别侵犯邻居隐私监控范围尽量控制在自己地界内这是我自己一直守着的基本线。