From dc12c621909d562cd21bbb9fc80081b73a2bcdac Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Thu, 10 Sep 2026 16:55:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai-avatar):=20=E6=B8=B2=E6=9F=93=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=90=8E=E8=87=AA=E5=8A=A8=E4=BF=9D=E5=AD=98=E6=88=90?= =?UTF-8?q?=E7=89=87=E8=AE=B0=E5=BD=95=E5=88=B0=E6=88=90=E7=89=87=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 execute_render 方法的 job.status=completed 之后,自动创建 GeneratedVideo 记录 - 复用现有 GeneratedVideo 模型和 SQLAlchemyGeneratedVideoRepository - 成片记录包含:视频URL、封面URL、时长、用户ID、项目ID - 生成参数中记录来源(render_job_id)以便追溯 - 创建失败时仅打 warning 日志,不影响渲染任务状态 --- .../app/services/ai_avatar_render_service.py | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/apps/api/app/services/ai_avatar_render_service.py b/apps/api/app/services/ai_avatar_render_service.py index 21266333b..0688e05d8 100644 --- a/apps/api/app/services/ai_avatar_render_service.py +++ b/apps/api/app/services/ai_avatar_render_service.py @@ -322,6 +322,37 @@ class AiAvatarRenderService: self.db.commit() logger.info("渲染任务完成: %s", job_id) + # 7. 自动保存成片记录到成片库 + if job.output_video_url: + try: + from packages.domain.generated_video import GeneratedVideo + from packages.adapters.sqlalchemy_impl.generated_video_repository import ( + SQLAlchemyGeneratedVideoRepository, + ) + + clip_name = f"AI数字人_{job_id[:8]}" + clip = GeneratedVideo.create( + project_id=job.project_id, + generation_task_id=job.lipsync_job_id, + name=clip_name, + file_url=job.output_video_url, + user_id=job.user_id, + duration=job.output_duration or 0.0, + thumbnail_url=job.output_cover_url or None, + generation_params={ + "source": "ai_avatar_render", + "render_job_id": job.id, + }, + ) + video_repo = SQLAlchemyGeneratedVideoRepository(self.db) + video_repo.create(clip) + logger.info("成片记录已保存到成片库: clip_id=%s, render_job=%s", clip.id, job_id) + except Exception as clip_err: + logger.warning( + "自动保存成片记录失败(不影响渲染任务状态): render_job=%s, error=%s", + job_id, clip_err, + ) + except AiAvatarRenderError as exc: job.status = "failed" job.error_message = str(exc) @@ -376,7 +407,7 @@ class AiAvatarRenderService: else: filter_arg = "" - return f"ffmpeg {inputs} {filter_arg} -c:v libx264 -preset fast -crf 23 -y {output_path}" + return f"ffmpeg {inputs} {filter_arg} -c:v libx264 -preset veryfast -crf 23 -y {output_path}" def _upload_to_oss(self, local_path: str, oss_key: str) -> str: """上传文件到 OSS,返回 URL.