refactor: 统一封面生成管道 — 从渲染后视频抽帧作为封面 #1371
Reference in New Issue
Block a user
Delete Branch "refactor/unify-cover-pipeline"
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?
改动概述
统一视频封面生成管道,消除3条独立的封面/缩略图生成路径,改为单一管道:
核心思路:视频渲染时标题已通过 ASS 字幕烧进最终视频,渲染完成后直接从已渲染视频中抽帧作为封面,封面天然带标题,不需要额外的标题叠加逻辑。
改动详情
新增/修改
thumbnail_generator.py:简化为仅保留extract_first_frame和_format_seek_time,删除所有封面叠加/候选帧逻辑render_adapter.py:将原来的 step 6(缩略图生成)+ step 7(封面候选帧)合并为单一的「从渲染后视频抽帧」步骤,返回cover_urlgeneration.py:_render_video返回cover_url,持久化到GenerationTask.cover_url,并传递给视频记录generation_cover.py:封面 API 优先从GenerationTask.cover_url读取已持久化的封面,简化 fallback 逻辑ai_service.py:删除_extract_frames_with_ffmpeg,简化_call_ai_cover_service(移除 FFmpeg 抽帧 fallback)dedup_helpers.py:移除自动缩略图生成的 fallback 分支(封面 URL 由上游传入)ingest.py:素材缩略图改用extract_first_frame+upload_to_oss替代generate_and_upload_thumbnail删除
_overlay_title_on_image()— 不再需要标题叠加generate_and_upload_thumbnail()— 统一管道替代extract_cover_candidates()— 多帧候选逻辑不再需要extract_and_upload_cover_frames()— 封面候选帧上传不再需要_extract_frames_with_ffmpeg()— AI 服务中的备用抽帧不再需要cover_candidates相关代码 — 统一为单一cover_url测试更新
test_cover_frame_pre_extract.py:重写为测试新的统一管道(extract_first_frame)test_generated_video_creation_logic.py:更新 mock 和断言以匹配新逻辑数据链路
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
代码审查结果 - PR #1371
⚠️ 问题(1个需要修改)
cmd2。cmd = [...],但在执行时调用了run_ffmpeg(cmd2, ...)。由于cmd2未定义,运行时会抛出NameError,导致封面/缩略图生成失败。run_ffmpeg(cmd2, ...)修改为run_ffmpeg(cmd, ...),或者补充cmd2的定义逻辑(根据上下文判断,此处应直接使用cmd)。💡 建议(1个可选)
GenerationTaskModel的导入语句移至文件顶部。from packages.adapters.sqlalchemy_impl.models import GenerationTaskModel,虽然功能正常,但将其移至模块顶部符合 Python 编码规范,且能避免函数调用时的重复导入开销。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好
🤖 由 AI 代码审查机器人自动生成 | 2026-08-14 13:24:50 | 模型:
🗑️ 预览环境已清理
PR #1371 已关闭或合并,对应的预览环境已被清理。