跳至主要內容

連續錄影資料模型

Recording session
├─ chunk 0 → source segments A, B
├─ chunk 1 → source segments C, D
└─ discontinuity
└─ new recording session → chunk 0

Canonical AI event
├─ active immutable evidence row
└─ superseded immutable boundary row

系統會先建立錄影 metadata,再上傳影片。既有的 idempotency key、檔案大小、SHA-256 摘要、S3 預簽上傳與完成驗證合約維持不變。完成的物件仍以 private 權限保存在 original/ namespace。

影片匯入與 AI 分析是兩條獨立的持久流程,透過 segmentId 與 analysisRevision 關聯:

來源片段 ─→ 錄影 metadata ─→ S3 影片 ─→ 影片完成確認
│
└────→ Edge 推論佇列 ─→ 零或多個 AI 事件 ─→ 分析完成確認

影片流程不會等待推論。即使四路攝影機推論落後數分鐘,兩分鐘影片仍可先播放。每個 revision 即使沒有找到事件,也會送出 analysis-complete,因此「零事件」不會與「尚未完成」混淆;兩條 流程的重試也都維持冪等。

錄影物件會帶有兩個明確的來源欄位。攝影機連續錄影的 recordingOrigin 是 continuous,操作員 選取檔案上傳則是 manual_upload;segmentRole 分為 source_chunk、review_archive 與 manual_original。S3 object metadata 也會保存這些值供維運辨識,但產品判斷以持久化的錄影 metadata 為準,不從 object key 或檔名猜測。

AI 事件儲存在 DynamoDB,並可依船舶、攝影機與絕對時間 eventAt 查詢。Segment revision 的事件數會包含每一筆不可變更的證據。審查端以 canonicalEventId 將相關資料分組,且不會把 superseded 資料列重複計算成另一個候選事件。

錄影 metadata 另存由伺服器維護的 analysisStatus 與 analysisCompletedAt。媒體 status=completed 只代表 S3 物件可用;analysisStatus=completed 才代表 FishTube 已接受 對應的 AI 分析完成標記,兩者不可互相推論。

人工檢視完成狀態同樣獨立。Review archive 可以含有觀察員事件標記、明確的無事件確認,或維持 未檢視。確認資料使用固定識別碼,並存放在既有的 observer-review DynamoDB table family,因此 重試不會建立重複決策。報告進度以 review archive 的分鐘數計算,而 AI 證據仍連結到底層來源片段。