From 53f76f97000a0c13c667fa613e66a16360cfb4e0 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Sun, 19 Jul 2026 10:04:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(P0):=20=E4=BF=AE=E5=A4=8D=E7=9B=B4=E9=80=9A?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E8=B0=83=E9=80=9F=E5=A4=B1=E6=95=88+?= =?UTF-8?q?=E9=9F=B3=E7=94=BB=E4=B8=8D=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - stream_copy没检查调速/倒放,有调速时错误走流拷贝导致调速失效 - 直通模式视频setpts调速了但音频没atempo调速,音画不同步 - 修复多个音频滤镜用独立-af参数互相覆盖的问题 --- .../unified_render_service.py | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/apps/worker/video_processing/unified_render_service.py b/apps/worker/video_processing/unified_render_service.py index f97b1aef4..8e9d780b8 100755 --- a/apps/worker/video_processing/unified_render_service.py +++ b/apps/worker/video_processing/unified_render_service.py @@ -801,6 +801,16 @@ class UnifiedRenderService: if ass_path is not None: return False, "有字幕叠加" + # 有调速 → 需要重编码 → 不能 copy + speed = UnifiedRenderService._clip_speed(clip) + if abs(speed - 1.0) >= 1e-6: + return False, f"有调速: speed={speed:.2f}x" + + # 有倒放 → 需要重编码 → 不能 copy + reverse_config = ReverseConfig.from_dict(clip.config.get("reverse")) + if reverse_config.enabled and (reverse_config.reverse_video or reverse_config.reverse_audio): + return False, "有倒放效果" + # 探测输入视频参数 info = probe_video_info(str(clip.local_path)) @@ -1068,8 +1078,9 @@ class UnifiedRenderService: # background 以外的视频素材,默认带音频 has_audio = role != "background" if has_audio: - # 检查是否需要音频降噪 af_parts: list[str] = [] + + # 音频降噪 try: from video_processing.noise_reduction_engine import NoiseReductionConfig, NoiseReductionEngine @@ -1083,17 +1094,29 @@ class UnifiedRenderService: except Exception as e: logger.warning("[unified-render] 直通模式音频降噪应用失败,跳过: %s", e) - if af_parts: - command.extend(["-af", ",".join(af_parts)]) + # 音频调速(与视频setpts对应,保持音画同步) + speed = UnifiedRenderService._clip_speed(clip) + if abs(speed - 1.0) >= 1e-6: + try: + from video_processing.speed_engine import SpeedConfig, SpeedEngine - command.extend(["-c:a", "aac", "-b:a", "128k"]) + speed_cfg = SpeedConfig(speed=speed) + speed_engine = SpeedEngine() + af_parts.append(speed_engine.build_audio_filter(speed_cfg)) + except Exception as e: + logger.warning("[unified-render] 直通模式音频调速应用失败,跳过: %s", e) # 音频倒放 reverse_config = ReverseConfig.from_dict(clip.config.get("reverse")) if reverse_config.enabled and reverse_config.reverse_audio: af_filter = ReverseEngine.build_audio_filter(reverse_config, duration=effective_duration) if af_filter: - command.extend(["-af", af_filter]) + af_parts.append(af_filter) + + if af_parts: + command.extend(["-af", ",".join(af_parts)]) + + command.extend(["-c:a", "aac", "-b:a", "128k"]) # 统一截断时长(同时作用于视频和音频) if final_duration > 0: -- 2.54.0