Coding的痕迹

一位互联网奔跑者的网上日记

0%

(Python) 一段简单的代码调用 openRTSP 实现 RTSP 流录像工具

不知道标题描述得是否准确。社团里布置好了两个海康威视的监控摄像头,但是没有录像相关的设备,想到了之前二百元在闲鱼上淘到的小主机,于是申请买了一块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:
# 原先使用获取磁盘剩余空间的办法来做
# 但是发现磁盘剩余空间的数据更新不太及时
# stat = os.statvfs('/home')
# if stat is None:
# print('Error occurs while calling os.statvfs()')
# time.sleep(10)
# continue
#
# 如果剩余字节数小于大约20G的磁盘容量
# if stat.f_bavail*stat.f_bsize < 20*1024*1024*1024:

'''
统计所有录像文件的大小
'''
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,做好访问权限设置和目录浏览,然后在浏览器里看 😄
有空就做一个简单的页面来查看监控录像,并整合实时监控功能。