fix(P0): 修复直通模式调速失效+音画不同步
CI Build & Deploy Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Staging API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production API Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 17s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 24s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 49s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 30s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 2m16s
Auto Approve CI PRs / Auto Approve on CI Green (pull_request) Successful in 2m50s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m24s
Auto Merge CI PRs / Auto Merge on CI Green + Approved (pull_request) Successful in 5m17s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 33s
AI Code Review / AI Code Review (pull_request) Successful in 7m8s

- stream_copy没检查调速/倒放,有调速时错误走流拷贝导致调速失效
- 直通模式视频setpts调速了但音频没atempo调速,音画不同步
- 修复多个音频滤镜用独立-af参数互相覆盖的问题
This commit is contained in:
CI Bot
2026-07-19 10:04:50 +08:00
parent 2bd6edbe37
commit 53f76f9700
@@ -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: