ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

树莓派+免费网盘,零成本搭建家庭监控与网页回放系统

树莓派+免费网盘,零成本搭建家庭监控与网页回放系统 这套方案我自己前前后后折腾了快两个星期踩了一堆坑之后才稳定跑起来。现在家里那台吃灰的树莓派3B加上一个9.9包邮的USB摄像头再挂上夸克网盘的免费空间24小时录像、网页回放全部搞定前前后后除了电费没多花一分钱。如果你手里恰好有一块闲置的单板机哪怕是电视盒子刷出来的都可以照这个思路整一套自己的监控存储与回放系统。1. 方案整体设计与思路拆解1.1 监控存储为什么烧钱本地卡、云服务、硬盘录像机的成本账先说清我为什么看不上传统的监控存储方案。大多数人买监控摄像头标配是插一张TF卡或者买一台硬盘录像机NVR配机械硬盘。TF卡看起来便宜但容量有限连续写几个月就会挂读写寿命扛不住24小时不间断录。前年我一张64GB的高速卡连续录了11个月直接变成只读盘里面的监控记录全没了。硬盘录像机倒是专业但一台主流四路NVR加一块4TB监控盘起步就一千多块这还是不含摄像头的费用。云存储服务呢很多摄像头品牌自带云存储套餐一个月十几块到几十块一年下来可以买好几张内存卡了。而且云存储只能看自家APP的录像导出来不方便跨品牌更别提。比较下来自己用单板机做采集把录像推送到网盘的方案硬件成本几乎为零软件全部开源唯一要付出的就是搭建和调试的时间。1.2 我的数据链路摄像头→单板机→夸克网盘→网页回放我搭的完整链路是这样的摄像头先把画面通过USB或网络传给单板机单板机上跑ffmpeg把视频流切成一段一段的MP4文件。这些文件先落在内存临时目录里不是SD卡也不是硬盘然后由一个上传脚本转存到夸克网盘的监控目录。一旦文件到了网盘就算单板机被断电、系统崩了历史录像都还在云端。回放的时候直接在AList的网页里点开对应时间的MP4浏览器内就能播放。整个链路里最核心的部件其实是AList。AList是一个开源的网盘挂载工具它可以把夸克网盘变成WebDAV服务。单板机通过WebDAV协议把这个网盘目录挂载成本地路径然后我往这个路径里写文件就相当于直接上传到夸克网盘。这样我完全没有在本地长期保存视频符合“不花一分钱云存储与内存卡”的主题。1.3 不插内存卡到底行不行临时缓冲与断电丢秒很多人一听到不插内存卡就会问录制数据总得有地方写吧确实摄像头到网盘之间需要一个缓冲地带。我的做法是用内存盘/dev/shm。树莓派3B默认给它分了大约一半内存作为tmpfs比如1GB内存就有大概500MB可用。以720P视频4Mbps码率算500MB能缓冲大约17分钟的视频足够应付上传延迟和网络抖动。但内存盘有一个致命特点断电即失。也就是说如果单板机瞬间断电正在写的那一小段视频会丢。实际丢的时长不会超过一个分段时长我设置的5分钟分段最多丢5分钟。相比内存卡损坏丢全部录像这个损失可以接受。我在电源前加了一个小UPS二手十几块基本把断电丢录像的概率降到很低。如果你不需要断电保护也可以不加反正历史录像都已经在网盘了。2. 硬件准备乞丐版摄像头和闲置单板机的搭配2.1 摄像头选型USB免驱摄像头、老网口摄像头、树莓派摄像头模块怎么选“乞丐版摄像头”这个说法很宽泛实际我试过三类USB免驱摄像头9.9元包邮那种基本是UVC协议Linux内核自带驱动插上就能识别为/dev/video0。缺点是画质普遍一般很多不支持红外夜视但做白天监控足够。我以前还用过一对总钻风摄像头是给智能车竞赛用的OV5647模组实际用在监控上也行只要驱动认。老旧网络摄像头比如海康威视、宇视这类二手监控头走RTSP协议画质和夜视能力吊打USB摄像头。但需要支持POE供电或者单独12V电源单板机通过网线或Wi-Fi拉RTSP流。我手头有一台宇视半球机就是通过RTSP接入树莓派的夜间效果比USB头好太多。树莓派CSI摄像头模块树莓派官方OV5647模块走CSI接口画质比USB摄像头稳定但只能用在树莓派上通用性差。我用过一次后来换成USB口因为CSI驱动在某些系统上需要额外配置折腾成本略高。对于第一次尝试的人我更推荐USB摄像头。便宜、免驱、Linux下问题少。等跑通了整套链路再换成RTSP网络摄像头也不迟。2.2 单板机准备树莓派和电视盒子跑Linux的对比单板机的选择很自由。树莓派3B、4B、Zero 2W都行我用的是树莓派3B1GB内存跑Raspberry Pi OS Lite64位版。如果你手里没有树莓派还有一类更便宜的“垃圾佬”方案电视盒子刷Armbian比如晶晨S905系列盒子刷完Armbian就是一台自带千兆网口的Linux小主机性能和树莓派4B差不多价格甚至比树莓派便宜得多。缺点是刷机过程稍微复杂要找对应的固件和短接点。树莓派3B跑ffmpeg转码其实有点吃紧。我的经验是摄像头出720P H.264流ffmpeg如果只做转封装不重新编码CPU占用很低树莓派3B都能轻松跑。如果是USB摄像头输出裸流需要软编码成H.264树莓派3B会全程满负荷但不至于死机。4B有硬件H.264编码器用-c:v h264_v4l2m2m就能让CPU闲下来。所以如果长期跑建议至少树莓派4B或者电视盒子盒子。2.3 让摄像头出画面V4L2和RTSP两种路子无论什么摄像头到了Linux下最终都是要弄出一个视频源地址。对于USB UVC摄像头用V4L2的方式最直接ffmpeg -f v4l2 -input_format yuyv422 -video_size 1280x720 -framerate 15 -i /dev/video0 -f null -先跑这条命令确认摄像头能被读取。如果提示No such device检查lsusb里能不能看到摄像头设备或者补一个USB延长线排除供电问题。很多9.9元的摄像头对供电电压波动很敏感插在树莓派USB口上偶尔识别不到加一个带供电的USB集线器就稳了。对于RTSP网络摄像头直接用ffmpeg拉流ffmpeg -rtsp_transport tcp -i rtsp://admin:密码192.168.1.64:554/Streaming/Channels/1 -f null -这里要特别强调用TCP传输-rtsp_transport tcp而不是默认的UDP。UDP在Wi-Fi环境下一卡顿就会出现绿屏和马赛克TCP能大大降低花屏概率代价是稍微多一点延迟监控无所谓。3. 夸克网盘挂载免费的云存储怎么变成本地目录3.1 AList部署与夸克网盘授权AList是整套系统的核心先要把它装起来。树莓派是ARM架构直接下载官方对应架构的压缩包就行curl -fsSL https://github.com/AlistGo/alist/releases/latest/download/alist-linux-arm64.tar.gz -o alist.tar.gz tar -zxvf alist.tar.gz cd alist ./alist server第一次启动后会生成一个随机管理员密码用终端输出的账号密码登录Web管理界面。在“存储”中添加夸克网盘驱动按照文档填入Cookie或扫码授权。我的建议是用扫码方式避免手动复制Cookie出错。这里要注意夸克网盘的授权有效期不一定很长过期后录像上传会失败需要在AList后台重新登录一下。后面我会在稳定性那部分再细说。3.2 用WebDAV把网盘挂载到单板机AList除了提供网页管理还内置了WebDAV服务默认地址是http://localhost:5244/dav。在单板机上安装davfs2就能把网盘挂载成普通目录sudo apt install davfs2 -y sudo mkdir -p /mnt/quark sudo chown -R $USER:$USER /mnt/quark echo http://localhost:5244/dav /mnt/quark davfs rw,user,noauto,uid1000,gid1000,file_mode0660,dir_mode0770 0 0 | sudo tee -a /etc/fstab mount /mnt/quark注意这里我故意没有把挂载项加到开机自动挂载。原因是davfs2挂载网络目录时如果网络没起来会出现卡死反而拖慢系统启动。我建议把挂载动作放到一个脚本里等系统网络就绪后再执行或者干脆手动挂载反正长时间运行也不会自己断。3.3 挂载实测表现与坑实际用下来davfs2写夸克网盘的速度大概是每秒几MB到十几MB主要取决于本身上传带宽。家里上行20Mbps的情况下上传4Mbps码率的视频绰绰有余。但有一点要注意davfs2默认会对文件做本地缓存如果往挂载点写一个很大的文件它会先缓存再上传因此会占用本地内存。所以我的录像分段控制在5分钟以内每个文件体积大约100多MB完全在内存盘可承受范围内。如果分段太长比如1小时davfs2缓冲可能写到本地磁盘或内存交换区反而容易卡死。另一个坑是davfs2对文件锁和目录列表的处理比较慢。录像文件写完后如果脚本立刻要检查文件大小偶尔会拿到还没刷新的旧大小所以我一般在上传后sleep 2秒再操作。4. 录像与回放系统的实现4.1 ffmpeg分段录像参数和脚本录像脚本是整个系统的核心我贴一下目前正在用的版本参数都经过实测。#!/bin/bash CAM_NAMEfrontdoor RES1280x720 FPS15 SEG_MIN5 TMP_DIR/dev/shm/${CAM_NAME} FINAL_DIR/mnt/quark/monitor/${CAM_NAME} mkdir -p ${TMP_DIR} while true; do TS$(date %Y%m%d-%H%M%S) # USB摄像头方案 ffmpeg -f v4l2 -input_format yuyv422 -video_size ${RES} -framerate ${FPS} \ -i /dev/video0 \ -c:v libx264 -preset ultrafast -tune zerolatency \ -c:a aac -ar 44100 -ac 1 \ -t 300 \ -y ${TMP_DIR}/${TS}.mp4 # 如果网络摄像头走RTSP就把上面的输入源换成下面这行 # ffmpeg -rtsp_transport tcp -i rtsp://admin:pass192.168.1.64:554/Streaming/Channels/1 \ # -c:v copy -t 300 -y ${TMP_DIR}/${TS}.mp4 # 结束后上传 mv ${TMP_DIR}/${TS}.mp4 ${FINAL_DIR}/${TS}.mp4 2/dev/null # 清理超过3个文件的临时目录用mv后其实tmp是空的保留这句备用 ls ${TMP_DIR}/*.mp4 2/dev/null | head -n -3 | xargs -r rm -f sleep 2 done这个脚本有几个细节值得解释。第一每次录制用-t 300限制时长到了300秒ffmpeg会自动结束脚本再进入下一轮。第二录制直接写到内存盘等到文件完整生成后才用mv移动到网盘挂载点。这样即使网络抖动也不会在网盘目录留下半截文件。第三preset ultrafast和zerolatency是给树莓派这类性能不强的单板机用的主要为了降低编码延迟避免画面越来越卡。4.2 自动上传与临时目录清理因为文件是录完一段就mv到网盘挂载点本来没有单独的“上传”动作。但mv到davfs2挂载点其实是一个复制后删除原来文件的过程脚本里在mv完成后立刻执行清理确保内存盘不会一直积累旧文件。真正容易忽略的其实是内存盘的剩余空间。如果网盘上传速度跟不上录像写入速度内存盘可能会被写满。所以我会在系统里加一个监控脚本每5分钟检查内存盘占用超过80%就强制删除最老的临时文件#!/bin/bash TMP_DIR/dev/shm/frontdoor MAX_PERCENT80 CUR$(df -P $TMP_DIR | awk NR2 {print $5} | tr -d %) if [ $CUR -gt $MAX_PERCENT ]; then ls -tr ${TMP_DIR}/*.mp4 2/dev/null | head -n 1 | xargs -r rm -f fi这个脚本通过crontab每5分钟跑一次。实际运行中由于我的上行带宽足以支撑4Mbps的录像内存盘占用很少超过20%这个清理脚本基本处于睡眠状态。但以防网络故障或者夸克网盘临时抽风有它兜底比较安心。4.3 回放怎么用AList网页播放和手机端回放这一块我没有另外写播放器直接用AList的网页文件列表。把网盘挂载到AList后在它Web界面里能看到监控目录下所有MP4文件点击就能用内置播放器播放。手机端用夸克网盘APP打开同一目录也能看因为文件是直接上传到网盘的天然多端同步。如果你不想用AList的播放器也可以用nginx搭一个简单的目录索引指向网盘挂载点浏览器访问http://树莓派IP/monitor/就能看到文件名列表点击后nginx直接把文件流给HTML5播放器。我用过一段时间除了不支持拖拽秒开之外基本够用。后来还是切回AList因为AList回放体验更好而且它本身已经是系统必装组件。另外看历史录像时经常要按时间段筛选AList默认是按文件名排序我的文件名带时间戳按名称排序就是按时间排序直接找到对应时间的文件就行。跨天后目录按日期分文件夹会更清晰脚本里可以把monitor/${CAM_NAME}后面再拼一层$(date %Y%m%d)这样每天一个文件夹。4.4 24×7稳定运行守护进程与断线重连为了让录像脚本开机自启并崩溃后自动拉起我用systemd做了一个服务[Unit] DescriptionMonitor Recorder Afternetwork-online.target [Service] ExecStart/home/pi/bin/record.sh Restartalways RestartSec10 [Install] WantedBymulti-user.targetRestartalways让脚本无论因为什么原因退出10秒后都会被拉起来。ffmpeg偶发的段错误、USB摄像头掉线等异常都会走这条路恢复。我实测过拔掉摄像头再插回去ffmpeg读到设备消失会报错退出systemd随后拉起脚本摄像头重新识别后录像继续整个过程视频会丢大约30秒。除了守护脚本我还要定期检查夸克网盘的授权是否过期。AList日志出现401 Unauthorized时多半是授权问题。我写了一个健康检查脚本每分钟访问一次AList的WebDAV地址如果多次失败就通过Telegram Bot发通知给我。至于自动重新登录夸克网盘目前没有太好的无感方案因为扫码授权要人为操作。我的经验是在AList里选Cookie登录时Cookies有效期通常比较长运气好一两个月不用管用扫码登录的反而可能每隔几天就过期我现在都改用Cookie方式。5. 常见问题与排查实录5.1 摄像头夜间不灵敏红外一直不切换家里那台旧的海康威视摄像头晚上经常出现“画面黑白但不切红外”的问题监控画质一塌糊涂。排查下来主要有两个原因一是摄像头的红外灯板坏了只能换灯板二是设备没有开启“自动日夜切换”模式需要到摄像头的Web管理页面把模式改为自动并让红外滤光片能正常动作。如果你用的是USB摄像头那就别指望夜视了9.9元模组普遍没有红外灯夜晚只能靠走廊灯或者小夜灯补光。另外云台摄像头如果装在会动的支架上画面角度会被外力改变。有个朋友做工程时用了一套“云台配合倾角传感器和编码器使摄像头随臂架俯仰自动调整角度”的设备那是工业场景家用没必要搞这么复杂。家用摄像头固定安装后用螺丝锁死云台即可。5.2 MP4文件打不开和音画不同步最常见的现象是网盘里看到MP4下载下来播放器提示文件损坏。这通常是因为ffmpeg写入文件时没有正常收尾。我的方案里因为先用内存盘录制完整文件再移动所以正常情况不会出现半个文件。但如果你图省事直接把ffmpeg输出到WebDAV挂载点一旦网络闪断文件就会缺moov原子播放器无法解析。如果录像文件想要支持边录边看可以用fmp4格式也就是在-movflags里加frag_keyframeempty_moov让moov原子写在文件开头这样文件即使没完全写完播放器也能读取已经完成的部分。不过fmp4文件和普通MP4的兼容性有差别AList播放器能放但某些老播放器可能不认。我个人还是倾向于“录满5分钟再上传”的传统方案兼容性最好。音画不同步的问题通常出现在RTSP摄像机拉流时音视频时间戳偏移。解决方法是如果摄像头没接麦克风完全可以不录声音ffmpeg参数里去掉音频相关选项如果一定要声音RTSP拉流时加上-use_wallclock_as_timestamps 1强制用系统时间戳能明显改善不同步。5.3 网盘上传慢、限速、大文件失败夸克网盘免费用户的速率确实不稳定我遇到过晚上高峰期上传1GB文件要20多分钟。不过对监控来说每个5分钟分段MP4大约100MB上传时间远小于录制时间所以只要不是连续几个小时网速都极差问题不大。如果怕大文件失败还可以在AList里把“分段大小”设小一些或者让录像脚本每3分钟切一段。文件越小上传失败重传的成本越低。另外AList与夸克网盘的对接走的是WebDAV写操作某些文件超过一定体积会超时。我在davfs2的配置里加了use_locks0关掉文件锁减少不必要的锁定开销。万一某个文件上传失败我脚本里的健康检查会检测到网盘目录里缺少最新时间戳文件然后重跑一次上传。5.4 免费云盘的合规边界和备份习惯必须提醒一句夸克网盘本质是个人网盘服务不是专门为监控设计的对象存储。你用它的免费容量存自己家的监控录像原则上没问题但要遵守平台的服务条款不要上传任何违法内容也不要在公开分享功能里放开监控目录。家用监控视频涉及隐私网盘账号一定要开二次验证避免摄像头画面被外人翻到。在备份习惯上我建议重要事件比如快递上门、维修师傅进出的录像及时下载到本地或转存到另一个网盘。免费空间不等于永久存储万一账号异常你的监控回放可能就全没了。我把夸克网盘当作主要存储另外每隔一周把关键日期目录复制到移动硬盘里双保险。最后聊一个细节整个系统跑顺之后我最大的体会是监控系统其实没有那么多高深技术把录像链路理顺、把网络波动考虑进去、再做好断线恢复剩下的就是时间积累。如果你也想搭我建议从USB摄像头树莓派AList这条最简单的路开始跑通后再换RTSP摄像头、再加红外补光、再挂自动清理。不用一次到位稳定比功能多更重要。还有一个后悔没早做的事把树莓派的电源换成了带电压稳定输出的充电头之前用普通手机充电头供电摄像头一启动红外灯电压就波动树莓派频繁重启。这个坑说大不大但会让人排查很久。
返回列表