feat: 新增视频分析流水线、Web界面、孤儿清理工具;修复健壮性问题
- 新增 analysis/ 模块:MOG2活动检测、YOLO人物跟踪、MediaPipe摔倒检测、Ollama活动打标、缩略图抽取 - 新增 webapp/:Flask事件浏览界面,按需HEVC→H264转码缓存 - 新增 analyze.py:7阶段状态机流水线(scan→backfill→motion→person→fall→activity→thumbnail) - 新增 cleanup_orphans.py:清理文件已删除的数据库孤儿记录 - 修复:motion/person/activity三阶段加单视频异常兜底,避免批次中断 - 修复:ollama_client加健康检查和3次重试,num_ctx从8192降到2048 - 修复:transcode_cache加fcntl文件锁,防止并发转码同一视频 - 修复:SQLite开WAL模式+busy_timeout,支持读写并发 - 修复:sync.py ffmpeg路径改为shutil.which查找,删除automate.py死代码PYTHON - 修复:thumbnail失败加3次重试上限,避免无限重试损坏文件 - 新增:requirements.lock锁定版本、README文档 - 更新:.gitignore排除.playwright-mcp、截图、备份文件
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
"""把 OSD 时间戳水印识别出的精确到秒的时间,回填到 videos.start_time。
|
||||
|
||||
video_scanner 登记时 start_time 只精确到"天"(因为文件名时间戳是下载时刻而非
|
||||
录制时刻)。这里用 timestamp_reader 重新读取每个视频首帧的画面水印,识别成功
|
||||
则覆盖为精确到秒的时间;识别失败(分辨率未标定/置信度不足)则保留原有粗粒度
|
||||
值不动,不强行覆盖成错误数据。
|
||||
"""
|
||||
from analysis.config import PROJECT_ROOT
|
||||
from analysis.db import get_all_videos, update_start_time
|
||||
from analysis.timestamp_reader import read_timestamp
|
||||
|
||||
|
||||
# 720p 方案实测通过率仅约19%(模板库覆盖的时段太窄,泛化差),投入产出比太低,
|
||||
# 暂不处理,720p视频保留 video_scanner 登记时"只精确到天"的粗粒度 start_time。
|
||||
BACKFILL_RESOLUTIONS = {(2560, 1440)}
|
||||
|
||||
|
||||
def process_all(limit=None):
|
||||
videos = [
|
||||
v for v in get_all_videos()
|
||||
if v["status"] != "corrupt" and (v["width"], v["height"]) in BACKFILL_RESOLUTIONS
|
||||
]
|
||||
if limit:
|
||||
videos = videos[:limit]
|
||||
|
||||
updated = 0
|
||||
fallback = 0
|
||||
for video in videos:
|
||||
file_path = PROJECT_ROOT / video["file_path"]
|
||||
precise_start_time = read_timestamp(file_path, capture_date=video["capture_date"])
|
||||
if precise_start_time is None:
|
||||
fallback += 1
|
||||
continue
|
||||
update_start_time(video["id"], precise_start_time)
|
||||
updated += 1
|
||||
|
||||
return {"total": len(videos), "updated": updated, "fallback": fallback}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
|
||||
limit = int(sys.argv[1]) if len(sys.argv) > 1 else None
|
||||
print("===== 开始回填精确时间戳 =====")
|
||||
result = process_all(limit=limit)
|
||||
print(f"→ 共处理 {result['total']} 条,成功回填 {result['updated']} 条,"
|
||||
f"识别失败保留粗粒度值 {result['fallback']} 条")
|
||||
print("===== 回填完成 =====")
|
||||
Reference in New Issue
Block a user