"""把 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("===== 回填完成 =====")