Skip to content

【功能建议】视频理解抽帧支持场景检测智能采样(当前固定间隔 + 相邻 MD5 去重对真人出镜课程失效) #464

Open

Description

@TomRush-qn

现状

backend/app/utils/video_reader.py 的 extract_frames() 以固定间隔生成采样时间戳:

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 自带的场景切换检测优先按镜头切点采样:

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions