Spaces:
Paused
Paused
| from scenedetect import SceneManager, open_video, ContentDetector, AdaptiveDetector, ThresholdDetector | |
| from moviepy.editor import * | |
| import copy,os,time,datetime | |
| def build_manager(): | |
| scene_manager = SceneManager() | |
| scene_manager.add_detector(ContentDetector()) | |
| scene_manager.add_detector(AdaptiveDetector()) | |
| scene_manager.add_detector(ThresholdDetector()) | |
| return scene_manager | |
| def seg_video(video_path, scene_list, output_dir): | |
| output_fp_list = [] | |
| with VideoFileClip(video_path) as video: | |
| for (start_time,end_time) in scene_list: | |
| if end_time-start_time > 0.5: | |
| start_time = start_time + 0.05 | |
| end_time = end_time - 0.05 | |
| video_clip = video.subclip(start_time, end_time) | |
| vid = video_path.split('/')[-1].rstrip('.mp4').split('___')[0] | |
| output_fp = os.path.join(output_dir, f'{vid}_{str(start_time)}_{str(end_time)}.mp4') | |
| video_clip.write_videofile(output_fp) | |
| output_fp_list.append(output_fp) | |
| video.close() | |
| return output_fp_list | |
| def shot_detect(video_path, output_dir): | |
| os.makedirs(output_dir, exist_ok=True) | |
| print(f'start process {video_path}') | |
| start_time = time.time() | |
| attribs = {} | |
| attribs['filepath'] = video_path | |
| try: | |
| video = open_video(video_path) | |
| scene_manager = build_manager() | |
| scene_manager.detect_scenes(video,show_progress=False) | |
| stamps = scene_manager.get_scene_list() | |
| scene_list = [] | |
| for stamp in stamps: | |
| start, end = stamp | |
| scene_list.append((start.get_seconds(), end.get_seconds())) | |
| attribs['shot_stamps'] = scene_list | |
| output_fp_list = seg_video(video_path, scene_list, output_dir) | |
| except Exception as e: | |
| print([e, video_path]) | |
| print(f"process {video_path} Done with {time.time()-start_time:.2f} seconds used.") | |
| return scene_list, output_fp_list | |