介绍
功能:树莓派通过csi接口连接摄像头IMX219进行循环录像,每录制10分钟(时长可调)保存一次视频,当可用内存空间不足25%(可调)时删除最早的视频并继续录制新视频。通过SMB协议,让电脑手机和电视盒子/智能电视在局域网内随时查看视频文件(可另行设置成开机自动运行代码开始录像),最终效果大概这样:
硬件:树莓派zero w v1.1+树莓派Camera Module2(IMX219)
系统:Raspberry Pi OS (Legacy) Lite 32-bit, Debian version: 11(bullseye)
录像代码
import glob
import os
from datetime import datetime
from picamera2 import Picamera2
from picamera2.encoders import H264Encoder, Quality
from picamera2.outputs import CircularOutput
#剩余空间,用百分比表示
SPACE_LIMIT = 25
#单次录制时长,单位秒
PER_LENGTH = 10*60
#视频保存位置
LOCATION = '/home/pi/video/'
def disk_per():
"""
计算当前/目录可用空间比率
:return: 返回整数百分比结果
"""
info = os.statvfs('/')
free_size = info.f_bsize * info.f_bavail
total_size = info.f_blocks * info.f_bsize
percent = round(free_size / total_size * 100)
return percent
def get_files_list(exp):
"""
获取指定位置下的指定后缀文件列表,根据文件创建时间正序排列(从早到晚顺序)
"""
files = list(filter(os.path.isfile, glob.glob(exp)))
# 按照文件创建时间倒序排列
files.sort(key=lambda x: os.path.getctime(x), reverse=False)
return files
def record():
"""
录像函数
"""
picam2 = Picamera2()
#设置摄像头分辨率,不同分辨率可能会使视野大小变化,详见官方文档
picam2.configure(picam2.create_video_configuration({"size":(1640, 1232)}))
#设置视频编码格式,选用主流格式h264,优点:画质高且占用空间少,缺点:只有少数播放器能播放
#默认60帧,可通过在括号里添加”iperiod=目标帧数“来设置视频帧数,可参考官方文档换成其他编码
encoder = H264Encoder()
#设置为循环录像
output = CircularOutput()
#开始录制,之后将一直捕获数据并存入缓存区,但未输出为视频文件
picam2.start_recording(encoder, output)
start_time = datetime.now()
filename = LOCATION + start_time.strftime('%Y-%m-%d_%H-%M-%S') + '.h264'
output.fileoutput = filename
#开始输出视频文件
output.start()
while True:
#检测磁盘空间是否充足
if disk_per() > SPACE_LIMIT:
if (datetime.now() - start_time).seconds >= PER_LENGTH:
#达到目标时长,停止输出
output.stop()
#开始输出新的视频文件
start_time = datetime.now()
filename = LOCATION + start_time.strftime('%Y-%m-%d_%H-%M-%S') + '.h264'
output.fileoutput = filename
output.start()
#磁盘空间不足,删除最早的视频文件
else:
files = get_files_list(LOCATION + '*.h264')
os.remove(files[0])
if __name__ == '__main__':
#开始录像
record()
SMB协议
我树莓派用的是samba,网上有大量很好的教程,这里就不重复劳动了。主要说一下我为什么要用SMB协议以及手机、电视盒子/智能电视如何访问树莓派。
第一个问题:因为兼容性,手机电脑和电视盒子/智能电视都能免费用,详见附录
第二个问题:手机、电视盒子/智能电视都通过文件管理器(或设置)访问树莓派,有些自带的文件管理器支持SMB,有些则不支持,如果自带的不支持则可另外下载支持SMB的文件管理器
注意:
1.legacy camera
若使用picamera2和libcamera则需关闭legacy camera support(默认关闭),否则会出现报错:
若使用opencv和raspistill、raspivid则需打开legacy camera support(可在raspi-config中打开,或将config.txt中的“camera_auto_detect=1”改为“start_x=1”)
2.内核电压
如果运行录像代码一直出现报错kernel:Code:bad PC value
可能是内核电压上限太低,在config.txt中添加“over_voltage=2"即可,详见附录
3.扩展内存
可在raspi-config中把内存扩展到整个SD卡,不然就只有可怜的几百Mb内存
录像代码借鉴了这篇文章:使用Python3实现树莓派+摄像头循环监控录像,这篇文章帮了不少忙
附录
picamera2官方文档
picamera2文档翻译
NFS、FTP、SMB、WebDav、DLNA协议区别
树莓派zero W 一直出现报错kernel:Code:bad PC value