Repository navigation
v5.7.0 — 无变化视频帧长图证据(可缩放+时间戳+AI查询)
🎯 核心痛点修复:无变化视频零证据
监控批量分析里 motion_detector 判定"无变化"的视频直接跳过 AI,用户拿到 0 命中但看不到任何画面,无法核对算法是否漏判、无法定位"这一刻到底有没有人经过"——伪证据盲区。
v5.7.0 修复:全视频(无变化+有变化+命中)都把 1fps 抽帧落盘到 frames/<run_id>/,拼成带 MM:SS 时间戳标注的长图 strip.png,20 张/行横向铺满换行,可滚轮缩放 + 拖动平移 + 单帧原图查看 + 跳转播放器定位 + AI 查询时间点。
🔧 改动
新增
src/core/frame_strip.py— 纯 Pillow 拼接器,FrameStripBuilder.build(frame_dir, out_path, cols=20):扫帧→缩略 160px→底部画 MM:SS 黑底白字→20 列网格 PNG。零 AI 调用,毫秒级。src/ui/frame_strip_dialog.py—FrameStripDialog:QGraphicsView + QGraphicsPixmapItem展示长图,滚轮缩放(10%–800%)+ScrollHandDrag拖动 + "适合窗口"重置 + "询问 AI 这一帧"(时间点复制剪贴板 + 跳转播放器)+ "打开帧目录"。tests/test_frame_strip.py— 4 单测:网格尺寸/空目录/时间排序/MM:SS 格式。
修改
motion_detector.py—MotionConfig.frame_out_dir帧持久化(空配置零回归)。batch_runner.py—_build_filmstrip全视频生成长图,clean_segments只清 segments。run_store.py—runs表加strip_path列(旧库自动迁移)。batch_tab.py—_RunDetailDialog加查看帧长图按钮 +strip_seek_requested信号。main_window.py—_on_strip_seek_request打开/复用播放器定位 ts。agent_dialog.py— 补齐append_thoughts(v5.6 误调用导致启动崩溃修复)。
🧪 验证(真实证据)
- pyflakes:7 个改/新文件零告警 ✅
- 单测
test_frame_strip:4 passed ✅ - 回归
test_agent_tools + test_core_pipeline:17 passed ✅ - 真实 E2E(
_376.mp4无变化 17.7min):detect 190s → 1065 帧落盘 →strip.png3242×6158(54 行×20 列)生成成功 ✅
📦 安装/升级
无新依赖(Pillow 已声明 pillow>=11.3,<12)。旧 runs.db 自动迁移补 strip_path 列。
完整 changelog:见 CHANGELOG.md