diff --git a/PROGRESS.md b/PROGRESS.md index 1e5d2f8..d88c87f 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -1,6 +1,6 @@ # 项目进度追踪 -> 最后更新: 2026-08-20 17:45 +> 最后更新: 2026-08-20 18:05 ## 服务运行状态 @@ -161,6 +161,20 @@ 19. **chunk_size 变更防护** - Edge 端 upload_chunk 检测 total_chunks 变更(由 chunk_size 变化导致),自动清理旧分块防止混合不同大小分块导致 assemble 后文件损坏。NAS 端 _query_uploaded_chunks 比对 expected_total != edge_total 时跳过断点续传 20. **看门狗机制** - app.py 启动 daemon 看门狗线程,每 60s 检查 scheduler/dispatcher/poller 线程 is_alive(),崩溃自动 check_and_restart()。/api/status 改用 thread.is_alive() 替代 _running 标志,防止线程假死误报 +## 视频时间语义修正 (2026-08-20 18:05, commit 80b2fcc) + +时区统一的延伸排查发现三处**时间语义** bug(时区对了但语义错): + +| # | 位置 | 问题 | 修复 | +|---|------|------|------| +| 1 | NVIDIA 集锦偏移 | frame_timestamps 是绝对时间(`21:31:14`→当日 77474s)被直接当视频内偏移,seek 超出 30min 视频 → 0 帧 → 集锦恒空 → 视频模式永远降级逐帧 | `analyze_video` 增加 `event_start_time` 参数,偏移 = 帧时间 − 视频开始时间(跨午夜 +86400);orchestrator 透传;ffprobe 时长过滤超界片段;fps=15 统一 CFR | +| 2 | NAS dispatcher | `event_start_time` 用文件 mtime(=录制**结束**时刻),事件整体后移一个视频周期(~30min) | 新增 `_probe_duration`(ffmpeg 解析 Duration,NAS 无独立 ffprobe),start = mtime − duration | +| 3 | 直传超时 | 压缩后 ~19MB 低于 20MB 阈值走直传,`timeout(10,120)` 在 1Mbps 下传 19MB 需 ~152s 必超时(task 42 三连败) | 加大到 `(10, 300)` | + +**两轮测试数据陷阱**:集锦 0KB/9.47s 异常均为测试时间戳超出视频时长(1801s > 1800s)所致,单输入与多输入 concat 行为本身正常——生产帧时间戳必在视频内,已加防护过滤。 + +**数据治理**:历史 FAILED 全量重置后 307 PENDING,其中 36 个源文件已被 NAS 清理 → 标记 FAILED('源文件已清理,跳过处理',failure_stage 枚举无 'dispatch' 用 'callback');271 个有效任务排队消化(~54h)。 + ## 时区统一北京时区 (2026-08-20 17:45, commit 795e8ac) **背景**: Oracle Edge 机器实际为 UTC 时区(非凤凰城 MST),NAS 与视频均为北京时间,网页要求统一北京时区。