perf(worker): 封面抽帧三优化 — blackdetect黑屏规避+单次ffmpeg批量抽帧+并发上传+CJK字体兜底 #2091
Reference in New Issue
Block a user
Delete Branch "fix/cover-blackdetect-batch-upload-fonts"
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?
三个 P2 优化合并一个 PR:
1. 黑屏检测(blackdetect)
抽帧前用
ffmpeg blackdetect=d=0.3:pic_th=0.98:pix_th=0.10扫描黑屏区间,seek 点落在黑屏内时自动偏移到最近非黑屏位置(前向优先、后向兜底,偏移 tolerance=0.25s);整段全黑则保留中点并打 warning 日志。避免封面/预览首帧落到黑屏。2. 封面单次 ffmpeg 抽帧 + 并发上传
ffmpeg -ss seek -vframes 1(起停进程 ~200-400ms/次)改为单次 ffmpeg 用select=between(t,t1-0.03,t1+0.04)+...+-vsync vfr一次输出 5 帧;ThreadPoolExecutor(max_workers=min(8,N))并发;3. Worker Dockerfile 加 fonts-noto-cjk 兜底
fc-match "Noto Sans CJK SC" | grep -qi noto校验,确保容器内 fc-match 能正确解析到 Noto,不再依赖 PIL 直读 ttf 兜底路径。改动文件
验证
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 已关闭或合并,对应的预览环境已被清理。