用树莓派做行车记录仪或家用监控摄像头(循环录像)

介绍

功能:树莓派通过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(默认关闭),否则会出现报错:
picamera2
libcamera
若使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值