提交 7e754e53 authored 作者: zw.wang's avatar zw.wang

feat: [record] 支持录制失败的视频断点续录

上级 6212b98f
...@@ -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_time): def recorder(self, file_name, start_time, end_time, part_files_set=None):
""" """
: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
......
...@@ -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, 15, 9, 4, 48) start_time = datetime(2021, 6, 18, 2, 34, 23)
end_time = datetime(2021, 6, 15, 10, 4, 48) end_time = datetime(2021, 6, 18, 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)))
......
...@@ -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, 11, 9, 27, 21).astimezone(tz) start_time = datetime(2021, 6, 18, 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, 11, 18, 30, 50).astimezone(tz) end_time = datetime(2021, 6, 18, 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论