improve usage
parent
940cd1100f
commit
61f6ec3896
|
@ -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)
|
||||
|
|
|
@ -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'}
|
||||
|
||||
|
|
Loading…
Reference in New Issue