## 现状 `backend/app/utils/video_reader.py` 的 `extract_frames()` 以固定间隔生成采样时间戳: ```python timestamps = [i for i in range(0, int(duration), self.frame_interval)][:max_frames] ``` 唯一的"智能"成分是 `dedupe_enabled` 时的**相邻帧 MD5 精确比对**去重。 ## 问题 1. **固定间隔与内容无关**:短于采样间隔的画面切换必然被漏掉;静止画面则重复采样(有相邻去重兜底)。 2. **MD5 去重只对"整帧逐字节相同"生效**:最常见的课程视频形态是"PPT + 讲师头像画中画",人物任何微小动作都会改变整帧 MD5,去重完全失效。 3. **实际代价**:一小时课程按 5s 采样产生 720 帧 → 拼图后全部送入多模态模型。图片 token 是视觉理解的主要成本,其中大量是无效重复帧。 ## 建议 用 ffmpeg 自带的场景切换检测优先按**镜头切点**采样: ```bash ffmpeg -i input -vf "select='gt(scene,0.3)',metadata=print:file=-" -an -sn -dn -f null - ``` - 检测到切点 → 按切点时间戳抽帧(始终包含首帧;带最小间隔防抖动连切;保留 `max_frames` 上限) - 检测失败 / 未检出切换(纯静止视频)→ **回退现有固定间隔逻辑,行为完全兼容** - 实现集中在 `video_reader.py`,几十行;不触碰拼图、导出等下游逻辑 ## 收益 - **成本**:拼图数量显著下降,多模态 API 图片 token 开销降低(帧数通常可少一个数量级) - **质量**:切点采样不会漏掉短镜头/翻页,固定间隔会 - **兼容**:静态全屏 PPT 视频在无切点时自动回退原行为 我可以提交实现 + 单元测试的 PR。
Activity