feat: configurable clip duration, playback speed, Windows WId embedding

Add clip duration spinner (2–30s, default 8s) replacing all hardcoded
8.0 references. Store clip_duration in DB for accurate re-export span
calculations. Add x2/x4 playback speed toggle buttons. On Windows, mpv
renders directly into the widget's native window handle (WId embedding)
instead of slow FBO readback; crop overlays use a transparent child
widget. Fix _poll_render crash when player is None after closeEvent.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-28 15:18:37 +02:00
parent e972c7a2ae
commit 47f910644d
3 changed files with 239 additions and 91 deletions
+5 -3
View File
@@ -78,6 +78,7 @@ def build_ffmpeg_command(
crop_center: float = 0.5,
image_sequence: bool = False,
encoder: str = "libx264",
duration: float = 8.0,
) -> list[str]:
# -ss before -i: fast input-seeking. Safe here because we always re-encode,
# so there is no keyframe-alignment issue from pre-input seek.
@@ -96,7 +97,7 @@ def build_ffmpeg_command(
"-threads", "0",
"-ss", str(start),
"-i", input_path,
"-t", "8",
"-t", str(duration),
]
filters: list[str] = []
@@ -141,14 +142,15 @@ def build_ffmpeg_command(
return cmd
def build_audio_extract_command(input_path: str, start: float, sequence_dir: str) -> list[str]:
def build_audio_extract_command(input_path: str, start: float, sequence_dir: str,
duration: float = 8.0) -> list[str]:
"""Return an ffmpeg command that extracts audio to <sequence_dir>.wav."""
audio_path = sequence_dir + ".wav"
return [
_bin("ffmpeg"), "-y",
"-ss", str(start),
"-i", input_path,
"-t", "8",
"-t", str(duration),
"-vn",
"-c:a", "pcm_s16le",
audio_path,