VibeNVR:クラウドも苦労もないローカル動画監視の立て方
自作サーバーでホームビデオ監視を設定しようとしたことがある人なら、この的痛苦を経験しているはずです。昔ながらのZoneMinderは90年代後半の遺物のようです。Shinobiは定期的にメモリリークを起こします。Frigateはクールでパフォーマンスも高いですが、カメラを1台追加するだけで何百行ものYAML設定を編集するのはすぐに面倒になります。TuyaやXiaomiのようなクラウドソリューションはさらに悪く、アーカイブ保存のサブスクリプション料金とインターネット障害時の録画消失リスクは、愛好家にとってほとんど魅力がありません。
最近VibeNVRという興味深いプロジェクトを見つけました。Dockerでパッケージ化されたモジュラー型のローカルNVRで、ユーザーフレンドリーなインターフェースと適切なリソース使用量のバランスを取るように設計されています。
内部構造
アーキテクチャは4つのマイクロサービスに明確に分かれています:
- フロントエンド:ReactとViteで構築されたSPA。クリーンなインターフェースとモバイルサポートを特徴とします。
- バックエンド:FastAPIサービス。認証、トークン発行、監査ログ、セキュアクッキー経由のメディアストリーミングを処理します。
- VibeEngine:カスタムPython動画処理エンジン。PyAVとFFmpegでRTSPストリームを取り込み、OpenCVで動体検知、TensorFlow LiteまたはYOLOv8で物体認識を行います。
- データベース:イベント、ログ、カメラ設定を保存する標準的なPostgreSQL。
開発者はREADMEでこれはvibe codingプロジェクトだと正直に書いていますが、コードベースは整理されており、機能的には практическиすべての日常的なニーズをカバーしています。
このプロジェクトが実践的に興味深い点
3段階の低遅延ストリーミング
ほとんどのWeb監視インターフェースは、重いMJPEGを提供するか、HLSバッファリングのために数秒待つことを強います。ここでは、アダプティブ切り替えを採用しています:
- WebCodecs(WebSocket + H.264)。HTTPS経由またはlocalhostでの作業時のプライマリーモード。ビデオはブラウザのハードウェアで直接デコードされ、200ミリ秒未満の遅延。
- MSE(JMuxer経由)。SSL証明書なしで直接ローカルIPアドレスでパネルを開いた場合、Media Source Extensionsに切り替え。遅延は約1.5秒に増加しますが、30fpsで画像はスムーズに保たれます。
- MJPEGポーリング。レガシーブラウザーまたはパケット損失が深刻なチャンネルのフォールバックオプション。
再エンコードなしの録画
カメラがすでにH.264またはH.265でストリーミングしている場合、サーバーCPUで再エンコードする意味はありません。VibeNVRエンジンは、着信RTSPストリームを直接ディスクにダンプできます(Direct Stream Copy)。これにより、ホームマイクロサーバーやNASのCPUはほとんどアイドル状態のままになります。
同時に、2つのストリームでの同時動作をサポートしています。監視グリッドには軽量な低解像度サブストリームが表示され、アーカイブは最高品質でメインストリームを記録します。
柔軟な検知とニューラルネットワーク
動体処理は、既存のハードウェア用に設定できます。3つのオプションがあります:
- フレーム内のピクセル変化に基づく классическая OpenCV。除外マスクを設定可能。
- ONVIF Edge。カメラ自体が分析を実行し、サーバーに信号を送信。
- AI検出器YOLOv8またはMobileNet SSD v2。人、車両、動物のフィルタリング付き。
Google Coral Edge TPUアクセラレーターを接続すると、物体認識はほとんど瞬時に行われ、CPUを温めることはありません。設定にはマスタートグルがあり、AIを完全に無効にすると、重いモデルは単にRAMからアンロードされます。
インターフェースと統合機能
Webパネルには、モダンシステムのユーザーが期待するすべてが揃っています:認識されたオブジェクトタイプでフィルタリングできるイベントタイムライン、ONVIF経由のローカルネットワークでのカメラ検出、PTZカメラ制御、プライバシーゾーン設定。
| ログイン画面 | アーカイブ再生 |
|:---:|:---:|
|
|
|
| カメラグリッド | イベントタイムライン |
|:---:|:---:|
|
|
|
スマートホーム愛好家向けに、Home Assistant自動検出サポート付きの組み込みMQTTクライアントがあります。カメラステータス、動体検知イベント、認識されたオブジェクトラベルは、すぐにブローカートピックに公開されます。
| ネットワークスキャナー | カメラグループ |
|:---:|:---:|
|
|
|
デプロイ方法
スタックはDocker Compose経由で標準的な方法でデプロイされます。
まず、設定ファイルをダウンロードします:
git clone https://github.com/spupuz/VibeNVR.git
cd VibeNVR
環境ファイルをコピーし、強力なキーを設定します:
cp .env.example .env
.envファイルでは、セキュリティ上の理由から、アプリケーションが開始されないようにするには、SECRET_KEYとWEBHOOK_SECRETに少なくとも32文字の文字列を入力する必要があります。ここではハードウェアアクセラレーションタイプ(HW_ACCEL_TYPE=intel、nvidia、またはamd)を選択することもできます。
起動は1つのコマンドで行います:
docker compose -f docker-compose.prod.yml up -d
デフォルトでは、インターフェースはポート8080でアクセスできます。WebCodecsの適切な機能と最小限のビデオ遅延のために、開発者は(Nginx Proxy Managerなどの)リバースプロキシでサービスを保護し、SSL証明書を発行することを推奨しています。
| カメラ一般設定 | 動体検知設定 |
|:---:|:---:|
|
|
|
| システムパラメータ | 通知チャンネル |
|:---:|:---:|
|
|
|
NASとProxmoxへのインストール時の注意点
ドキュメントでは、Proxmoxカーネル(pve-kernel)、OpenMediaVault、Synology、QNAPシステムでのパーミッションに関する一般的な問題について具体的に触れています。AppArmorとseccompの制限により、PostgreSQLまたはバックエンドコンテナが終了コードPermissionError: [Errno 13]でクラッシュする可能性があります。
これは、docker-compose.ymlにセキュリティパラメータを追加することで修正できます:
security_opt:
- seccomp:unconfined
- apparmor:unconfined
最終手段として、privileged: trueを設定できますが、分離システムでは通常最初のオプションで十分です。
モバイルインターフェース
Webアプリはスマートフォンの画面に適応しています。個別のネイティブアプリは必要ありません:インターフェースはカメラグリッド、分析カード、タイムラインストリップを正しくスケールします。
| スマホダッシュボード | モバイルライブビュー | モバイルタイムライン |
|:---:|:---:|:---:|
|
|
|
|
このプロジェクトの対象者
VibeNVRは、過度なコストなしで2〜15台のIPカメラを接続する必要があるホームサーバーまたは小規模オフィスに最適です。Frigateのテキストファイルでストリームを手動設定するのが面倒で、便利なWebパネルと人間に優しい録画検索が必要な場合、このプロジェクトはぜひ試す価値があります。MITライセンスにより、実験の完全な自由があります。
ソースコードとセットアップ手順は、GitHub上のプロジェクトリポジトリで入手できます。
関連プロジェクト