Skip to content

feat(backend): 视频理解支持场景检测智能抽帧 - #465

Open
TomRush-qn wants to merge 1 commit into
JefferyHcool:masterfrom
TomRush-qn:feature/smart-frame-sampling
Open

TomRush-qn wants to merge 1 commit into
JefferyHcool:masterfrom
TomRush-qn:feature/smart-frame-sampling

Conversation

@TomRush-qn

Copy link
Copy Markdown

Closes #464

改动内容

backend/app/utils/video_reader.py(约 60 行)+ 新增单测,不触碰拼图、导出等下游逻辑:

  • _detect_scene_cuts():用 ffmpeg select='gt(scene,threshold)' + metadata=print:file=- 检测场景切点,把 pts_time 解析为整秒时间戳;ffmpeg 失败/超时返回空列表
  • _plan_scene_timestamps():切点 → 抽帧计划,始终包含首帧、相邻采样点最小间隔 max(1, frame_interval // 2) 防抖、保留 max_frames 上限、丢弃超出时长的切点
  • extract_frames():smart_sampling=True(默认)且检出切点时按切点抽帧;未检出切换(纯静止视频)或检测失败时回退原固定间隔逻辑
  • 构造函数新增可选参数 smart_sampling / scene_threshold,默认行为变化仅作用于视频理解抽帧路径,smart_sampling=False 可完全还原旧行为

为什么默认开启

固定间隔 + 相邻 MD5 精确去重只对"整帧逐字节相同"的全静止画面有效;最常见的"PPT + 讲师头像"课程形态下人物微动即导致去重失效,一小时 5s 采样会产生 720 帧全部送入多模态模型。切点采样以更少帧数覆盖更多有效信息,显著降低图片 token 成本。回退逻辑保证纯静止视频与 ffmpeg 异常时的兼容性。如维护者倾向保守,可将默认值改为 False 并在后续版本由前端暴露开关——改动仅一处构造参数。

测试

  • 新增 backend/tests/test_video_reader_smart_sampling.py(8 个用例,沿用 test_video_reader_dedupe.py 的 stub 模式):pts_time 解析、ffmpeg 失败返回空、采样计划(首帧/最小间隔/max_frames 上限/越界切点)、按切点抽帧、无切点回退固定间隔、关闭开关时检测不执行
  • 回归:test_video_reader_dedupe.py 通过
  • 本地真实 ffmpeg 9.0.2(macOS arm64)冒烟:24s 三色合成视频(理论切点 8s/16s),检出 [8, 16] ✅
  • python -m unittest tests.test_video_reader_smart_sampling tests.test_video_reader_dedupe → OK (9 tests)

抽帧计划优先使用 ffmpeg 场景切换检测(select='gt(scene,t)')按镜头
切点采样,替代固定间隔盲采:

- 始终包含首帧;相邻采样点带最小间隔(frame_interval/2)防抖;
  保留 max_frames 上限
- 检测失败或未检出切换(纯静止视频)时回退原固定间隔逻辑,行为
  完全兼容;smart_sampling=False 可显式关闭
- 新增单测覆盖 pts_time 解析、采样计划边界、场景采样/无切点回退/
  关闭开关三条路径,并通过真实 ffmpeg 对 24s 合成视频验证切点检出

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant