fix(gui): 更新 FFmpeg 参数以改进 GIF 生成质量和错误处理

This commit is contained in:
wood chen 2025-05-24 17:36:04 +08:00
parent 163f71564f
commit d407d3f72e
2 changed files with 24 additions and 15 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
__pycache__/gui.cpython-311.pyc __pycache__/gui.cpython-311.pyc
ffmpeg/ffmpeg.exe

38
gui.py
View File

@ -221,14 +221,14 @@ class VideoToGifConverter:
self.files_list.insert(tk.END, file) self.files_list.insert(tk.END, file)
def get_quality_settings(self): def get_quality_settings(self):
"""根据质量设置返回 FFmpeg 调色板生成参数""" """根据质量设置返回 FFmpeg 参数"""
quality = self.quality_var.get() quality = self.quality_var.get()
if quality == "high": if quality == "high":
return "stats_mode=full" return ["-quality", "100"]
elif quality == "medium": elif quality == "medium":
return "stats_mode=diff" return ["-quality", "75"]
else: else:
return "stats_mode=diff:dither=bayer:bayer_scale=2" return ["-quality", "50"]
def validate_inputs(self): def validate_inputs(self):
"""验证输入参数""" """验证输入参数"""
@ -329,13 +329,8 @@ class VideoToGifConverter:
if duration: if duration:
palette_cmd.extend(["-t", str(float(duration))]) palette_cmd.extend(["-t", str(float(duration))])
# 获取质量设置 # 添加滤镜和输出
quality_setting = self.get_quality_settings() palette_cmd.extend(["-vf", f"{filter_complex},palettegen", palette_path])
# 修改调色板生成命令中的滤镜
palette_cmd.extend(
["-vf", f"{filter_complex},palettegen={quality_setting}", palette_path]
)
# 打印命令用于调试 # 打印命令用于调试
print("调色板生成命令:", " ".join(palette_cmd)) print("调色板生成命令:", " ".join(palette_cmd))
@ -361,7 +356,12 @@ class VideoToGifConverter:
_, stderr = process.communicate() _, stderr = process.communicate()
if process.returncode != 0: if process.returncode != 0:
raise RuntimeError(f"调色板生成失败: {stderr.decode()}") error_output = ""
try:
error_output = stderr.decode("utf-8", errors="replace")
except Exception:
error_output = str(stderr) # Fallback to raw string representation
raise RuntimeError(f"调色板生成失败: {error_output}")
# 更新状态显示 # 更新状态显示
self.status_label.config( self.status_label.config(
@ -381,13 +381,16 @@ class VideoToGifConverter:
if duration: if duration:
gif_cmd.extend(["-t", str(float(duration))]) gif_cmd.extend(["-t", str(float(duration))])
# 修改 GIF 生成命令中的滤镜 # 获取并添加质量设置
quality_settings = self.get_quality_settings()
gif_cmd.extend(quality_settings)
gif_cmd.extend( gif_cmd.extend(
[ [
"-i", "-i",
palette_path, palette_path,
"-lavfi", "-lavfi",
f"{filter_complex} [x]; [x][1:v] paletteuse=dither=bayer:bayer_scale=2", f"{filter_complex} [x]; [x][1:v] paletteuse",
output_path, output_path,
] ]
) )
@ -410,7 +413,12 @@ class VideoToGifConverter:
_, stderr = process.communicate() _, stderr = process.communicate()
if process.returncode != 0: if process.returncode != 0:
raise RuntimeError(f"GIF生成失败: {stderr.decode()}") error_output = ""
try:
error_output = stderr.decode("utf-8", errors="replace")
except Exception:
error_output = str(stderr) # Fallback to raw string representation
raise RuntimeError(f"GIF生成失败: {error_output}")
# 删除临时调色板文件 # 删除临时调色板文件
if os.path.exists(palette_path): if os.path.exists(palette_path):