pyhon指定开始和结束时间,截取合并视频(代码有思路注释,可直接用

在已经得到监控视频的基础上,写入规定时间,将符合时间段的视频筛选出来并合并

(得到的监控视频是每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

代码有优化或者有问题的地方,可以留言一起解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值