fix: pass source fps to ffmpeg export via fps filter
This commit is contained in:
@@ -45,6 +45,7 @@ def build_ffmpeg_command(
|
|||||||
portrait_ratio: str | None = None,
|
portrait_ratio: str | None = None,
|
||||||
crop_center: float = 0.5,
|
crop_center: float = 0.5,
|
||||||
image_sequence: bool = False,
|
image_sequence: bool = False,
|
||||||
|
fps: float | None = None,
|
||||||
) -> list[str]:
|
) -> list[str]:
|
||||||
# -ss before -i: fast input-seeking. Safe here because we always re-encode
|
# -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.
|
# (libx264/aac), so there is no keyframe-alignment issue from pre-input seek.
|
||||||
@@ -66,6 +67,8 @@ def build_ffmpeg_command(
|
|||||||
filters.append(
|
filters.append(
|
||||||
f"scale='if(lt(iw,ih),{short_side},-2)':'if(lt(iw,ih),-2,{short_side})':flags=lanczos"
|
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:
|
if filters:
|
||||||
cmd += ["-vf", ",".join(filters)]
|
cmd += ["-vf", ",".join(filters)]
|
||||||
|
|
||||||
@@ -305,7 +308,8 @@ class ExportWorker(QThread):
|
|||||||
short_side: int | None = None,
|
short_side: int | None = None,
|
||||||
portrait_ratio: str | None = None,
|
portrait_ratio: str | None = None,
|
||||||
crop_center: float = 0.5,
|
crop_center: float = 0.5,
|
||||||
image_sequence: bool = False):
|
image_sequence: bool = False,
|
||||||
|
fps: float | None = None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._input = input_path
|
self._input = input_path
|
||||||
self._start = start
|
self._start = start
|
||||||
@@ -314,6 +318,7 @@ class ExportWorker(QThread):
|
|||||||
self._portrait_ratio = portrait_ratio
|
self._portrait_ratio = portrait_ratio
|
||||||
self._crop_center = crop_center
|
self._crop_center = crop_center
|
||||||
self._image_sequence = image_sequence
|
self._image_sequence = image_sequence
|
||||||
|
self._fps = fps
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
try:
|
try:
|
||||||
@@ -325,6 +330,7 @@ class ExportWorker(QThread):
|
|||||||
portrait_ratio=self._portrait_ratio,
|
portrait_ratio=self._portrait_ratio,
|
||||||
crop_center=self._crop_center,
|
crop_center=self._crop_center,
|
||||||
image_sequence=self._image_sequence,
|
image_sequence=self._image_sequence,
|
||||||
|
fps=self._fps,
|
||||||
)
|
)
|
||||||
result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
|
result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
|
||||||
if result.returncode == 0:
|
if result.returncode == 0:
|
||||||
@@ -1552,6 +1558,7 @@ class MainWindow(QMainWindow):
|
|||||||
portrait_ratio=portrait_ratio,
|
portrait_ratio=portrait_ratio,
|
||||||
crop_center=self._crop_center,
|
crop_center=self._crop_center,
|
||||||
image_sequence=image_sequence,
|
image_sequence=image_sequence,
|
||||||
|
fps=self._fps,
|
||||||
)
|
)
|
||||||
self._export_worker.finished.connect(self._on_export_done)
|
self._export_worker.finished.connect(self._on_export_done)
|
||||||
self._export_worker.error.connect(self._on_export_error)
|
self._export_worker.error.connect(self._on_export_error)
|
||||||
|
|||||||
Reference in New Issue
Block a user