Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
I
ils-common-video
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
提交
议题看板
打开侧边栏
OpsTeam
ils-common-video
Commits
7e754e53
提交
7e754e53
authored
6月 19, 2021
作者:
zw.wang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: [record] 支持录制失败的视频断点续录
上级
6212b98f
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
50 行增加
和
28 行删除
+50
-28
recorder.py
isc_video_record/recorder.py
+37
-14
test_events.py
tests/test_events.py
+3
-3
test_playback.py
tests/test_playback.py
+10
-11
没有找到文件。
isc_video_record/recorder.py
浏览文件 @
7e754e53
...
@@ -166,16 +166,44 @@ class ProcessMessage:
...
@@ -166,16 +166,44 @@ class ProcessMessage:
return
ack
return
ack
def
recording
(
self
,
event
):
def
recording
(
self
,
event
):
part_files_set
=
set
()
if
event
[
'recovered_time'
]
and
event
[
'recovered_time'
]
!=
event
[
'start_time'
]:
part_file_name
=
os
.
path
.
join
(
video_path
,
'ISC_{}_{}_{}_{}.mp4'
.
format
(
self
.
body
[
'camera_code'
],
event
[
'start_time'
]
.
strftime
(
'
%
Y
%
m
%
dT
%
H
%
M
%
S'
),
event
[
'recovered_time'
]
.
strftime
(
'
%
Y
%
m
%
dT
%
H
%
M
%
S'
),
'00'
))
# 下载上次失败的视频文件
try
:
aliyun_oss
.
oss_download_file
(
event
[
'video_url'
],
part_file_name
)
if
os
.
path
.
isfile
(
part_file_name
):
part_files_set
.
add
(
part_file_name
)
raise
FileExistsError
(
part_file_name
)
except
Exception
as
e
:
log
.
exception
(
e
)
event
[
'recovered_time'
]
=
event
[
'start_time'
]
else
:
event
[
'recovered_time'
]
=
event
[
'start_time'
]
t1
=
time
.
time
()
t1
=
time
.
time
()
record_result
=
self
.
recorder
(
event
[
'start_time'
]
.
astimezone
(
tz
),
event
[
'end_time'
]
.
astimezone
(
tz
))
t2
=
time
.
time
()
full_file_name
=
os
.
path
.
join
(
video_path
,
'ISC_{}_{}_{}.mp4'
.
format
(
self
.
body
[
'camera_code'
],
event
[
'start_time'
]
.
strftime
(
'
%
Y
%
m
%
dT
%
H
%
M
%
S'
),
event
[
'end_time'
]
.
strftime
(
'
%
Y
%
m
%
dT
%
H
%
M
%
S'
)
))
record_result
=
self
.
recorder
(
full_file_name
,
event
[
'recovered_time'
]
.
astimezone
(
tz
),
event
[
'end_time'
]
.
astimezone
(
tz
),
part_files_set
)
t2
=
time
.
time
()
video_info
,
_
=
get_video_duration
(
record_result
[
'file_name'
])
video_info
,
_
=
get_video_duration
(
record_result
[
'file_name'
])
log
.
info
(
'thread_id:
%
s:
%
s: time consuming:
%
s, duration:
%
s, size:
%
sM'
,
log
.
info
(
'thread_id:
%
s:
%
s: time consuming:
%
s, duration:
%
s, size:
%
sM'
,
self
.
thread_id
,
event
[
'camera_code'
],
round
(
t2
-
t1
,
2
),
self
.
thread_id
,
event
[
'camera_code'
],
round
(
t2
-
t1
,
2
),
time_to_seconds
(
video_info
[
'duration'
]),
video_info
[
'size'
])
time_to_seconds
(
video_info
[
'duration'
]),
video_info
[
'size'
])
return
self
.
update_video_info
(
record_result
,
video_info
,
event
)
def
update_video_info
(
self
,
record_result
,
video_info
,
event
):
now
=
datetime
.
now
()
now
=
datetime
.
now
()
url
=
next_retry_time
=
None
url
=
next_retry_time
=
None
...
@@ -207,7 +235,7 @@ class ProcessMessage:
...
@@ -207,7 +235,7 @@ class ProcessMessage:
else
:
else
:
next_retry_time
=
now
+
timedelta
(
minutes
=
30
)
next_retry_time
=
now
+
timedelta
(
minutes
=
30
)
retry_count
+=
1
retry_count
+=
1
if
retry_count
>
5
:
if
retry_count
>
10
:
status
=
4
status
=
4
remark
=
remark
+
'+failed+end.'
remark
=
remark
+
'+failed+end.'
else
:
else
:
...
@@ -229,21 +257,16 @@ class ProcessMessage:
...
@@ -229,21 +257,16 @@ class ProcessMessage:
remark
=
remark
remark
=
remark
)
)
log
.
info
(
'thread_id:
%
s:video_info:
%
s, url:
%
s, video_id:
%
s.
%
s
, time:
%
s
'
,
log
.
info
(
'thread_id:
%
s:video_info:
%
s, url:
%
s, video_id:
%
s.
%
s'
,
self
.
thread_id
,
video_info
,
url
,
self
.
body
[
'db_table'
],
self
.
thread_id
,
video_info
,
url
,
self
.
body
[
'db_table'
],
event
[
'video_id'
]
,
round
(
time
.
time
()
-
t1
,
2
)
)
event
[
'video_id'
])
return
True
return
True
def
recorder
(
self
,
start_time
,
end_tim
e
):
def
recorder
(
self
,
file_name
,
start_time
,
end_time
,
part_files_set
=
Non
e
):
"""
"""
:param start_time: 开始时间,上海时区
:param start_time: 开始时间,上海时区
:param end_time: 结束时间,上海时区
:param end_time: 结束时间,上海时区
"""
"""
file_name
=
os
.
path
.
join
(
video_path
,
'ISC_{}_{}_{}.mp4'
.
format
(
self
.
body
[
'camera_code'
],
start_time
.
astimezone
(
pytz
.
utc
)
.
strftime
(
'
%
Y
%
m
%
dT
%
H
%
M
%
S'
),
end_time
.
astimezone
(
pytz
.
utc
)
.
strftime
(
'
%
Y
%
m
%
dT
%
H
%
M
%
S'
)
))
playback_urls
=
[]
playback_urls
=
[]
res
=
{
'file_name'
:
file_name
,
'is_completed'
:
False
,
'recovered_time'
:
start_time
}
res
=
{
'file_name'
:
file_name
,
'is_completed'
:
False
,
'recovered_time'
:
start_time
}
...
@@ -257,7 +280,7 @@ class ProcessMessage:
...
@@ -257,7 +280,7 @@ class ProcessMessage:
res
.
update
({
'except'
:
True
,
'offline'
:
True
,
'remark'
:
e
.
msg
})
res
.
update
({
'except'
:
True
,
'offline'
:
True
,
'remark'
:
e
.
msg
})
except
Exception
as
e
:
except
Exception
as
e
:
log
.
exception
(
e
)
log
.
exception
(
e
)
res
.
update
({
'except'
:
True
,
'remark'
:
e
.
__str__
})
res
.
update
({
'except'
:
True
,
'remark'
:
e
.
__str__
()
})
log
.
info
(
'thread_id:
%
s:
%
s: playback:
%
s'
,
self
.
thread_id
,
self
.
body
[
'camera_code'
],
playback_urls
)
log
.
info
(
'thread_id:
%
s:
%
s: playback:
%
s'
,
self
.
thread_id
,
self
.
body
[
'camera_code'
],
playback_urls
)
if
playback_urls
:
if
playback_urls
:
...
@@ -270,7 +293,7 @@ class ProcessMessage:
...
@@ -270,7 +293,7 @@ class ProcessMessage:
part_num
=
retry_count
=
0
part_num
=
retry_count
=
0
is_completed
=
False
is_completed
=
False
part_files_set
=
set
()
part_files_set
=
part_files_set
or
set
()
while
retry_count
<
6
:
while
retry_count
<
6
:
# 重试六次
# 重试六次
retry_count
+=
1
retry_count
+=
1
...
...
tests/test_events.py
浏览文件 @
7e754e53
...
@@ -13,10 +13,10 @@ config = settings.get('ISC')
...
@@ -13,10 +13,10 @@ config = settings.get('ISC')
client
=
HikVisionClient
(
config
.
get
(
'KEY'
),
config
.
get
(
'SECRET'
),
client
=
HikVisionClient
(
config
.
get
(
'KEY'
),
config
.
get
(
'SECRET'
),
config
.
get
(
'HOST'
),
config
.
get
(
'PORT'
))
config
.
get
(
'HOST'
),
config
.
get
(
'PORT'
))
camera_index
=
'
edef21b07d7249ad8132bad6d8d1223b
'
camera_index
=
'
af53e198cd544b9eb9fad84e30908f9d
'
start_time
=
datetime
(
2021
,
6
,
1
5
,
9
,
4
,
48
)
start_time
=
datetime
(
2021
,
6
,
1
8
,
2
,
34
,
23
)
end_time
=
datetime
(
2021
,
6
,
1
5
,
10
,
4
,
48
)
end_time
=
datetime
(
2021
,
6
,
1
8
,
3
,
25
,
44
)
# res = client.get_cameras_playback_urls(camera_index,
# res = client.get_cameras_playback_urls(camera_index,
# client.iso_format(start_time.astimezone(tz)),
# client.iso_format(start_time.astimezone(tz)),
# client.iso_format(end_time.astimezone(tz)))
# client.iso_format(end_time.astimezone(tz)))
...
...
tests/test_playback.py
浏览文件 @
7e754e53
...
@@ -23,10 +23,10 @@ client = HikVisionClient(config.get('KEY'), config.get('SECRET'),
...
@@ -23,10 +23,10 @@ client = HikVisionClient(config.get('KEY'), config.get('SECRET'),
def
main
():
def
main
():
start_time
=
datetime
(
2021
,
6
,
1
1
,
9
,
27
,
21
)
.
astimezone
(
tz
)
start_time
=
datetime
(
2021
,
6
,
1
8
,
8
,
27
,
21
)
.
astimezone
(
tz
)
# start_time = datetime(2021, 5, 28, 9, 10, 59).astimezone(tz)
# start_time = datetime(2021, 5, 28, 9, 10, 59).astimezone(tz)
end_time
=
datetime
(
2021
,
6
,
1
1
,
1
8
,
30
,
50
)
.
astimezone
(
tz
)
end_time
=
datetime
(
2021
,
6
,
1
8
,
8
,
30
,
50
)
.
astimezone
(
tz
)
camera_index
=
'
bb954401e1e9420d91e4b3691566f161
'
camera_index
=
'
f134d02a55f2402c8175cd10b6c57f97
'
results
=
[]
results
=
[]
try
:
try
:
...
@@ -52,14 +52,13 @@ def main():
...
@@ -52,14 +52,13 @@ def main():
else
:
else
:
print
(
res
)
print
(
res
)
print
(
results
)
for
event
in
res
:
# for event in res:
cur_start_time
=
max
(
event
[
'start_time'
],
start_time
)
# cur_start_time = max(event['start_time'], start_time)
cur_end_time
=
min
(
event
[
'end_time'
],
end_time
)
# cur_end_time = min(event['end_time'], end_time)
print
(
cur_start_time
,
cur_end_time
)
# print(cur_start_time, cur_end_time)
# print(event)
# # print(event)
file_info
,
error_log
=
stream_record
(
event
[
'stream_url'
],
cur_start_time
,
cur_end_time
)
# file_info, error_log = stream_record(event['stream_url'], cur_start_time, cur_end_time)
print
(
file_info
)
# print(file_info)
def
stream_record
(
stream
,
start_time
,
end_time
):
def
stream_record
(
stream
,
start_time
,
end_time
):
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论