一、功能描述
实现一个开机就启动录制的功能,录制时间和视频分辨率由配置文件决定。录制完的视频转换成常见的MP4格式,方便其他终端设备查看。
二、程序流程图
程序流程图如下

三、代码解析
(1)、安装软件
本项目需要使用rpicam-apps和ffmpeg软件,rpicam-apps软件用来驱动摄像头和获取摄像头的数据流;ffmpeg软件用来将摄像头的数据流由H.264转换成MP4格式。
软件安装指令
sudo apt update && sudo apt upgrade -y
sudo apt install -y rpicam-apps ffmpeg
采用的强制安装rpicam-apps和ffmpeg软件,如果已安装其中一个软件,怕安装时间过长,可以选择安装剩余的,没有对软件版本做任何要求。
(2)、创建视频录制服务
创建.service文件,名称设置为camera-record,对应指令如下
sudo nano /etc/systemd/system/camera-record.service
.service文件内容如下
[Unit] Description=Raspberry Pi Camera Auto Record Service After=multi-user.target # 系统加载完成后启动 Wants=local-fs.target # 确保本地存储可用 [Service] Type=simple User=pi # 你的实际用户(非默认pi) WorkingDirectory=/home/pi ExecStart=/home/pi/camera_record.sh # 默认录制10分钟(自定义时长改:camera_record.sh 15) Restart=no # 录制完成后不重启(循环录制改always) StandardOutput=journal+console # 日志输出到系统日志 [Install] WantedBy=multi-user.target
其中pi为用户名,需要根据自己设置树莓派系统的用户名进行配置,#后面的为注释,在实际编写中要去掉,我就是直接复制过去就发现服务会启动失败。复制后可以Ctrl+O→回车→Ctrl+X保存并退出。
与该服务相关的指令如下
sudo systemctl enable camera-record.service # 启用开机自启
sudo systemctl start camera-record.service # 立即启动服务(无需重启测试)
sudo systemctl status camera-record.service # 查看服务状态(确认无报错)
sudo systemctl stop camera-record.service # 停止当前录制服务
sudo systemctl disable camera-record.service # 禁用开机自启
这些指令可以协助开发者进行开发。
(3)、设置服务为开机自启动
sudo systemctl daemon-reload #让系统识别新创建的服务文件
sudo systemctl enable camera-record.service # 启用开机自启
(4)、脚本文件
在/home/pi文件夹下创建.sh脚本,名称为camera_record,对应指令如下
nano /home/pi/camera_record.sh
文件内容如下
#!/bin/bash
# 树莓派Zero 2W摄像头自动录制脚本(rpicam版)
# 修复:禁用预览窗口 + 修正命令格式 + ffmpeg封装MP4
# 1. 配置基础参数
DEFAULT_DURATION=10 # 默认录制时长(分钟)
DURATION_MINUTES=${1:-$DEFAULT_DURATION}
DURATION_MS=$((DURATION_MINUTES * 60 * 1000))
# 2. 生成带时间戳的文件名(适配pi用户目录)
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
VIDEO_H264="/home/pi/camera_temp_${TIMESTAMP}.h264"
VIDEO_MP4="/home/pi/camera_recording_${TIMESTAMP}.mp4"
# 3. 打印录制信息
echo "====================================="
echo "开始摄像头录制 | 时长:${DURATION_MINUTES} 分钟"
echo "最终文件:${VIDEO_MP4}"
echo "====================================="
# 4. 核心:rpicam录制(关键修复:禁用预览窗口 + 低性能适配)
rpicam-vid \
--width 640 --height 480 \
--framerate 15 \
-t ${DURATION_MS} \
-o ${VIDEO_H264} \
-n
--focus 0.5
# 5. 转换为MP4(用ffmpeg替代MP4Box,无重新编码,速度快)
if [ -f "${VIDEO_H264}" ]; then
echo "录制完成,正在封装为MP4..."
# ffmpeg封装h264到MP4(-c:v copy 表示直接复制视频流,不重新编码)
ffmpeg -r 15 -i ${VIDEO_H264} -c:v copy -f mp4 ${VIDEO_MP4} -y
# 清理临时文件 + 验证结果
if [ -f "${VIDEO_MP4}" ]; then
rm -f ${VIDEO_H264}
echo "✅ 录制完成!文件路径:${VIDEO_MP4}"
else
echo "❌ MP4封装失败!"
exit 1
fi
else
echo "❌ 录制失败,未生成h264文件!"
exit 1
fi
exit 0(5)、修改脚本文件权限
生成脚本文件后一定要修改文件权限,否则运行会失败,对应的指令如下
chmod +x /home/pi/camera_record.sh
四、测试和验证
(1)、脚本测试
在完成以上配置后可以使用脚本测试录制和转码功能,使用方式如下
/home/pi/camera_record.sh 录制时长(单位:分钟)
如录制时长为1分钟的指令为
/home/pi/camera_record.sh 1
日志会打印出正在录制提示,录制完成也会有相对于的提示,完整的提示如下

录制完成后会在脚本文件夹下生成MP4文件

名称为camera_recording_开始录制时间。
(2)、服务测试
可以启动开机录制服务,对应指令为
sudo systemctl start camera-record.service
在录制过程中可以通过如下指令查看服务进度
sudo systemctl status camera-record.service
当正在录制中,进度提示信息为

主要看Active选项是否为active,如果是说明服务成功启动。按Ctrl+C键可以退出进度查看。当录制完成后查看进度就会变成如下
这时Active选项就变为inactive,说明服务结束。在脚本文件夹下可以看到录制好的MP4文件。
(3)、开机测试
重启或断电开启板卡,开启后就会自动录制视频,录制完成后会在对应的文件夹下生成MP4文件。
五、应用场景和开发心得
树莓派Zero 2W板卡非常小巧,接口丰富,价格也不贵,加上一个摄像头可以做一个简易的监控器、目标识别等设备。可以将本项目运用到行车记录仪或家庭监控设备,项目占用的资源也并不多,可以在此基础上进行扩展。但目前还存在如下问题:不能通过按钮触发录制开始、暂停和结束;自动录制时长设置比较麻烦;录制完成后文件导入电脑比较麻烦;没有磁盘剩余空间检测和文件覆盖;自动对焦功能。但是若固定录制时长和中间不暂停就可以不用修改。本次实验用的摄像头感光芯片是OV5647,是不能自动对焦的,可以选用感光芯片为imx219/imx477/imx708支持自动对焦的,这样画面不会晃动。
借助树莓派Zero 2W的强大的处理芯片BCM2710A1、完善的开发资料和软件以及丰富的问题答疑,使得树莓派的开发并不是那么的困难。也是算在Linux开发领域中比较容易上手的板卡。我也是第一次使用Linux板卡进行开发,在开发过程中遇到很多的问题,这些问题在网上也是能找到解决办法的,所以才能顺利完成项目开发。树莓派Zero 2W不像树莓派5那样非常强大,甚至连网页都打开不了,内存也是只有512MB。但是学习Linux开发和进行简单功能开发,树莓派Zero 2W也是性价比比较高的。
我要赚赏金
