在已经得到监控视频的基础上,写入规定时间,将符合时间段的视频筛选出来并合并
(得到的监控视频是每30分钟录成一个视频,视频名称就是监控记录时的时间戳)
def get_video_in_time(self,msg):
# 接受指定的时间
start_time_data = msg['start_time']
end_time_data = msg['end_time']
# 转为时间戳
start_time = int(time.mktime(time.strptime(str(start_time_data), "%Y-%m-%d %H:%M:%S"))*1000)
end_time = int(time.mktime(time.strptime(str(end_time_data), "%Y-%m-%d %H:%M:%S"))*1000)
# 防一手用户输错时间
if end_time <= start_time:
msg['cmd'] = 'TimeInputWrong'
msg['content'] = '结束时间请大于开始时间'
self.socket_ipc_client.send(msg)
# 获取摄像头ip
channel = msg['channel']
# 得到监控视频的保存地址
video_path = "{}/{}".format(self.__videoBasePath,channel)
# 取出文件夹名称(每个视频的名字
video_list = sorted(os.listdir(video_path))
# 创建一个合成后视频的路径
new_save_path = "{}/{}".format(self.__splitVideoBasePath, "new_video")
if not os.path.exists(new_save_path):
os.makedirs(new_save_path, 0o777)
# 定义一个空列表,后续好装要合成的视频
new_video_lists = []
# 时间戳化成秒
clip_end_time = int(end_time)/1000
clip_start_time = int(start_time)/1000
# 定义合成后视频的名字
file_path = new_save_path + '/' + '{}.mp4'.format(start_time_data)
# 把取出的视频名称遍历出来(视频名称是用监控视频时间的时间戳命名的
for video_file in video_list:
# 分开时间戳和后缀,名称换成int类型
file_name, file_type = video_file.split(".")
if file_type != 'mkv':
continue
time_stamp = int(file_name)
# 化成秒,来支持后续截取时间的操作
clip_time_stamp = int(time_stamp)/1000
# 这个时间设定的是合并视频的结束时间
need_time = min(int(clip_end_time - clip_time_stamp),1800)
# 对于文件夹的第一个视频的判断
if time_stamp >= start_time and time_stamp <= end_time and video_list.index(video_file) == 0:
# 这个保存就很直接,从开始到结束
cap_end = VideoFileClip(video_path + '/' + str(video_file)).subclip(0,need_time)
new_video_lists.append(cap_end)
‘’‘这个判断对于文件中间的视频的截取,主要注意的是截取时间可能会包含上一个视频的内容但是,上个视频已经被遍历(视频名称是根据开始记录时间命名的),所以这里要把上个视频的内容先取出来,再取后面的内容,当然:先判断时间是否包含上一个视频‘’‘
elif time_stamp >= start_time and time_stamp <= end_time and video_list.index(video_file) >= 1:
# video_path_file = os.path.join(video_path,video_file)
# new_save_path_file = os.path.join(new_save_path,video_file)
# shutil.move(video_path_file,new_save_path_file)
#
# video_new_lists = sorted(os.listdir(new_save_path))
# 用这个来判断是否需要截取上一个视频的内容(感觉这段写的有点不好,但是能跑
if int(clip_time_stamp - clip_start_time) < 1800:
try:
cap_start = VideoFileClip(video_path + '/' + str(video_list[video_list.index(video_file)-1])).subclip(1800 - int(clip_time_stamp-clip_start_time),1800)
new_video_lists.append(cap_start)
cap_end = VideoFileClip(video_path + '/' + str(video_file)).subclip(0,need_time)
new_video_lists.append(cap_end)
except Exception as e:
traceback.print_exc()
else:
try:
cap_end = VideoFileClip(video_path + '/' + str(video_file)).subclip(0, need_time)
new_video_lists.append(cap_end)
except Exception as e:
traceback.print_exc()
# 这个判断针对截取的视频只在某个视频里面的情况(因为肯定只有一个视频,所以不添加列表
elif time_stamp < start_time and time_stamp + 1800*1000 > end_time:
# tset1 = int(clip_end_time - clip_start_time)
# test2 = int(clip_time_stamp + 1800 - clip_end_time)
cap = VideoFileClip(video_path + '/' + str(video_file)).subclip(int(clip_start_time - clip_time_stamp),1800 - int(clip_time_stamp + 1800 - clip_end_time))
cap.write_videofile(file_path)
# new_video_lists.append(cap)
# 最好当我们的结束时间比名称的时间还小时,结束
elif time_stamp > end_time:
break
# 这一段,合并列表中的视频,写入
if len(new_video_lists):
final_clip = concatenate_videoclips(new_video_lists)
final_clip.write_videofile(file_path)
# 这是交互的过程
video_result_url = self.__split_video_base_url + '/' + 'new_video/{}.mp4'.format(start_time_data)
msg['cmd'] = "getVideoAppointTime"
msg['result_path'] = file_path
msg['result_url'] = video_result_url
self.socket_ipc_client.send(msg)
return None
代码有优化或者有问题的地方,可以留言一起解决