Camera玩物记录
简介
我喜得子,刚需保姆,需要摄像头寻求心理的安全感,开始折腾Camera之旅。
产品需求
- 家里不是新房,不可能重新布线;
- Camera分辨率不能太低;
- Camera产品稳定;
- 可以配合路由器+硬盘(我已有)进行record数据;
- Camera安全;
产品背景
- 目前安防级别Camera都是海康大华宇视三巨头,为了可靠性都是网线传输数据而非WIFI;
- 互联网Camera如小米和萤石(海康民用级产品)均支持WIFI传输,但需要record则强制用户使用云存储或购买硬件本地存储;
决策
需求1和背景1排除了安防三巨头。 需求4和背景2排除国内互联网产品,因我了解互联网产品经理的尿性,强制用户做艰难得决定都是为公司利益。 需求5和背景2更是排除国内互联网产品,因没有任何隐私而言。 期间发现中兴某款久产品720p支持ftp传输但新款1080p不支持,跟互联网产品一个尿性,且贸易战不知道固件后续更新维护的情况,也排除了。
鉴于国外对安全比较重视,开始留意了亚马逊,发现了:Amcrest ProHD 1080P WiFi Camera,支持ftp,且有时间证明其稳定性,故购买了3个试水。
产品缺陷
- 产品通过ftp传输的时候只会把H264压缩后的视频传输到目的地址,不会进行覆盖过时的视频数据;
- WIFI传输不可靠,偶尔会出现短时间的丢数据,丢数据的后缀文件名由.mp4变成.mp4_,重命名为.mp4可以查看未丢的数据视频片段,但丢数据的段确实丢了。
缺陷1可以通过路由器覆盖硬盘上的久数据,缺陷2只要重命名也能符合我要求。
Code
路由器已经开启了ssh,调试过程每次登陆ssh输入密码太麻烦了,我没有使用其他类似putty和SecureCRT的工具,而使用Windows下的Linux子系统(类似普通的Linux命令行),故每次ssh都要交互输密码。用expect(Ubuntu默认没安装, apt-get install expect即可)这个小玩意就能实现一条命令行免交互ssh。
1
2
3
4
5
6
#!/usr/bin/expect
set timeout 30
spawn ssh [email protected]
expect "password:"
send "密码,最后记得加\r"
interact
现在可以愉快的调试了。
每日存储的视频数据父目录格式是YYYY-MM-DD
经过H.264压缩后,视频一天的近似43G,3路Camera就是129G,我的2T(显示1.8T)留出一点裕量,只能给出1.5T给record,每路最多500G,超过500G就要删除旧视频。 脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
echo $(date) >> /tmp/share/sda1/cam/cam.log
# 3路Camera
for i in 1 2 3;
do
size=$(du -s /tmp/share/sda1/cam/CAM$i | awk '{print $1}')
# 是否超过500G
if [ $size -gt 524288000 ]; then
# 最老的两天视频数据,大小近似43 * 2 * 3G = 258G
for j in $(ls -d /tmp/share/sda1/cam/CAM$i/*-*-*/ | head -2);
do
rm -rf $j;
echo delete $j >> /tmp/share/sda1/cam/cam.log;
done
fi
done
运行crontab -e,每天凌晨2点运行此脚本,至此解决了缺陷1。
解决缺陷2思路是只要写一个脚本每天凌晨执行即可,重命名昨天(传输中的视频后缀也是.mp4_,故要排除今天)所有.mp4_后缀的文件为后缀.mp4文件。
有个坑是date函数在我路由器运行求昨天的日期的命令会报错(Ubuntu下正常)
date -d ‘-1 day’ +%Y-%m-%d date: invalid date ‘-1 day’
查阅了资料发现路由器的date函数是busybox提供的(阉割版),不支持day的运算但支持second,故用以下命令取代:
date -D “%s” -d $(( $(/bin/date +%s ) - 86400 )) +%Y-%m-%d
脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh
# 3路Camera
for i in 1 2 3;
do
# 昨天日期
yesterday=$(date -D "%s" -d $(( $(/bin/date +%s ) - 86400 )) +%Y-%m-%d)
for old in $(find /tmp/share/sda1/cam/CAM$i/$yesterday -name "*.mp4_");
do
# sed配合正则重命名
new=$(echo $old | sed 's/\(.*\.mp4\)_$/\1/');
mv $old $new;
done
done
运行crontab -e,每天凌晨3点运行此脚本(凌晨2点已经大量占用硬盘IO,避免IO繁忙),至此解决了缺陷2。
折腾完毕= =!