feat: 统一预览与确认生成渲染路径 — 预览=正式品质+确认复用 #1339
Reference in New Issue
Block a user
Delete Branch "feature/unify-preview-confirm-render-path"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
渲染管线统一
确认生成复用预览产物
测试
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/api/app/api/routes/generation_tasks.py: 372] 确认生成时未校验分辨率一致性
confirm_generation函数的复用逻辑中,当预览任务已完成时,代码直接调用mark_confirmed并复用产物,但未校验用户在确认时请求的output_width/output_height是否与预览任务实际渲染的分辨率一致。output_width更新为 720p,导致数据不一致(视频文件实际是 1080p,元数据却是 720p),造成用户获取到错误的视频文件。request.output_width或request.output_height与source_task中的实际值不符,应跳过复用逻辑,走新建任务流程以重新渲染。[apps/api/app/api/routes/templates_editor/generation.py: 196] 时间比较可能引发空指针异常
_find_reusable_preview_task函数中,直接比较plan_updated > completed_at。虽然 SQLAlchemy 通常会自动处理updated_at,但如果plan.updated_at为None(例如 Plan 模型配置允许为空或刚创建未刷新),此比较会抛出TypeError。if plan_updated and completed_at and plan_updated > completed_at:。💡 改进建议(不阻塞合并)
[apps/worker/video_processing/render_adapter.py: 508] ASR 服务初始化策略调整
is_preview判断,现在无论是否有配音需求都会初始化 ASR 服务 (asr_service = self._get_asr_service())。如果 ASR 初始化涉及加载重型模型,这会导致所有渲染任务(包括无配音的纯视频任务)性能下降。建议保留原有的按需初始化逻辑,仅在检测到voice_id或voiceover_audio_path时才初始化 ASR。[apps/api/app/api/routes/generation_tasks.py: 372] 复用产物前应校验视频文件存在性
is_completed状态。建议增加对generated_videos表的查询,确保任务确实有对应的视频输出文件 URL,避免因任务状态标记为“完成”但文件丢失(如存储故障)导致返回空链接给用户。✅ 良好实践
is_preview分支统一了渲染路径,减少了维护成本。mark_confirmed方法的设计合理,通过更新is_preview标志位有效防止了重复确认。generation_preview.py中移除了硬编码的分辨率计算逻辑,改由 Worker 端根据模板配置决定,提高了灵活性。🤖 由 AI 代码审查机器人自动生成 | 2026-08-10 16:01:11 | 模型:
🗑️ 预览环境已清理
PR #1339 已关闭或合并,对应的预览环境已被清理。