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 | |