perf(worker): 封面抽帧三优化 — blackdetect黑屏规避+单次ffmpeg批量抽帧+并发上传+CJK字体兜底 #2091

Merged
auto-approve-bot merged 4 commits from fix/cover-blackdetect-batch-upload-fonts into develop 2026-09-28 22:32:56 +08:00
Owner

三个 P2 优化合并一个 PR:

1. 黑屏检测(blackdetect)

抽帧前用 ffmpeg blackdetect=d=0.3:pic_th=0.98:pix_th=0.10 扫描黑屏区间,seek 点落在黑屏内时自动偏移到最近非黑屏位置(前向优先、后向兜底,偏移 tolerance=0.25s);整段全黑则保留中点并打 warning 日志。避免封面/预览首帧落到黑屏。

2. 封面单次 ffmpeg 抽帧 + 并发上传

  • 5 次串行 ffmpeg -ss seek -vframes 1(起停进程 ~200-400ms/次)改为单次 ffmpeg 用 select=between(t,t1-0.03,t1+0.04)+... + -vsync vfr 一次输出 5 帧;
  • 5 帧上传 OSS 用 ThreadPoolExecutor(max_workers=min(8,N)) 并发;
  • 单次 select 失败/命中帧数不足时自动回退到单帧 -ss seek 兜底,保证鲁棒性。
  • 目标:封面阶段从 ~3.1s 压到 <1.5s。

3. Worker Dockerfile 加 fonts-noto-cjk 兜底

  • worker.Dockerfile 显式 apt-get install fonts-noto-cjk + fontconfig(防 base 镜像漂移);
  • build 阶段 fc-cache -fv 并 fc-match "Noto Sans CJK SC" | grep -qi noto 校验,确保容器内 fc-match 能正确解析到 Noto,不再依赖 PIL 直读 ttf 兜底路径。

改动文件

  • apps/worker/video_processing/thumbnail_generator.py: +274 -38(blackdetect+select批量抽帧+ThreadPool并发上传)
  • infra/docker/worker.Dockerfile: +13(fonts-noto-cjk 安装+fc-cache校验)

验证

  • ruff check/format ✅
  • py_compile ✅
  • 等待 CI 构建 Worker 镜像(Dockerfile 改动触发完整镜像 build)+ Staging 部署后实测封面阶段耗时与字体渲染。
三个 P2 优化合并一个 PR: ## 1. 黑屏检测(blackdetect) 抽帧前用 `ffmpeg blackdetect=d=0.3:pic_th=0.98:pix_th=0.10` 扫描黑屏区间,seek 点落在黑屏内时自动偏移到最近非黑屏位置(前向优先、后向兜底,偏移 tolerance=0.25s);整段全黑则保留中点并打 warning 日志。避免封面/预览首帧落到黑屏。 ## 2. 封面单次 ffmpeg 抽帧 + 并发上传 - 5 次串行 `ffmpeg -ss seek -vframes 1`(起停进程 ~200-400ms/次)改为单次 ffmpeg 用 `select=between(t,t1-0.03,t1+0.04)+...` + `-vsync vfr` 一次输出 5 帧; - 5 帧上传 OSS 用 `ThreadPoolExecutor(max_workers=min(8,N))` 并发; - 单次 select 失败/命中帧数不足时自动回退到单帧 -ss seek 兜底,保证鲁棒性。 - 目标:封面阶段从 ~3.1s 压到 <1.5s。 ## 3. Worker Dockerfile 加 fonts-noto-cjk 兜底 - worker.Dockerfile 显式 apt-get install fonts-noto-cjk + fontconfig(防 base 镜像漂移); - build 阶段 fc-cache -fv 并 `fc-match "Noto Sans CJK SC" | grep -qi noto` 校验,确保容器内 fc-match 能正确解析到 Noto,不再依赖 PIL 直读 ttf 兜底路径。 ## 改动文件 - apps/worker/video_processing/thumbnail_generator.py: +274 -38(blackdetect+select批量抽帧+ThreadPool并发上传) - infra/docker/worker.Dockerfile: +13(fonts-noto-cjk 安装+fc-cache校验) ## 验证 - ruff check/format ✅ - py_compile ✅ - 等待 CI 构建 Worker 镜像(Dockerfile 改动触发完整镜像 build)+ Staging 部署后实测封面阶段耗时与字体渲染。
xiaoxia added 1 commit 2026-09-28 22:01:27 +08:00
perf(worker): 封面抽帧三优化 — blackdetect黑屏规避+单次ffmpeg批量抽帧+并发上传+CJK字体兜底
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 0s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 38s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m5s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 3m9s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 3m22s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m47s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m3s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m24s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 4m36s
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
3faa11fef0
1. 黑屏检测(blackdetect):抽帧前先用 ffmpeg blackdetect(d=0.3,pic_th=0.98,pix_th=0.10) 扫描成片黑屏区间,
   seek 点落在黑屏内时偏移到最近非黑屏位置;整段全黑则保留中点并打 warning 日志。避免封面/首帧落到黑屏。
2. 封面批量抽帧+并发上传:5次串行 ffmpeg -ss seek 改成单次 ffmpeg select between(t,...) 一次输出 5 帧;
   5帧上传 OSS 用 ThreadPoolExecutor 并发(max_workers=min(8,N))。目标封面阶段从 ~3.1s 压到 <1.5s。
   单次 select 失败/命中不足自动回退到单帧 -ss seek 兜底,保证鲁棒性。
3. Worker Dockerfile 加 fonts-noto-cjk 安装与 fc-cache:
   - 在 worker.Dockerfile apt-get install 显式加 fonts-noto-cjk + fontconfig(base 镜像漂移兜底)
   - build 时 fc-cache -fv + fc-match 'Noto Sans CJK SC' 校验,确保 fc-match 能解析到 Noto,
     不再依赖 PIL 直读 ttf 兜底路径。

🚀 预览环境已部署

项目 详情
PR号 #2091
预览链接 https://pr-2091.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #2091 | | 预览链接 | [https://pr-2091.preview.xiaoxiajianji.com](https://pr-2091.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia added 1 commit 2026-09-28 22:06:36 +08:00
fix(ci): Dockerfile 字体安装步骤容错 — 不阻断镜像构建,fc-match 结果打日志
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 0s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 55s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m32s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 2m57s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m6s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m43s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m3s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 4m23s
AI Code Review / AI Code Review (pull_request) Successful in 6m35s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 7m32s
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
f5cb0b13cf
xiaoxia added 1 commit 2026-09-28 22:14:29 +08:00
test(worker): 更新 thumbnail 单测适配新抽帧流程 + 新增 blackdetect 偏移逻辑纯逻辑测试
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 50s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m9s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m26s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m56s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m0s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 4m20s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m40s
AI Code Review / AI Code Review (pull_request) Successful in 6m34s
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Style (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
74a3bd51ab
auto-approve-bot added 1 commit 2026-09-28 22:21:57 +08:00
style: auto-format with black + isort + ruff + prettier [skip ci-format-check]
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 46s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m0s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m21s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m27s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m32s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 3m52s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 6m14s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 6m22s
AI Code Review / AI Code Review (pull_request) Successful in 6m39s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 10m22s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m43s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 41s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 4m59s
b6c7308c40
auto-approve-bot merged commit 3904a8f3b5 into develop 2026-09-28 22:32:56 +08:00
auto-approve-bot deleted branch fix/cover-blackdetect-batch-upload-fonts 2026-09-28 22:32:59 +08:00

🗑️ 预览环境已清理

PR #2091 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #2091 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.