1. 为什么我要放弃云套餐和内存卡:三个月烧了三张卡之后
如果让我给“云存储”“内存卡”“摄像头”这三样排个坑,我可以负责任地说:内存卡排第一。家里装监控两年,我前后买了三张高耐久TF卡,最长的撑了四个月,最短的不到一个月就写入速度掉到10MB/s,最后被读卡器识别成“RAW”格式。云存储套餐也没好到哪去,一年两百多,只能回放最近三天,换个清晰度还要另外加钱。当时我就想,这生意做得实在太舒服了。
后来我把客厅摄像头拆下来,翻出抽屉里一台吃灰的树莓派Zero 2W,朋友送的一只所谓“乞丐版”USB摄像头(30万像素那种),再挂上夸克网盘的免费容量,自己搭了一套24×7监控存储与回放系统。整套系统跑下来的月度附加开销是零元,前提是你手里也有这么一堆闲置设备。如果你一件闲置都没有,按最便宜的方案补齐,成本也就是一顿外卖钱。
先别急着看配置,我把需求拆开讲清楚。我要的是一个非常传统的监控场景:客厅角落,24小时不间断录制,不追求实时直播,但至少要能翻回去看一周内某个时间段发生了什么。晚上光线暗,白天光线好,画面不需要多高清,能分清人形轮廓就够。这套需求放到商业产品里,对应的是“云存储年费会员”和“TF卡连续写入”,但这两样恰好是最不划算的消费。
我最后一根稻草是一次回放。那天地下车库有人拿错了快递,我调监控,结果翻到APP里发现只能看三天前的,三天前的数据已经被覆盖了。我下了个决心:监控设备是自家的,存储也应该尽量由自己控制。云端的“套餐”本质是把录像存到服务商的服务器里,按天卖给你;TF卡则是让一张卡在高温、连续写入的场景里扛一年,两样都不符合我的预期。
所以这套系统的核心思路就一句话:让摄像头负责采集,让闲置单板机负责本地切片,让夸克网盘负责云端存档。采集、编排、存档三层分离,每一层坏了都能单独替换,而不是再换一台整套监控。这也是我希望你在读完这篇文章后能带走的东西。
2. 硬件清点:垃圾堆里凑出一套可用系统
先说摄像头。如果你有旧的网络摄像头,优先用网络摄像头,只要支持RTSP协议,后面会很省事。如果没有,那只非常便宜的USB摄像头也能干,关键在于它可以被Linux直接识别成视频设备,一般叫“UVC免驱摄像头”。再退一步,抽屉里的旧手机也能当摄像头,安装一个IP摄像头App,开启RTSP服务,画质往往比你想象中好很多。这三种方案我都试过,最后长期用的是“旧手机+RTSP”,因为画质最稳,而且不用拖着USB线。
然后是单板机。树莓派Zero 2W、树莓派3B、香橙派Zero2,甚至那些已经被淘汰的电视盒子,只要能刷入Linux系统并支持USB接口,都能做这个项目的录制端。先别急着买新的,先看看家里的旧设备。我手上的树莓派Zero 2W是当年买来玩GPIO的,性能放到现在非常弱,但跑一个ffmpeg录制进程绰绰有余。它的CPU只需要把摄像头送进来的视频流做切片,不需要转码,压力很小,功耗也只有两三瓦。
存储介质是容易被忽视的一环。我做第一版时偷懒,把录像直接写进树莓派的TF卡,结果一个月没到系统就卡成幻灯片。原因很简单,监控是7×24小时连续写,TF卡的写入寿命在这种场景下会迅速耗尽。后来我把系统盘和数据盘彻底分开:系统还是跑在TF卡上,但录像的保存路径指向USB口外接的U盘或者移动硬盘。U盘虽然没有宣传的“监控级寿命”,但比TF卡耐造得多,而且坏了换一张也很便宜。
如果你手上没有U盘,那用带供电的移动硬盘也可以,但要注意供电。树莓派的USB口本身供电能力有限,很多移动硬盘需要外部供电,否则会出现掉盘、卡死。这是我的经验:宁可多插一个有源的USB Hub,也不要直接把移动硬盘插在主板上,不然半夜掉盘一次,录制进程就断了。
我用到的硬件清单整理成了一张表,你可以对照着找:
| 角色 | 我实际用的 | 最低要求 | 备注 |
|---|---|---|---|
| 摄像头 | 旧手机(IP摄像头App,RTSP输出) | 支持UVC的USB摄像头,或支持RTSP的IP摄像头 | 实在没有,用手机就算“捡垃圾”成功 |
| 单板机 | 树莓派Zero 2W | 能跑Linux ARM系统,有USB口和网络接口 | 树莓派、香橙派、旧电视盒子都行 |
| 本地存储 | 旧U盘(32GB) | USB 2.0以上,容量至少16GB | 一定不要直接写TF卡 |
| 上传代理 | 一台常年开机的旧笔记本 | 能装夸克网盘客户端即可 | 家里有台式机也行,如果需要低功耗,可以选笔记本 |
| 网络设备 | 普通路由器 | 能设置固定IP即可 | 不做端口映射,不需要公网IP |
这套系统真正花钱的地方几乎没有。如果你是一个设备都没有的纯新手,那最省钱的做法是:花20块钱买一只USB摄像头,找一个二手ARM开发板,再找一只U盘。夸克网盘的免费容量和客户端都不收费,软件方面ffmpeg、Samba、Linux系统也都是免费开源的。唯一要付出的就是折腾时间,我认为这很值得。
3. 整体架构与数据流转:录制和上传分开干
很多人在自建监控时容易踩一个思维陷阱:想用单板机把“录制+上传”全包了。但现实是,网盘客户端在Linux上并不总是有官方支持,夸克网盘目前也没有稳定的Linux客户端。与其纠结怎么在单板机上跑客户端,不如把系统拆开,每层只做一件事。
我的最终架构是这样的:摄像头输出的视频流先进单板机,单板机上的ffmpeg进程按固定时间间隔把视频切成一个个MP4文件,存储在本地U盘上。然后,我把U盘上的“监控”目录通过Samba共享到局域网,家里那台旧笔记本作为上传代理,运行夸克网盘PC客户端,把共享目录里的文件自动备份到云端。需要回放的时候,打开手机上的夸克App,在云盘目录里按日期翻找即可。
录制和上传分开有几个实际好处。首先,录制端不依赖网盘API,ffmpeg断流重连、本地磁盘清理都能在同一个系统里闭环处理,哪怕云端服务哪天抽风,录像还在本地,不会丢。其次,夸克网盘客户端的重试、断点续传机制是现成的,不必自己写上传脚本,省了很多维护精力。第三,单板机的性能非常弱,如果既要录制又要跑上传任务,内存和CPU都可能吃紧,分开以后压力小得多。
文件目录结构我设计了很久,最终用“日期/小时分钟”的方式。目录看起来是这样:
monitor/ 20250615/ 00-00.mp4 00-30.mp4 01-00.mp4 ... 20250616/ 00-00.mp4 00-30.mp4这样命名有一个好处:文件名精确到分钟,回放时直接根据时间点找对应文件,不用打开播放器一个个试。而且按日期分子目录,避免云盘里单个目录文件过多导致刷新卡顿。
容量规划也要提前算一下。我以单路720P视频、H.264编码、码率512kbps为例:一天的数据量大约是512÷8×86400秒÷1024=5.4GB。如果你用夸克网盘的免费空间,通常不可能容纳一周5.4GB×7=37.8GB的录像,所以必须压缩画质或者降低码率。我日常设置为320×240分辨率加较低码率,画面基本能分辨人物动作和轮廓,一天的数据量可以压到1.5GB左右。如果你希望关键时段清晰,可以单独做运动检测触发,这里先不展开。
这里要特别说明:夸克网盘在整个系统里只扮演“档案仓库”的角色。它不需要实时响应,不需要秒级传输,只要每天慢慢把新生成的MP4同步上去就行。因此就算非会员上传速度有限,只要配置合理,半小时的录像延迟十几分钟上传完成,并不会影响事后回放。这也是这套系统能无缝跑起来的关键。
4. 搭建录制端:从刷系统到ffmpeg自动分段脚本
录制端是整个系统最核心的部分,也是我踩坑最多的地方。我以树莓派Zero 2W为例,完整走一遍配置流程,其他ARM单板机思路相同。
第一步,刷系统。我用的镜像是Raspberry Pi OS Lite,无桌面版本,省资源。刷完之后,提前在boot分区里创建一个名为ssh的空文件,用来开启SSH。如果你的网络是WiFi,还需要在boot分区创建wpa_supplicant.conf文件,内容大致是这样的,注意国家区域要写CN:
country=CN ctrl_interface=DIR=/var/run/wpa_supplicant update_config=1 network={ ssid="你的WiFi名称" psk="你的WiFi密码" }开机后,先用路由器后台找到树莓派的IP地址,通过SSH连进去。我习惯给设备设置固定IP,在路由器里做DHCP地址绑定,防止IP漂移导致后面的共享目录失效。
第二步,装基础软件:
sudo apt update sudo apt install -y ffmpeg samba v4l-utils ntpdate sudo timedatectl set-ntp true第三步,验证摄像头。如果是USB摄像头,插上去后执行:
lsusb v4l2-ctl --list-devices正常情况下会看到一个video0设备节点。用下面这条命令抓一张测试图片,确认画面没问题:
ffmpeg -f v4l2 -i /dev/video0 -frames:v 1 test.jpg如果是网络摄像头,先用电脑或VLC验证一下RTSP地址能通,然后在树莓派上测试:
ffmpeg -rtsp_transport tcp -stimeout 5000000 -i "rtsp://账号:密码@IP地址:554/stream1" -frames:v 1 test.jpg第四步,写录制命令。对于USB摄像头,我推荐把视频流转成H.264并切片:
mkdir -p /home/pi/monitor cd /home/pi/monitor ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -framerate 15 -i /dev/video0 \ -c:v libx264 -preset veryfast -crf 30 \ -f segment -segment_time 1800 -strftime 1 \ monitor/%Y%m%d/%H%M.mp4这里几个参数说明一下:-segment_time 1800表示每30分钟切一个文件,-strftime 1允许文件名里用时间格式符,%Y%m%d会生成日期目录,%H%M表示小时分钟。如果你用的是RTSP网络摄像头,可以直接用复制流模式,CPU占用更低:
ffmpeg -rtsp_transport tcp -stimeout 5000000 -i "rtsp://..." \ -c copy \ -f segment -segment_time 1800 -strftime 1 \ monitor/%Y%m%d/%H%M.mp4注意:-c copy是直接复制摄像头输出的压缩视频流,不做转码。如果源流格式不标准,MP4文件可能无法播放,那就老老实实加-c:v libx264做转码。
第四步里最关键的一环不是命令本身,而是“保活”。因为ffmpeg进程一旦因为摄像头掉线、网络抖动或内存不足退出,就不会自动回来。我写了一个简单的保活脚本,本质是个看门狗:
#!/bin/bash CAMERA_INPUT="/dev/video0" OUTPUT_DIR="/home/pi/monitor" while true do if ! pgrep -x ffmpeg > /dev/null; then echo "$(date) ffmpeg is not running, restarting..." cd "$OUTPUT_DIR" ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -framerate 15 -i "$CAMERA_INPUT" \ -c:v libx264 -preset veryfast -crf 30 \ -f segment -segment_time 1800 -strftime 1 \ "$OUTPUT_DIR"/%Y%m%d/%H%M.mp4 \ 2>>/home/pi/monitor_recorder.log & fi sleep 15 done这个脚本的逻辑很简单:每15秒检查一次ffmpeg进程是否存在,不存在就重新拉起。为了更严谨,还可以检查磁盘空间,超过90%就清理最老目录。清理命令可以这样写:
df -h /home/pi/monitor | tail -1 | awk '{print $5}'如果空间告急,就直接删除最早的日期目录。可以把这套检查逻辑合进同一个脚本里,我用crontab让整个脚本每分钟执行一次,既避免进程僵尸化,又能定期清盘。
第五步,做成系统服务。这样断电重启后不需要登录去手动启动。创建/etc/systemd/system/monitor-record.service文件:
[Unit] Description=Monitor Recorder Service After=network.target [Service] ExecStart=/home/pi/record_watchdog.sh Restart=always RestartSec=15 User=pi [Install] WantedBy=multi-user.target然后执行:
sudo systemctl daemon-reload sudo systemctl enable monitor-record.service sudo systemctl start monitor-record.service到这一步,录制端已经能稳定产出分段录像文件了。你可以先用手动方式跑一个多小时,确认文件按30分钟一个分割,然后继续配置上传端。
5. 把录像送进夸克网盘:共享目录与自动上传的配置细节
单板机只负责录,不负责传,那上传这端怎么处理?我在局域网里放了一台常年开机的旧笔记本,上面安装了夸克网盘PC客户端。要让它自动备份,第一步是把单板机上的录像目录变成共享文件夹。
在树莓派上安装Samba之后,编辑/etc/samba/smb.conf,在文件末尾追加一个共享节:
[monitor] path = /home/pi/monitor browseable = yes read only = no guest ok = yes force user = pi如果不想让局域网里任何设备都能直接看你的录像,可以把guest ok改为no,然后专门设置一个Samba用户和密码:
sudo smbpasswd -a pi保存配置并重启Samba服务:
sudo systemctl restart smbd在Windows笔记本上,打开文件资源管理器,地址栏输入\\树莓派IP\monitor,如果能正常看到录像目录,说明共享成功。为了让夸克客户端稳定识别,我建议把这个路径映射成本地网络驱动器,比如Z盘。右键“此电脑”,选择“映射网络驱动器”,输入共享路径,勾选“使用其他凭据连接”,填Samba用户名密码即可。
接下来打开夸克网盘PC客户端。不同版本的界面可能不太一样,但核心逻辑都是找“备份”或“同步”相关入口。我用的版本里,有一个“自动备份文件夹”功能,可以新建任务,源目录选择刚才映射的Z盘,目标目录在云盘里设为“监控录像”。关键的一点:必须选择“单向上传”,也就是本地文件新增时,云端自动复制一份,但云端若有删除操作,不会反向删除本地文件。如果错选成“双向同步”,哪天你在网盘里清理旧录像,本地也会被删,那就可能删掉尚未上传完的数据。
夸克客户端识别网络驱动器这件事,不同版本兼容性不同。我在笔记本上实测时,直接把Z盘选进去偶尔会报“路径无效”,解决办法是先把网络共享中的录像文件夹复制到一个本地临时目录,然后让夸克备份这个本地目录。但这样会浪费一倍磁盘空间。后来我发现,先确保Windows能通过Z盘访问,再打开夸克客户端的目录选择框,用左侧“此电脑”展开Z盘,成功率会高很多。如果还是失败,就升级客户端版本或者换用功能更完整的PC客户端。
上传端还有一个现实问题:非会员上传速度有限。如果你的网络上行带宽不高,又长时间挂机,很可能出现“本地不断生成新录像,云端还没来得及传完”的积压。我解决这个问题的办法是,把ffmpeg的分段时长从30分钟调整为20分钟,每段的文件更小,上传任务更细,断点续传时损失更小。同时,我在本地清理录像的策略上留了余量:保留最近两天的本地文件,等待云端的确认,而不是录完就删。
具体到数据一致性,最保险的做法是“本地先留三天,云端确认存在后再清理”。因为夸克客户端的上传状态不会直接暴露给本地脚本,我采用了一个“三重时间戳”原则:本地保留至少三天录像,三天前的文件如果云盘空间足够就继续留,不够了才删最老文件。这样即使上传失败,只要客户端最终重试成功,数据也不会丢。
如果你家里没有常开电脑,这条路就会走不通。这时候有两条变通路线:一是换一个支持WebDAV或Linux官方客户端的网盘,把rclone挂载到单板机上,实现直接上传;二是接受“单板机+旧电脑”的组合,把旧电脑看作整个监控系统的一部分。我标题里说的“不花一分钱”,指的就是把这类闲置设备重新利用起来,而不是硬要全部用单板机完成。
6. 回放体验:手机App和电脑端翻录像的正确姿势
当云端开始积累录像之后,回放这件事就变得非常轻松。手机端我直接用夸克App,登录同一个账号,进入“监控录像”目录,按日期一层层点进去,找到对应时间段的MP4文件,点开就能在线播放。在线播放对网速有一定要求,但监控分辨率本来就不高,手机流量也能拉动。我实际使用中最大的感受是:不需要安装专门的监控App,也不需要记住厂商的账号体系,普通网盘App就能完成这个任务。
如果要在电脑上认真排查某件事,我会先把对应日期的目录同步下来,再用本地播放器打开。因为在线播放快进和拖动进度条时会有缓冲,而本地播放器可以精准定位到秒。我用PotPlayer打开录像后,开启1.5倍速或2倍速,快速跳过空白时间,效率非常高。文件名精确到分钟的好处在这里体现得特别明显:比如我知道快递是下午2点40分左右被拿走的,我只需要看2点30分和3点00分两个文件,而不是把整个下午的视频全部拖一遍。
还有一个不算缺点的缺点:这套系统是“准实时”,不是“实时直播”。ffmpeg每20分钟切一个文件,夸克客户端再慢慢上传,所以云端回放通常比实际时间滞后5到15分钟。如果你只是想晚上睡前看看白天家里发生了什么,这个延迟完全可以忽略。但如果你想在手机上实时看孩子到家没有,那这套系统不适合,你应该保持单板机本地录像,在局域网内用VLC实时拉流,而不是依赖云盘回放。
关于回放的检索,我养成了一个小习惯:每天晚上睡前打开夸克App,浏览一下当天的录像目录结构,把文件数量和时间间隔扫一眼。发现哪个时间段的文件缺失,说明当时摄像头可能掉线了,第二天就去检查录制端。这种“目录列表即健康状态”的方式,比打开监控App的云回放界面更直观。
如果你有多个摄像头,同样可以在云盘里按摄像头名称分子目录,比如“客厅”“阳台”“门口”,再在子目录里按日期分。我的目录结构后来扩展成了这样:
监控录像/ 客厅/ 20250615/ 00-00.mp4 00-20.mp4 阳台/ 20250615/ 00-00.mp4这样回放时就能快速定位到具体设备,不会混在一起。
7. 长跑一年的排雷记录:烧卡、时间漂移、掉线重连
系统跑了大半年,我用血泪换来了几条排雷经验,值得一条条讲。
第一,死磕TF卡没有任何意义。我最初把录像存在树莓派的TF卡上,一个月后系统开始频繁卡顿,检查发现卡的smart信息已经接近寿命极限。后来换成USB外接U盘,同样连续写入,稳定跑了好几个月。所以如果你有条件,请一定让本地存储跳过TF卡,直接把数据目录指向U盘或者移动硬盘。U盘建议选大厂品牌,至少是USB 3.0规格,虽然树莓派Zero 2W只有USB 2.0速度,但U盘的4K随机写能力比TF卡强太多。
第二,树莓派没有RTC,断电重启后时间会错乱。如果系统时间不对,ffmpeg生成的文件名就会错,比如下午3点的录像写到上午10点,这样回放时很难找。我配置了网络时间同步,还在保活脚本里加了一小段,每次检测到ffmpeg重启时,先强制同步一次时间:
sudo ntpdate -u ntp.aliyun.com这样即使断电后时间漂移,只要联网,几分钟内就能校回来。
第三,USB摄像头掉线和网络摄像头断流,是两类经典的故障。USB摄像头长期通电,USB口供电不稳可能会让设备节点消失。我加了一个有源USB Hub,问题明显改善。网络摄像头则要注意RTSP协议的重连参数,我在ffmpeg命令里加上-stimeout 5000000,意思是连接超时5秒,如果流中断,保活脚本会在15秒内自动重启进程。这个组合配合下来,掉线时间基本能控制在分钟级以内。
第四,上传积压比录制失败更隐蔽。有一天我突然发现本地U盘快满了,查了一下发现夸克客户端的自动备份任务不知什么原因停了,可能是客户端更新后缺少权限,也可能是网络断线导致任务阻塞。从那以后,我每周检查一次U盘剩余容量,如果容量持续下降,就先看客户端是否还在运行。不要指望网盘客户端永远稳定,它只是一个普通的普通软件,也会更新、弹窗、锁死。
第五,同步方向一定要设对。我第一次配置夸克自动备份时,误选了“双向同步”,某天手动清理云端旧录像,结果客户端把本地对应文件也删了。监控录像本身是“单向数据”,云端只是副本,不是主数据源。你应当把本地U盘视为第一优先级的存储,云端当作备份和远程访问通道。
第六,安全底线不能越过。我没有把树莓派的SSH端口映射到公网,也没有给摄像头开通UPnP。整条回放链路的远程访问,完全依靠夸克网盘的账号体系。如果你手里的网络摄像头本身支持公网直连,请务必把密码改成强密码,并且关闭P2P穿透,否则录像可能被别人直接拉流。系统安全不一定靠复杂防火墙,有时候“不出现在公网”才是最有效的保护。
最后再说一下功耗。树莓派Zero 2W加USB摄像头,实测功耗在2.5W左右,旧笔记本做上传代理大约10W,一个月下来的电费折算后基本可以忽略。如果旧笔记本功耗太高,可以考虑换一个低功耗的安卓盒子,只要能跑夸克客户端或者浏览器上传,效果一样。我目前这套组合已经持续运行了将近一年,除了中间换过一次设置,几乎没再动过它。
如果你手头也正好有这些闲置设备,不妨按这个思路搭一套。最简单的起步方式是:先把摄像头接到单板机上,打开ffmpeg录制一个下午,确认能生成分段文件;再装上Samba共享,映射到电脑上;最后把夸克网盘客户端自动备份配上。每一步都单独验证,出了问题也容易排查。我个人的体会是,自建监控真正难的从来不是命令,而是接纳“录制和上传分离”这个思路,以及愿意在前几天多做几次检查。等到系统稳定运行一周,你几乎会忘记它的存在,直到你需要翻回某一天录像的时候,才想起来这堆垃圾换来了一个免费的云监控仓库。