fix: overlay title text on auto-generated cover frames #1365
Reference in New Issue
Block a user
Delete Branch "fix/cover-title-overlay"
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?
Problem
自动生成封面时,从视频中截取关键帧后没有叠加用户选择的标题文字。封面只是一张原始视频帧截图,没有任何文字。
Root Cause
extract_cover_candidates()和extract_and_upload_cover_frames()只是用 FFmpeg 抽取视频帧并上传,没有任何文字渲染步骤。标题文字存储在plan.config["title"]["text"]中但没有传递给封面生成函数。Fix
thumbnail_generator.py: 新增
_overlay_title_on_image()函数,使用 FFmpeg drawtext 滤镜在封面图上叠加标题文字extract_cover_candidates(): 新增
title_text参数,抽帧后调用文字叠加extract_and_upload_cover_frames(): 新增
title_text参数并透传render_adapter.py: 从
plan_config["title"]提取标题文字并传给封面生成Result
自动生成封面 = 视频关键帧 + 用户标题文字叠加
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
- thumbnail_generator: _overlay_title_on_image now escapes [ and ] characters to prevent FFmpeg filter syntax errors when title contains brackets (e.g. '[Tag]') - render_adapter: use (plan_config or {}).get(...) to guard against None plan_config in cover candidate generation block Addresses AI Code Review findings on PR #1365.【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
[apps/worker/video_processing/thumbnail_generator.py: 144] 硬编码字体路径存在环境依赖风险
/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc。如果部署环境(如不同版本的 Linux 发行版或精简容器)中不存在此路径,FFmpeg 将报错,导致标题叠加功能静默失败(虽然有异常捕获,但功能不可用)。建议将字体路径配置化,或增加常见的字体路径回退机制(如尝试多个可能的路径)。[apps/worker/video_processing/thumbnail_generator.py: 129] 字符串截断逻辑在转义后进行可能导致显示长度不一致
:变成\:),再判断长度是否大于 60 进行截断。如果原始文本包含大量需要转义的字符,转义后的字符串长度会翻倍,导致实际显示的文本远少于 60 个字符就被截断。建议先对原始title_text进行长度截断,然后再进行转义处理,以保证显示字符数量的稳定性。✅ 良好实践
_overlay_title_on_image函数中使用了try...except块,并在失败时清理临时文件(.tmp.jpg),同时回退到原图,保证了视频处理主流程的鲁棒性。cmd传递参数给run_ffmpeg,有效避免了 Shell 命令注入风险;对 FFmpegdrawtext滤镜中的特殊字符进行了转义处理,防止了滤镜语法错误。shutil.move原子性地替换原文件,避免了处理过程中写入失败导致原文件损坏的问题。✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能无明显瓶颈
🤖 由 AI 代码审查机器人自动生成 | 2026-08-14 04:00:54 | 模型:
🗑️ 预览环境已清理
PR #1365 已关闭或合并,对应的预览环境已被清理。