安防录像意外中断时,保障数据完整的视频格式及实现方案咨询
安防摄像头中断录制数据留存解决方案
一、首选文件格式与编码格式
- 容器格式:MKV(优先)
MKV是流式容器,原生支持边写边读,中断后大部分已写入数据可恢复。你之前的失败大概率是因为libcamera的内存缓冲未及时刷盘,而非格式本身问题。若仍有问题,可降级到AVI格式,兼容性更好但功能较少。 - 编码格式:MJPEG(极致鲁棒)/ H.264(平衡体积)
- MJPEG:每个帧都是独立的JPEG图像,中断后仅最后1帧可能损坏,其余全部可用。缺点是文件体积是H.264的5-10倍,适合对数据完整性要求极高的场景。
- H.264:保持你当前的
--intra 5配置(每5帧生成1个关键帧),中断后可从最近的关键帧恢复后续数据,损失极小,且体积可控。
二、libcamera与Systemd配置调整
1. 启用分段录制
将录制拆分为固定时长的分段文件,避免单个文件损坏导致全部数据丢失。修改命令如下:
libcamera-vid --timeout 0000 --width 1920 --height 1080 --framerate 10 --codec h264 --profile high --intra 5 --listen --segment 300 -o "$(date +%Y%m%d_%H%M)_%04d.out.mkv"
--segment 300表示每300秒(5分钟)生成一个新文件,文件名会自动补全序号。
2. 强制实时刷盘
禁用libcamera的输出缓冲,确保数据实时写入磁盘,避免断电时内存缓冲丢失:
stdbuf -o0 libcamera-vid --timeout 0000 --width 1920 --height 1080 --framerate 10 --codec h264 --profile high --intra 5 --listen -o "$(date +%Y%m%d_%H%M).out.mkv"
stdbuf -o0会强制标准输出无缓冲。
3. Systemd服务优化
在你的systemd服务文件(如/etc/systemd/system/camera-recording.service)中添加以下配置:
[Service] ExecStart=/path/to/your/script.sh ExecStop=/usr/bin/pkill -SIGINT libcamera-vid Restart=on-failure User=root
ExecStop:发送SIGINT信号让libcamera-vid正常收尾,而非强制杀死,确保文件写入完整。Restart=on-failure:进程意外退出后自动重启录制。
三、意外断电数据保障
备用电池联动处理
在你的自研自动启动代码中加入断电检测逻辑:当检测到主电源断开时,立即向libcamera-vid进程发送SIGINT信号,等待3-5秒让进程完成文件写入,再触发系统优雅关机。文件系统优化
使用ext4文件系统并启用日志模式,减少断电后的文件损坏:
修改/etc/fstab中的根分区挂载项:/dev/mmcblk0p2 / ext4 defaults,noatime,data=journal 0 1data=journal会记录所有写入操作,断电后可快速恢复文件系统。禁用或限制Swap
关闭Swap分区(若无需大内存支持),或设置swappiness=0减少Swap使用,避免断电时Swap中的缓存数据丢失导致文件损坏。
四、其他注意事项
- 定期模拟中断测试:通过
pkill -SIGKILL libcamera-vid或断开电源,验证生成的视频文件是否可正常播放,确保配置生效。 - 选用可靠存储介质:优先工业级SD卡或SSD,避免普通SD卡长期写入后的损坏风险。
- 配置远程管理:开启SSH服务,远程执行
systemctl stop camera-recording.service即可正常终止录制,无需HDMI和键盘。
内容的提问来源于stack exchange,提问作者ndtech
相关产品推荐
相关产品推荐

