From ffb8ea6790ba22098618e84292a1e22acaf06486 Mon Sep 17 00:00:00 2001 From: saas-backend Date: Mon, 21 Sep 2026 19:13:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=20MCI=20=E6=8F=92?= =?UTF-8?q?=E5=B8=A7=EF=BC=8C60fps=20=E8=BE=93=E5=85=A5=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=BE=93=E5=87=BA=2025fps=20=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 Step 8 的 minterpolate MCI 运动补偿插帧(CPU密集,343帧超6分钟导致超时504) - 高帧率视频降帧至 25fps 后直接输出,对口型数字人场景完全够用 - 插帧失败不再导致整个任务 504,直接降级返回 25fps 结果 --- deploy/gpu_worker/musetalk_server.py | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/deploy/gpu_worker/musetalk_server.py b/deploy/gpu_worker/musetalk_server.py index 5eb9fd474..28af0c64e 100644 --- a/deploy/gpu_worker/musetalk_server.py +++ b/deploy/gpu_worker/musetalk_server.py @@ -3,8 +3,8 @@ 部署在 RTX2060 本地,接收 gpu_worker.py 的推理请求,调用 MuseTalk 生成口型同步视频。 Bug 修复(2026-09-21): - - Bug1: 60fps降帧逻辑 — 输入视频 >30fps 时先降帧至 25fps 推理,推理后用 - minterpolate MCI 插帧回原帧率,并记录 input_fps/inference_fps + - Bug1: 60fps降帧逻辑 — 输入视频 >30fps 时先降帧至 25fps 推理,直接输出 25fps 结果 + (MCI 运动补偿插帧已移除,CPU密集且口型场景 25fps 足够) - Bug2: 超时终止机制 — 推理线程改为 daemon + abort_event 机制,超时时 set event 让推理循环检测退出,同时 kill 所有活跃 ffmpeg 子进程,等线程退出后再释放锁和清理目录 - Bug3: /health 接口增加 gfpgan_loaded 和 gfpgan_load_error 字段 @@ -977,25 +977,13 @@ def _run_inference( pass raise - # ── Step 8: 高帧率视频插帧还原(如输入 >30fps,从 25fps 插帧回原帧率)── + # ── Step 8: 高帧率视频处理 ── + # 对口型数字人视频,25fps 完全够用。 + # MCI 运动补偿插帧极其耗时(343帧>6分钟),已移除。 + # 直接输出 25fps 推理结果,后续封装音频后播放器自动适配帧率。 final_video = silent_video_path if video_downsampled: - upscaled_video = video_path.parent / "output_upscaled.mp4" - logger.info("将推理结果从 %.1f fps 插帧还原至 %.1f fps", inference_fps, original_fps) - try: - _run_ffmpeg([ - "ffmpeg", "-y", "-v", "warning", - "-i", str(silent_video_path), - "-vf", f"minterpolate=mi_mode=mci:mc_mode=aobmc:me_mode=bidir:vsbmc=1:fps={int(original_fps)}", - "-c:v", "libx264", "-preset", "veryfast", - "-crf", "18", "-pix_fmt", "yuv420p", - str(upscaled_video), - ], timeout=max(300, int(original_fps * 10))) - final_video = upscaled_video - logger.info("插帧还原完成: %.1f fps", original_fps) - except Exception as e: - logger.warning("插帧还原失败,使用 %.1f fps 结果: %s", inference_fps, e) - final_video = silent_video_path + logger.info("输入视频 %.1f fps,降帧至 %.1f fps 推理后直接输出(不做插帧还原)", original_fps, inference_fps) shutil.copy2(str(final_video), str(output_path))