From 61f6ec3896e2da40ba8ad5522bc825e01e573f04 Mon Sep 17 00:00:00 2001 From: "florentin.luce" Date: Tue, 28 May 2024 14:49:28 +0200 Subject: [PATCH] improve usage --- auto_splitter.py | 10 +++--- operators/sequencer.py | 69 +++++++++++++++++++++++++++++++----------- 2 files changed, 57 insertions(+), 22 deletions(-) diff --git a/auto_splitter.py b/auto_splitter.py index c19badd..e6b76e7 100644 --- a/auto_splitter.py +++ b/auto_splitter.py @@ -26,12 +26,14 @@ def launch_split(movie_strip, threshold, frame_start=None, frame_end=None): fps = bpy.context.scene.render.fps if frame_start is None: - frame_start = movie_strip.frame_final_start + frame_start = 0 if frame_end is None: - frame_end = movie_strip.frame_final_end + frame_end = movie_strip.frame_duration - frame_start -= movie_strip.frame_final_start - frame_end -= movie_strip.frame_final_start + frame_start = frame_start - movie_strip.frame_start + + #frame_start += movie_strip.frame_offset_start + #frame_end -= movie_strip.frame_offset_end # Launch ffmpeg command to split ffmpeg_cmd = get_command(str(path), threshold, frame_start, frame_end, fps) diff --git a/operators/sequencer.py b/operators/sequencer.py index 745931b..5c85669 100644 --- a/operators/sequencer.py +++ b/operators/sequencer.py @@ -2,14 +2,15 @@ from os.path import expandvars, abspath from pathlib import Path import bpy from bpy.types import Operator -from bpy.props import (BoolProperty, StringProperty, FloatProperty) +from bpy.props import (BoolProperty, StringProperty, FloatProperty, + IntProperty, EnumProperty) from vse_toolbox.sequencer_utils import (get_strips, rename_strips, set_channels, - get_channel_index, new_text_strip, get_strip_at, get_channel_name) - + get_channel_index, new_text_strip, get_strip_at, get_channel_name, + create_shot_strip) + from vse_toolbox import auto_splitter from vse_toolbox.bl_utils import get_scene_settings, get_strip_settings -from vse_toolbox.sequencer_utils import create_shot_strip from shutil import copy2 @@ -183,9 +184,21 @@ class VSETB_OT_auto_split(Operator): bl_options = {"REGISTER", "UNDO"} threshold: FloatProperty(name="Threshold", default=0.6, min=0, max=1) - selected_only: BoolProperty(name="Selected Only", default=True) + frame_first: IntProperty(name='Start Split') + frame_last: IntProperty(name='End Split') + movie_channel_name: EnumProperty( + items=lambda self, ctx: ((c.name, c.name, '') for c in ctx.scene.sequence_editor.channels), + name='Movie Channel') def invoke(self, context, event): + + self.frame_first = context.scene.frame_start + self.frame_last = context.scene.frame_end + + if context.selected_sequences: + self.frame_first = min([s.frame_final_start for s in context.selected_sequences]) + self.frame_last = max([s.frame_final_end for s in context.selected_sequences]) + return context.window_manager.invoke_props_dialog(self) def draw(self, context): @@ -196,6 +209,12 @@ class VSETB_OT_auto_split(Operator): col.use_property_decorate = False col.prop(self, 'threshold') + col.prop(self, 'movie_channel_name') + + split_col = col.column(align=True) + split_col.prop(self, 'frame_first', text='Frame Split First') + split_col.prop(self, 'frame_last', text='Last') + col.prop(self, 'selected_only') def execute(self, context): @@ -203,29 +222,42 @@ class VSETB_OT_auto_split(Operator): return {'PASS_THROUGH'} def modal(self, context, event): - strips = get_strips('Movie') - if self.selected_only: - strips = context.selected_sequences + + strips = get_strips(channel=self.movie_channel_name) for strip in strips: if strip.type != 'MOVIE': continue - process = auto_splitter.launch_split(strip, self.threshold) + # Skip strip outside the frame range to create shot from. + if strip.frame_final_start >= self.frame_last or strip.frame_final_end <= self.frame_first: + continue + + process = auto_splitter.launch_split(strip, self.threshold, frame_start=self.frame_first, frame_end=self.frame_last) i = 1 - frame_start = 0 + frame_start = self.frame_first for line in process.stdout: + + # Get frame split from the movie timeline (not from blender strips timeline) frame_end = auto_splitter.get_split_time(line, fps=24) if not frame_end: continue + # Convert movie frame to strips frame + if frame_start+int(strip.frame_start) < self.frame_first: + frame_start = self.frame_first + + frame_end += int(strip.frame_final_start) + if frame_end > self.frame_last: + frame_end = self.frame_last + create_shot_strip( f'tmp_shot_{str(i).zfill(3)}', - start=frame_start+strip.frame_final_start, - end=frame_end+strip.frame_final_start + start=frame_start, + end=frame_end ) i += 1 @@ -235,12 +267,13 @@ class VSETB_OT_auto_split(Operator): process.wait() - # last strip: - create_shot_strip( - f'tmp_shot_{str(i).zfill(3)}', - start=frame_start+strip.frame_final_start, - end=strip.frame_final_end - ) + # Last strip: + if frame_start < self.frame_last: + create_shot_strip( + f'tmp_shot_{str(i).zfill(3)}', + start=frame_start, + end=self.frame_last + ) return {'FINISHED'}