跳至主要內容

審查連續錄影

FishTube 以多個可獨立驗證的小型雲端物件,組成一條虛擬連續時間軸。Edge 可以維持既有的短片段 進行本地 AI 推論;雲端上傳排程則把完成的來源片段組成兩分鐘 chunk。每個 chunk 會記錄:

  • recordingSessionId:一次不中斷的攝影機錄影 session;
  • sequenceNumber:該 session 內的遞增順序;
  • discontinuitySequence:攝影機或錄影程序中斷後變更的計數;
  • sourceSegmentIds:組成雲端物件的本地來源片段;
  • durationMs:實際量測的物件長度。
  • recordingOrigin=continuous 與 segmentRole=review_archive:明確區分兩分鐘完整錄影與操作員 手動上傳原檔。

Edge 的 raw video 同步預設關閉。只部署 API 或基礎設施不會開啟上傳,也不會自行增加船上的網路流量。

S3 與 FishTube 確認兩分鐘 chunk 後,Edge 只會刪除設定儲存磁碟中 archives 目錄下的衍生 暫存檔,並保留可供冪等復原的持久上傳收據;原始來源片段仍依一般保留政策處理。只有影片上傳與 AI 推論都完成後,來源片段才可被保留清理選取;若 AI 已由政策明確停用並標記為 skipped 則除外。 設備重啟後也能安全地接續此清理工作。

影片與 AI 結果刻意分開上傳。影片不會被推論延遲、模型失敗或 AI 重試阻塞,可先提供檢視。Edge 之後會送出零或多筆不可變更事件,再送出來源片段與 revision 的分析完成標記;FishTube 會把結果 關聯到已可播放的錄影。

審查日期範圍​

呼叫 GET /observer/review-timeline,並提供 vesselId、cameraId、startAt 與 endAt。 範圍必須大於零且不得超過 30 天。回應包含依序可播放的 chunks、明確的 gaps、標準化 aiEvents、每個 chunk 的 AI 覆蓋率、頁面分析 watermark 與不透明的 nextCursor。

Web 會依序播放 chunk,並顯示涵蓋整個選取範圍的總覽,其中分別標示已載入影片、已知缺口、 標準 AI 事件與目前播放位置。點選尚未載入的時間點時,只會從該點開始取得受限制的一頁資料, 不會預先下載 30 天內的所有簽名影片,也不會把一天或三十天的影片重新串接成另一個 S3 物件。

兩分鐘邊界只用於儲存與重試,不是觀察員的操作邊界。主要播放器會預載下一段,在換段時保留 播放/暫停狀態與 1×、2× 或 4× 倍速,主要進度列也會持續對應選取的 Trip 範圍而不會歸零。 缺片或錄影設備關機的區間會顯示為 gap,播放會自動前往下一段可用影片。「下一個 AI 事件」與 「下一個未檢視片段」也會跨越時間軸分頁繼續搜尋。

AI 尚未完成的錄影仍可播放。每個已載入 chunk 會顯示 pending、partial 或 completed,以及 已完成與總來源片段數。範圍列會以不同樣式標示等待中或部分完成,狀態提示則顯示目前 AI 落後 時間;觀察員可先進行人工標記,事件軌會在 AI 結果被接受後逐步補上。

來源片段在完整 chunk 尚未完成前,可能先透過事件短片出現在審查清單;chunk 完成並宣告該來源 識別碼後,FishTube 會隱藏已涵蓋的來源列,並只在 chunk 上呈現一次事件。觀察員標記仍指向單一 segmentId 與 timestampSeconds,同時保存換算後的絕對時間 observedAt,因此虛擬播放不會 改變來源時間軸上的標記位置。

手動原檔仍可透過自己的 review session 識別碼直接查看,但一至三十天的連續時間軸會排除 recordingOrigin=manual_upload。AI 事件短片與縮圖是透過來源片段識別碼附加的獨立證據媒體, 不會被計算成額外的完整錄影。

完成人工檢視​

觀察員可以新增或修正事件標記,也可以明確標示某段影片已檢視且沒有事件。 PUT /observer/review-sessions/:segmentId/review 會保存後者,不會建立假的中魚事件。時間軸會 區分 unreviewed、reviewed_no_event 與 reviewed_with_events。

檢視工作區會以分鐘顯示整個 Trip 的 AI 已分析、AI 待分析、人工已檢視與人工待檢視覆蓋率。 只有選取範圍內每一段連續 review archive 都有人工標記或無事件確認時, POST /observer/trip-reviews/complete 才會成功。如此即可留下「整段無事件」的稽核紀錄,且不會 改變事件數量。

手動上傳影片預設是補充證據。它仍可直接檢視,但不計入連續錄影完整度或預設 Trip 報告。若要 納入 Trip,必須透過獨立且明確的加入流程;檔名或上傳時間不會自動代表納入。

Chunk 邊界上的事件​

所有已接受的 AI 證據列皆維持不可變更。跨邊界的相關片段共用 canonicalEventId;標準資料列為 active,重複證據則標記為 superseded,並透過 supersededBy 指向標準事件。

時間軸與通知只呈現每個標準事件的一個代表。Analysis eventCount 仍用於驗證 Edge analysis revision 產生的不可變更資料列數量,並不是正式漁獲數量;正式標記與報告仍需由人工審查確認。