fix(P0): 修复直通模式调速失效 + 音画不同步 #568

Merged
auto-approve-bot merged 1 commits from fix/p1-pass-through-speed-audio into develop 2026-07-19 10:10:45 +08:00
@@ -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: