録画とストレージ

SkyView はデフォルトでローカルにセグメント録画を行い、任意で 115 クラウドをマウントしてクラウドバックアップにできます。本章では録画の仕組み、保持ポリシー、115 連携について説明します。

録画の書き込み方式

SkyView は各カメラの映像を時間で区切り、標準的な 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
    ...
セグメント録画により、再生時に任意の時刻へ正確にシークできます。あるセグメントが壊れても(停電、ネットワーク瞬断など)失われるのは最大 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 ...

保持ポリシーとディスク容量

SkyView は最初からこれを管理しています。スイッチを入れる必要はありません:録画に総容量の予算を与え、いっぱいになると最も古いものを新しいもので置き換えます(NVR と同じリングバッファ)。さらに、ディスク全体で計算するディスク保護が最後の砦として働き、満杯を防ぎます。

  • 録画の総容量 —— SkyView の録画が使えるローカル容量の上限。いっぱいになると最も古いものから自動削除します。0 = 無制限。
  • 最大ディスク使用率(%) —— ディスク全体がこの割合を超えると、最も古い録画から削除して戻します。共有ディスクが他のアプリで埋まる場合への備えです。
  • N 日で削除(任意) —— 任意で、既定はオフ。日数を入れると「N 日を過ぎたら必ず削除」になります。プライバシー / コンプライアンス要件のための項目です。
解像度ビットレート1 系統・1 日あたりの目安
1080p H.2642 Mbps約 21 GB
1080p H.2651 Mbps約 10 GB
4K H.2654 Mbps約 42 GB

設定の仕方と、手動での片づけ方

総容量をいくつにするか、ディスクが満杯のときどうするか、孤立録画と無効な録画の片づけ方——手順は〈保持とディスク容量〉にまとめています。

ローカルの録画を非同期で 115 クラウドへアップロードし、いわば"クラウド NVR"のように機能します。インスタントアップロードに対応しているため、既存の録画は帯域を消費しません。

  1. 1

    QR コードでログイン

    Web 管理画面 → 115 → QR コードを表示し、115 のモバイル App でスキャンして認可します。SkyView はログイン情報を暗号化して data ディレクトリに保存します。

  2. 2

    アップロード先フォルダを選択

    115 内に空のフォルダを作成し(例:"SkyView 録画")、SkyView に戻ってこのフォルダをアップロード先として選択します

  3. 3

    ストレージバックエンドを切り替え

    設定 → ストレージ → 115 を選択 → 保存。切り替えはホットスワップで、プロセスの再起動は不要、次回のアップロードから有効になります

  4. 4

    動作確認

    Web Admin には現時点でアップロードキュー / 進捗パネルがありません。録画がアップロードされているか確認するには、次の 3 つの方法のいずれかを使ってください:① 設定 → 115 ページで VIP ステータスと残り容量が正常か確認する;② ログページ(サイドバー → ログ)で左側から uploader サービスを選択すると、各セグメントのアップロードの開始 / 完了 / 失敗の行をリアルタイムで確認できる;③ 115 の App またはウェブサイトを直接開いて目的のフォルダに入り、新しい録画が届いているか確認する。

115 のログインは期限切れになります

おおよそ 30 日ごとに QR コードを再スキャンする必要があります。期限切れになると SkyView がプッシュ通知を送るので、速やかに再スキャンしてください。その間も録画はローカルへの書き込みを継続し、失われることはありません。

115 を利用していない場合は

現時点ではローカルと 115 の 2 種類のバックエンドのみに対応しています。今後 Aliyun Drive / S3 なども対応予定です。特定のクラウドストレージへの要望があれば、チケットで優先度をお知らせください。

ダウンロード / エクスポート

録画再生ページは「時間範囲を指定してエクスポート」に対応しています——開始・終了時刻を選択すると、バックエンドが再エンコードして 1 本の MP4 に切り出し、クライアントがダウンロードできるようにします。開始・終了時刻はフレーム単位の精度です(誤差 <40ms)。ハードウェアを自動選択:NVIDIA NVENC(実時間の 50〜200 倍、RTX なら 1 時間分が数十秒)→ Intel iGPU VAAPI(25〜50 倍、N100 なら 1 時間分が 1〜2 分)→ libx264 ソフトウェアエンコード(1.5〜3 倍、1 時間分が十数分)の順に試し、いずれかが失敗すると自動的に次の段階へフォールバックします。Web Admin、Android、iOS の三端末すべてに対応しています。

  1. 1

    録画再生ページを開く

    エクスポートしたいカメラと日付を選択します。タイムラインを目的の区間付近までドラッグし、中心の目盛りがその録画区間に来るようにします。

  2. 2

    エクスポートボタンをタップ

    Web Admin:再生コントロールバー右端の ⬇ アイコン;Android / iOS:再生コントロールバーの「速度」ボタン右側にある「エクスポート」。区間選択パネルがポップアップし、デフォルトでは現在の再生位置の ±30 秒が指定されます。

  3. 3

    開始・終了時刻を調整 → 送信

    パネル内で開始・終了時刻を変更すると、予想サイズがリアルタイムで計算されます(1080p H.264 で約 250 KB/秒)。1 回のエクスポートは最長 1 時間で、それを超えると拒否されます。「エクスポート開始」をクリックします。

  4. 4

    進捗を確認

    右下(Web)/ コントロールバー下部(Android/iOS)に進捗カードが表示されます。Web は SSE でリアルタイム更新、モバイルは 2 秒間隔のポーリングです。タスクがキューに入ると、通常は数秒から数十秒で完了します(セグメント数や、115 からクラウドセグメントを取得する必要があるかによって変わります)。

  5. 5

    ダウンロード

    進捗カードが「ダウンロード」ボタンに変わったらクリックします:Web はブラウザから直接ダウンロード;Android はシステムの DownloadManager で Downloads/SkyView/ に保存し、ステータスバーに通知が表示されます;iOS では ShareSheet が開き、「ファイル / 写真に保存」または WeChat への共有を選べます。

ハードウェアアクセラレーションの自動選択 NVENC > VAAPI > libx264

プロセス起動時に自動検出され、速度が速い順に優先されます: - NVENC(NVIDIA ディスクリート GPU):cuda イメージバリアント + --gpus all が必要。RTX 30/40 シリーズなら 1 時間分の動画が約 30-60 秒 - VAAPI(Intel/AMD 内蔵 GPU):openvino/all-in-one イメージ + /dev/dri のパススルーが必要。N100 などで 1 時間分の動画が約 1-2 分 - libx264(CPU のみ):GPU がない場合のフォールバック。1 時間分の動画が約 20-40 分(CPU 性能による) いずれかの段階が実行時に失敗した場合(ドライバの非互換、セッション上限超過など)、自動的に次の段階にフォールバックします。特定の方式を手動で強制するには recording.export.hwaccel = "nvenc" / "vaapi" / "none" を使用します。

開始・終了時刻はフレーム単位の精度

3 つのエンコード経路(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 時間分のクラウドセグメントの取得には数分かかることがあります。その間は他の作業をしていても構いません。エクスポートタスクはサーバー側で独立して実行されるため、アプリを閉じても影響しません。

エクスポートファイルは 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 です。JWT を付けて GET /api/recordings/<id>/download を呼び出せば、単一セグメントを取得することもできます。

このページは役に立ちましたか?