在本文中,将探讨如何使用树莓派零(Raspberry Pi Zero)和红外摄像模块来构建一个成本低廉的CCTV监控系统。首先,需要找到一根合适的电缆,因为随摄像头板附带的电缆并不适合树莓派零。幸运的是,可以在eBay上以大约2美元的价格购买到大约80厘米长的电缆。尽管文档警告说使用长电缆可能会导致数据丢失,但在使用5米长的电缆时并没有遇到这样的问题。
接下来,需要找到一个价格合理的夜视模块。购买的模块价格不到10美元,它的外观如下:
该模块在相机模块的两侧各有两个红外LED模块,固定在中心位置。尽管LED灯是永久开启的,但无论是白天还是夜晚模式,画面质量都令人满意,相机模块仍然物有所值。
下一步是让树莓派像CCTV一样工作,即持续拍摄帧快照并录制视频,并通过网络访问。虽然可以使用默认工具如raspivid和raspistill来实现这一目的,但支持RTSP需要使用第三方工具。经过一些研究,决定使用v4l2rtspserver,它似乎很容易设置并且工作得很好。以下脚本,当放入rc.local时,会在树莓派启动后运行RTSP服务器,并提供640×480分辨率,每秒5帧的视频流:
while :
do
v4l2rtspserver -W 640 -H 480 -F 5 /dev/video0 > /dev/null 2>&1 < /dev/null
done
默认的RTSP地址是rtsp://127.0.0.1:8554/unicast,可以通过传递给v4l2rtspserver的各种命令行选项进行更改。由于相机模块现在完全由RTSP服务器控制,因此不能再使用raspivid和raspistill。需要使用ffmpeg来拍摄快照。可以配置一个cron作业,每分钟运行以下命令以生成所需的快照:
ffmpeg -nostdin -rtsp_transport tcp -stimeout 10000000 -i rtsp://127.0.0.1:8554/unicast -f image2 -vframes 1 -vf "crop=639:480:0:0, drawtext=fontfile=/Windows/Fonts/Arial.ttf: text='%{localtime}': x=w-tw-10: y=10: fontcolor=white: box=1: boxcolor=0x00000000@1: fontsize=15" -strftime 1 snapshots/%Y-%m-%d_%H-%M-%S_img1.jpg
虽然也可以使用FFmpeg进行视频录制,但由于一些定时问题,不能将FFmpeg与v4l2rtspserver一起使用。在测试中,尽管录制工作正常,但FFmpeg不会分割视频流,尽管指定了segment_time,导致视频文件大小非常大。不得不转而使用VLC命令行工具(cvlc)进行录制。以下脚本将不断录制相机视频流,并将视频以10分钟的片段本地存储:
while :
do
# Record using VLC works!
# Must use CVLC which does not have CLI,
# if we use VLC it will refuse to run from rc.local (cannot open console)
# This script must also be run as user pi as VLC will refuse to run as root
cvlc rtsp://127.0.0.1:8554/unicast --sout-file-format --sout file/ts:videos/video_%Y%m%d-%H%M%S.ts --run-time=600 --loop > /dev/null 2>&1 < /dev/null
done
请注意,cvlc不会以root身份运行,这是从rc.local启动进程时的默认用户。这可以通过使用sudo -u pi来启动上述脚本作为特定用户,例如pi,来克服。可能还想修改脚本以删除VLC不时生成的0字节文件,如果无法建立与RTSP服务器的连接,可能会发生这种情况,例如如果VLC在RTSP服务器启动之前被调用。在一个设备上,RTSP服务器偶尔会挂起,因此添加了一个cron作业,每6小时重新启动RTSP服务器作为解决方案。
在设置时,尽量使用好的SD卡,因为树莓派会不断地在它上面写入数据。在情况下,使用高性能的128GB Sandisk卡,并使用以下命令监控使用寿命写入:
dumpe2fs /dev/mmcblk0p2 | grep Lifetime