不知道标题描述得是否准确。社团里布置好了两个海康威视的监控摄像头,但是没有录像相关的设备,想到了之前二百元在闲鱼上淘到的小主机,于是申请买了一块500G的硬盘。
这个闲鱼上买的小主机,买来的时候是打算做软路由的。性能较差,买来的时候预装的是 Windows XP,我用了不到十分钟,就点了关机,换成了 Debian。原先想用海康威视的 SDK 来写这个工具,毕竟能锻炼下自己C++能力,考虑到录像这玩意催的比较紧,就改用Python写了。
不多说,直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import os import subprocess from datetime import datetime
device_addr_list = { 'Room1': 'rtsp://user:password@10.1.160.248/h265/ch1/main/av_stream', 'Room2': 'rtsp://user:password@10.1.160.249/h265/ch1/main/av_stream' }
def get_current_time_string(format_string: str): time_now = datetime.now() return time_now.strftime(format_string)
def record(device_name: str): while True: file_name = get_current_time_string(device_name + '/' + '%Y%m%d-%H%M%S.mp4') command_string = 'openRTSP -4 -b 10000000 -t -d 3600 -t -f 17 {} > "{}"'.format(device_addr_list[device_name], file_name)
subprocess.call([command_string], shell=True)
record('Room1')
|
最开始用的是 ffmpeg,但是会转码,CPU直接升到100%,无奈换成了openRTSP。我也就没研究他们的参数了。
还需要一个定时删除录像文件的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import os import time
record_path = \ { 'Room1': '/home/camera/Room1/', 'Room2': '/home/camera/Room2/' }
while True: ''' 统计所有录像文件的大小 ''' files_Room1 = sorted([record_path['Room1'] + filename for filename in os.listdir(record_path['Room1'])]) files_Room2 = sorted([record_path['Room2'] + filename for filename in os.listdir(record_path['Room2'])]) print('共计{} + {} = {}个录像文件, '.format( len(files_Room1), len(files_Room2), len(files_Room1)+len(files_Room2)), end='') total_size_Room1 = sum([(os.path.getsize(file)/(1024**3)) for file in files_Room1]) total_size_Room2 = sum([(os.path.getsize(file)/(1024**3)) for file in files_Room2]) print('总大小 {} GB'.format(total_size_Room1 + total_size_Room2))
i = 0 if total_size_Room1 + total_size_Room2 > 400: os.remove(files_Room1[i]) os.remove(files_Room2[i]) time.sleep(1800)
|
那么,怎么查看录像回放呢?
现在的解决方案是搭建个 Apache,做好访问权限设置和目录浏览,然后在浏览器里看 😄
有空就做一个简单的页面来查看监控录像,并整合实时监控功能。