infinitetalk / wan /utils /segvideo.py
rahul7star's picture
Migrated from GitHub
fc6bdf0 verified
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