錄影與儲存

雲瞰 預設採本機分段錄影,可選擇掛載 115 雲端做雲端備份。本章說明錄影機制、保留策略,以及 115 接入方式。

錄影怎麼寫入

雲瞰 把每路攝影機的影像依時間切成一段段標準 MP4 檔案,每段固定 60 秒。每段寫完就是一個可以直接播放的完整檔案,進度條能立刻拖動,不需要等待任何轉檔。寫入路徑:

text
data/recordings/
  <camera_id>/
    2026-05-18_14-30-00.mp4
    2026-05-18_14-31-00.mp4
    2026-05-18_14-32-00.mp4
    ...
分段錄影讓回放能精確 seek 到任意時間點。如果某一段損毀(斷電、網路抖動),最多遺失 60 秒,相鄰的段不受影響。檔名裡的時間戳記就是該段的起始時刻(本機時區)。

歸檔後的路徑

本機儲存模式下,每段錄影入庫並標上 archived 狀態後,會被原子 rename 到 data/recordings/_archive/<camera_id>/ 下,目錄結構和檔名完全鏡像,方便和正在寫入的 inbox 區分開來。_archive/ 前綴是慣例,uploader 的 discovery 掃描會跳過它,避免歸檔檔案被重複處理。115 雲端模式下,本機是否保留由 delete_after_upload 設定決定(預設上傳成功即刪除)。

本機儲存路徑

錄影寫在 /app/data/recordings(巢狀掛載,可單獨指到大硬碟 / NAS),資料庫 / cookies / 日誌等小型狀態放在 /app/data,AI 模型已內建在映像檔裡、不會落在資料目錄。正式環境部署務必把錄影目錄指到容量充足的大硬碟,不要跟系統硬碟擠在同一個分割區——錄影寫滿會讓你的伺服器開不了機。

bash
# 建議:錄影單獨掛一塊大硬碟 / NAS(小型狀態留在 data/)
sudo mkdir -p /mnt/recordings
# 一鍵腳本:--recordings-dir 指到大硬碟
curl -fsSL https://cdn.yun-kan.com/yunkan-install.sh | bash -s -- --recordings-dir /mnt/recordings
# 或在手動 docker run 時巢狀掛載錄影磁碟區
docker run -v $(pwd)/data:/app/data -v /mnt/recordings:/app/data/recordings ...

保留策略與磁碟空間

雲瞰預設就在管這件事,不需要你去打開任何開關:給錄影一個總配額,錄滿了拿最舊的換新的(像 NVR 一樣環形覆蓋);另有一道依整顆磁碟計算的磁碟保護當最後一道防線,防止磁碟被寫滿。

  • 錄影總配額 —— 雲瞰的錄影最多佔多少本機空間,佔滿後自動刪最舊的。0 = 不限。
  • 磁碟使用率閾值 —— 整顆磁碟超過這個百分比時從最舊的錄影刪起,直到降回來。防的是共用磁碟被別的應用佔滿。
  • 依天保留 —— 選填,預設關。填了天數就是「超過 N 天一律刪」,給隱私 / 法規需求用。
解析度位元率一路一天大約佔
1080p H.2642 Mbps約 21 GB
1080p H.2651 Mbps約 10 GB
4K H.2654 Mbps約 42 GB

怎麼設、怎麼手動清

配額填多少、磁碟滿了怎麼辦、孤兒錄影和失效錄影怎麼清——手把手在〈保留與磁碟配額〉。

把本機錄影非同步上傳到 115 雲端,相當於「雲端 NVR」。在秒傳支援下,已存在的錄影不耗頻寬。

  1. 1

    掃碼登入

    網頁後台 → 115 → 顯示 QR Code,用 115 手機 App 掃碼授權。雲瞰 會把登入資訊加密儲存到 data 目錄裡。

  2. 2

    選擇目標資料夾

    在 115 裡建立一個空資料夾(例如「雲瞰錄影」),回到 雲瞰 選這個資料夾作為上傳目的地

  3. 3

    切換儲存後端

    設定 → 儲存 → 選 115 → 儲存。切換是熱切換,不重啟行程,下一次上傳就會生效

  4. 4

    驗證是否生效

    Web Admin 目前沒有上傳佇列 / 進度面板。要確認錄影是否正在上傳,可任選以下三種方式:① 在 設定 → 115 頁面查看 VIP 狀態、剩餘容量是否正常;② 日誌頁(側欄 → 日誌)左側選 uploader 服務,即可即時看到每段上傳的開始 / 完成 / 失敗記錄;③ 直接開啟 115 App 或網頁,進入目標資料夾,看新錄影有沒有進來。

