diff --git a/main.py b/main.py index 1e9112d..e0a04be 100755 --- a/main.py +++ b/main.py @@ -45,6 +45,7 @@ def build_ffmpeg_command( portrait_ratio: str | None = None, crop_center: float = 0.5, image_sequence: bool = False, + fps: float | None = None, ) -> list[str]: # -ss before -i: fast input-seeking. Safe here because we always re-encode # (libx264/aac), so there is no keyframe-alignment issue from pre-input seek. @@ -66,6 +67,8 @@ def build_ffmpeg_command( filters.append( f"scale='if(lt(iw,ih),{short_side},-2)':'if(lt(iw,ih),-2,{short_side})':flags=lanczos" ) + if fps is not None: + filters.append(f"fps={fps}") if filters: cmd += ["-vf", ",".join(filters)] @@ -305,7 +308,8 @@ class ExportWorker(QThread): short_side: int | None = None, portrait_ratio: str | None = None, crop_center: float = 0.5, - image_sequence: bool = False): + image_sequence: bool = False, + fps: float | None = None): super().__init__() self._input = input_path self._start = start @@ -314,6 +318,7 @@ class ExportWorker(QThread): self._portrait_ratio = portrait_ratio self._crop_center = crop_center self._image_sequence = image_sequence + self._fps = fps def run(self): try: @@ -325,6 +330,7 @@ class ExportWorker(QThread): portrait_ratio=self._portrait_ratio, crop_center=self._crop_center, image_sequence=self._image_sequence, + fps=self._fps, ) result = subprocess.run(cmd, capture_output=True, text=True, timeout=120) if result.returncode == 0: @@ -1552,6 +1558,7 @@ class MainWindow(QMainWindow): portrait_ratio=portrait_ratio, crop_center=self._crop_center, image_sequence=image_sequence, + fps=self._fps, ) self._export_worker.finished.connect(self._on_export_done) self._export_worker.error.connect(self._on_export_error)