由于最近我们那边初中辍学的二五仔越来越多,导致盗窃事件频发。由于家里没监控,家里老人防范意识也不强,所有我家也遭殃了。
最近国补力度还不错,于是就装了一个小米的监控,首先先使用自带的功能,使用smb同步监控视频文件到我家的的Linux服务器。不过小米监控进行了分片,分成了每个大小为128MB的视频,我本来是通过alist上传到百度云盘、阿里云盘、UC云盘、移动云盘的,毕竟这几个加起来存储空间也有10T左右了,一天大概产生18G的视频,算下来可以存一年半的视频了。
然而在alist添加存储的时候发现有个豆包,于是去alist的仓库看了一下,发现豆包出了一个ai云盘,存储空间目前是无限!而且不限制上传文件的大小,所以我就又写了一个python程序,每天凌晨3点将昨天的视频使用ffmpeg合成为一个视频,然后再通过alist上传到豆包里面。最后在中午12点将合成的视频再删除掉,减少空间。因为我的磁盘不大,只有200多G的空间。
同时之前上传到百度的程序依然运行,毕竟豆包这玩意无限空间听着就不靠谱,由于不用合成,所以定到了凌晨一点执行。18G大概不到一个小时就可以上传完毕了。
代码如下,仅供参考
import requests
import json
import re
from datetime import datetime, timedelta
import subprocess
yesterday = datetime.today().date() - timedelta(days=1)
server = "https://alist.xx.cn" # alist地址
local_files_path = "/smb/xiaomi_camera_videos/XXXXXXXXXXXX"
cloud_files_path = "/doubao/xiaomi_camera_videos/" + str(yesterday.strftime("%Y/%m"))
payload = json.dumps({
"username": "username",
"password": "password"
})
token = json.loads(requests.request("POST", server + "/api/auth/login", headers={'Content-Type': 'application/json'},
data=payload).text)["data"]["token"]
headers = {
'Authorization': token,
'Content-Type': 'application/json'
}
payload = json.dumps({
"path": cloud_files_path
})
if json.loads(requests.request("POST", server + "/api/fs/mkdir", headers=headers, data=payload).text)["code"] == 200:
print("创建文件夹成功")
else:
print("创建文件夹失败")
quit(1)
payload = json.dumps({
"path": local_files_path,
"password": "",
"page": 1,
"per_page": 0,
"refresh": True
})
local_files = json.loads(requests.request("POST", server + "/api/fs/list", headers=headers, data=payload).text)
local_files_list = []
for item in local_files["data"]["content"]:
if item["size"] != 134217728:
break
match = re.match(r"^00_(\d{14})_", item["name"])
if match:
timestamp_str = match.group(1)
dt = datetime.strptime(timestamp_str, "%Y%m%d%H%M%S")
if dt.date() == datetime.today().date() - timedelta(days=1):
local_files_list.append(item["name"])
else:
print("文件名格式不匹配")
# 生成FFmpeg所需的文件列表文本
with open('video_list.txt', 'w') as f:
for video in local_files_list:
f.write(f"file /mnt/usb/xiaomi_camera_videos/XXXXXXXXXXXX/'{video}'\n")
# 拼接命令参数
output_file = "/mnt/usb/jk/" + str(yesterday.strftime("%d")) + '.mp4'
ffmpeg_cmd = [
'ffmpeg',
'-f', 'concat',
'-safe', '0',
'-i', 'video_list.txt',
'-c', 'copy',
output_file
]
try:
# 执行FFmpeg命令
subprocess.run(
ffmpeg_cmd,
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
print(f"视频拼接完成,输出文件:{output_file}")
except subprocess.CalledProcessError as e:
print(f"拼接失败,错误信息:\n{e.stderr}")
filename = str(yesterday.strftime("%d")) + '.mp4'
payload = json.dumps({
"src_dir": "/smb/jk",
"dst_dir": cloud_files_path,
"names": [filename]
})
result = requests.request("POST", server + "/api/fs/copy", headers=headers, data=payload)
if json.loads(result.text)["code"] == 200:
print("success")
else:
print("error")