115 登入會過期

大約 30 天左右需要重新掃碼。失效時 雲瞰 會發送推播通知,及時重新掃碼即可,期間錄影會持續寫入本機,不會遺失。

不是 115 使用者怎麼辦

目前只支援本機 + 115 兩種後端。後續會接入阿里雲盤 / S3 等,如有特定雲端硬碟需求,可以發工單告知優先順序。

下載 / 匯出

回放頁支援「按時間區間匯出」——選定起訖時間,後端重新編碼並裁切成單一 MP4 供用戶端下載,起訖時間達到影格級精度(<40ms 誤差)。自動選擇硬體:NVIDIA NVENC(50-200x 即時,RTX 幾十秒/小時)→ Intel iGPU VAAPI(25-50x,N100 一兩分鐘/小時)→ libx264 軟體編碼(1.5-3x,十幾分鐘/小時)。任一層失敗會自動降級到下一層。Web Admin、Android、iOS 三端都支援。

  1. 1

    進入回放頁

    選擇要匯出的攝影機和日期。把時間軸拖到目標區間附近,讓中心刻度落在那一段錄影上。

  2. 2

    點選匯出按鈕

    Web Admin:播放控制列最右邊的 ⬇ 圖示;Android / iOS:播放控制列「速度」按鈕右側的「匯出」。會彈出區間選擇面板,預設為目前播放位置 ±30 秒。

  3. 3

    調整起訖時間 → 送出

    在面板裡修改起訖時間,會即時算出預估大小(1080p H.264 約 250 KB/s)。單次最長 1 小時,超過會被拒絕。點「開始匯出」。

  4. 4

    查看進度

    右下角(Web)/ 控制列下方(Android/iOS)會出現進度卡片。Web 走 SSE 即時刷新,行動端走 2 秒輪詢。任務一旦排上號,通常幾秒到幾十秒就能完成(取決於段數 + 是否需要從 115 拉取雲端段)。

  5. 5

    下載

    進度卡片變成「下載」按鈕後點它:Web 直接透過瀏覽器下載;Android 走系統 DownloadManager 儲存到 Downloads/SkyView/,狀態列會有通知;iOS 會彈出 ShareSheet 讓你選擇「存到 Files / Photos」或分享到微信。

自動選擇硬體加速 NVENC > VAAPI > libx264

行程啟動時自動偵測,依速度由快到慢排優先順序: - NVENC(NVIDIA 獨顯):需要 cuda 映像檔變體 + --gpus all,RTX 30/40 系列 1 小時影片 ~30-60 秒 - VAAPI(Intel/AMD 內顯):需要 openvino/all-in-one 映像檔 + 透傳 /dev/dri,N100 等 1 小時影片 ~1-2 分鐘 - libx264(純 CPU):沒有 GPU 時的備援方案,1 小時影片 ~20-40 分鐘(取決於 CPU) 任何一層在執行期失敗(驅動程式不相容、session 上限等)會自動降級到下一層。想手動強制走某一種,設定 recording.export.hwaccel = "nvenc" / "vaapi" / "none"。

起訖時間為影格級精度

三條編碼路徑(NVENC / VAAPI / libx264)的起訖時間都精確到影格(<40ms)。品質參數已對齊:NVENC qp=23 / VAAPI qp=23 / libx264 crf=23——跨硬體輸出在視覺上基本一致(NVENC 檔案可能略大 <10%)。設定 recording.export.{nvenc,vaapi}_qp 可單獨調整品質(0-51,數字越小品質越高)。

115 雲端儲存模式也支援

如果錄影存放在 115 上,後端會先把區間內每段從 115 以串流方式拉到伺服器暫存目錄再拼接,完成後清除暫存檔案。受 115 限速影響,1 小時的雲端段可能要等上幾分鐘,這段時間可以先去做別的事——匯出任務在伺服端獨立執行,關閉 App 也不受影響。

匯出檔案保留 24 小時

拼接完成的 MP4 存放在伺服器 data/recordings/_exports/<job_id>.mp4,預設 24 小時後會被 cleanup 自動刪除(避免佔滿磁碟)。在這段時間內,任何時間 / 任何裝置都可以重複點「下載」取得同一份檔案。超時之後若還需要,就重新發起一次。

想繞過 UI 直接取得原始段

原始的 60 秒段位於 data/recordings/<camera_id>/<YYYY-MM-DD_HH-MM-SS>.mp4(本機歸檔後會在 data/recordings/_archive/<camera_id>/ 下),每段都是標準 MP4。也可以用 GET /api/recordings/<id>/download 帶上 JWT 取得單一段。

這篇文件有幫助嗎?