シングルボードコンピュータでAgent DVRを動かしてNVRサーバにする 前編

シングルボードコンピュータでAgent DVRを使う 1

監視用IPカメラの映像を録画するネットワークビデオレコーダー(NVRサーバ)が欲しかったのだが、日本で普通に製品を購入すると数万円ほどかかるので手が出ない。そこで、中華の安物NVRボードを買ってみた。この中華NVRボードは2,500円(送料込み)という激安なものだが操作はかなり簡単でそれでいてド安定。お値段以上の価値はあると思った。ただし、搭載されているファームウエアのバリアント/ライセンスの問題で機能制限されているのか使い方を理解できていないだけなのかは不明だが、動体検知や顔認識が機能しない。動体検知が無いと24時間(または指定したスケジュールの時間帯)ずっと録画しっ放しになるのでディスク容量の消費が激しくなる。

中華NVRボードを購入する前に少し使ってみたノートPC + Windows + AgentDVRは機能的には満足できるものだったがWindowsのPC1台が常時稼働になる。NVRサーバは動画を処理し続けるので電気代がバカにならない。ノートPCを24時間ブン回しというのはできないというわけではないものの内蔵されている冷却ファンと虚弱な2.5インチハードディスクとバッテリーの劣化が心配。

以前、ADS-B受信用に使っていたOrange Pi Zero 2が空いた。ストレージのmicroSDカードがダメになってシングルボードコンピュータと一緒に別のもの(ROCK Pi S)にリプレイスしたので。
このOrange Pi Zero 2は2020年12月の発売直後に購入した時点では1GBメモリ版が約1,980円(送料約500円)、2022年12月末時点では実売価格3,280円(送料無料)なので3割ほど価格が上がっている。性能は高くないものの消費電力は低めで1GBメモリなのでいろいろ使い途もある。購入時はそれほど気に入ってなかったものの現在は個人的な評価は高め。
このOrange Pi Zero 2をNVRサーバに使用したい。OSは www.orangepi.org からDebian Imageをダウンロードし、microSDカードにイメージを焼きroot:orangepiでログインしただけの素の状態。(Orange Pi 3.0.6 Bullseye with Linux 5.16.17-sun50iw9)
ネットワークは有線LANでDHCPによる自動設定。

シングルボードコンピュータで使えるNVRサーバのソフトウエアの良いのが無いかと探そうとしたのだが、最近のシングルボードコンピュータは結構お高めだし電気も食うしアッチッチだし。ソフトウエアも定番のZoneMinderやShinobiは面白くなさそう。また、シングルボード用として提供されているのがラズパイ用というのも多いよう。
いつからかは知らないがAgentDVRのRaspberryPi向けがその他のシングルボードコンピュータでも利用できそうな造り(パッケージではなくビルドするタイプ)になっていたので試してみた。

Agent DVR / ffmpeg他のビルド

シングルボードコンピュータでAgent DVRを使う 2
ブラウザで https://www.ispyconnect.com/download.aspx を開き、ドロップダウンメニューで「Agent DVR - Linux/ macOS/ RPi」を選択して「Download」ボタンを押す。
ポップアップウィンドウが表示されるので「Run as a terminal」にかかれているコマンド(1行)をコピーしてターミナルで実行する。

# bash <(curl -s "https://raw.githubusercontent.com/ispysoftware/agent-install-scripts/main/v2/install.sh")
No default ffmpeg package option - build from source
Build ffmpeg v5 for Agent DVR (y/n)? y      y以外の選択肢はない筈
Yes
installing build tools
Get:1 http://mirrors.tuna.tsinghua.edu.cn/debian bullseye InRelease [116 kB]
Get:2 http://mirrors.tuna.tsinghua.edu.cn/debian bullseye-updates InRelease [44.1 kB]
Get:3 http://mirrors.tuna.tsinghua.edu.cn/debian bullseye-backports InRelease [49.0 kB]
以下、パッケージのインストールではなくビルドなので時間がかかるのと大量にメッセージが表示される

もう一つ、debuian/Ubuntu系のLinuxでcurlがシステムに入っていないなら先にインストールするように書かれている。ただし、curlが入っていないようなシステムだと他にもいろいろ足りなくてその後のビルドが上手くいかないかも。

メモリが豊富なPCのLinuxなどであれば上のコマンド1行を実行して暫く待てばインストールが完了してサービス起動まで行って貰える。
メモリの少ないシングルボードコンピュータではおそらくcmakeのビルドが永遠に終わらない。このcmakeは、パッケージなどで先にインストールしていてもビルドは行われてしまうみたい。つまりビルドが停まるので次の対処。

大容量の一時スワップの用意

メモリの少ないPCやシングルコンピュータでは先のコマンドを実行する前に8GBほどの大きさで一時的なスワップファイルを作成して利用可能にする。搭載メモリが8GB以下なら「搭載メモリ+スワップで8〜10GB程度」あれば良さそう。

# swapoff -a  現在のスワップを停止
# free -h     空きメモリの確認
               total        used        free      shared  buff/cache   available
Mem:           984Mi       379Mi        53Mi       0.0Ki       550Mi       515Mi
Swap:             0B          0B          0B        スワップが0になっていればOK

# dd if=/dev/zero of=/swap.img bs=1M count=8192  8GBのスワップファイル /swap.img を作成する
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 604.02 s, 14.2 MB/s

# mkswap /swap.img    作成した /swap.img をスワップとして設定する(次に再起動するまで)
mkswap: /swap.img: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 8 GiB (8589930496 bytes)
no label, UUID=52e7d3ba-c9a1-496b-b275-e0876136d14b

# swapon /swap.img    /swap.imgをスワップとして使用開始
swapon: /swap.img: insecure permissions 0644, 0600 suggested.

# free -h    空きメモリを確認して8GBのスワップが認識された状態であることを確認
               total        used        free      shared  buff/cache   available
Mem:           984Mi       388Mi        43Mi       0.0Ki       552Mi       506Mi
Swap:          8.0Gi          0B       8.0Gi

もしも上で作成したスワップが使えないなら以下2行のようにパーミッションを変更してから再度スワップの使用を開始する
# chmod 600 /swap.img  パーミッションを設定する
# swapon /swap.img    /swap.imgをスワップとして使用開始(再度)

このスワップファイルは一時利用なので次にシステムを再起動したらスワップとしては無効状態になる。作成した/swap.imgは残っているので再利用もできるが、通常スワップが利用できれば十分な筈なので、/swap.imgは削除するのが良さそう。

再度、Agent DVRのビルドコマンドを実行する。それなりに時間はかかるが、このビルドコマンドは面倒見の良いもののようで、おそらく正常にビルドが完了してサービスの登録/有効化/開始まで行ってくれる筈。
つまり、あとはAgent DVRを操作するだけ。

Agent DVRの操作 カメラの登録

シングルボードコンピュータでAgent DVRを使う 3
Agent DVRをインストールしたのが高性能なLinux PCでデスクトップ環境が使えるものであればブラウザで http://localhost:8090/ を開く。
Agent DVRをインストールしたのが非力なPCやシングルボードコンピュータであれば同じLANの別のPC等のブラウザで Agent DVRをインストールしたコンピュータのIPアドレスとポート8090を指定して開く。
(例: http://192.168.2.16:8090/ )
始めて開いたときにはヘルプのポップアップウィンドウが開く。「OKをクリック」

シングルボードコンピュータでAgent DVRを使う 4
言語の選択ウィンドウが開くのでドロップダウンメニュー(初期値: English)で「日本語」を選択して「OKをクリック」

シングルボードコンピュータでAgent DVRを使う 5
再度ヘルプのポップアップウィンドゥが開くが、今度は日本語で表示される。「OKをクリック」

シングルボードコンピュータでAgent DVRを使う 6
カメラが未登録なので画面の殆どがブランクの画面になる。
左上のアイコンをクリック。

シングルボードコンピュータでAgent DVRを使う 7
メニューが開く。今回は先にカメラを登録するので「新しいデバイス」をクリック。
Agent DVRに慣れているなら先に「構成」の「設定」で必要に応じて適切な指定を行ってからカメラを登録する方が手間が少ないかも。

シングルボードコンピュータでAgent DVRを使う 8
ディスプレイスロットを選択という意味のわからない(かもしれない)画面が表示されるので、右上の をクリック。

シングルボードコンピュータでAgent DVRを使う 9
おそらく通常であれば「IPカメラウィザード」をクリックするものだと思われます。
しかし、ONVIF対応の監視カメラであれば「ONVIF」をクリックする方が早そう。

シングルボードコンピュータでAgent DVRを使う 10
Camera1(仮)の設定画面になります。最初は右上の水色のドロップダウンメニューが「全般的」の筈。カメラの名前が気に入らなければ、この「全般的」の画面で「名前」欄を変更。
「ソースの種類」は「ONVIF」のまま変更しないで、右端の「」をクリック。

シングルボードコンピュータでAgent DVRを使う 11
「構成、設定」のポップアップウィンドウが開くので「検出に記録」(動体検出から指定時間録画)をオンにしたり「生の記録」(カメラ映像そのまま録画)のスイッチを変更したりしてから「OK」をクリック。これらは後からも変更できるので触らず「OK」も可。

シングルボードコンピュータでAgent DVRを使う 12
Agent DVRと同じネットワークにあるONVIF対応カメラが検出されて「利用可能」(クリックして選択)にボタンとして表示される。ボタンにOnvif情報のURLがIPアドレス込みで表示されるので複数カメラが検出されても設定したいカメラを識別できる筈。設定したいカメラのボタンをクリックする。

シングルボードコンピュータでAgent DVRを使う 13
上でクリックしたカメラのOnvif情報のURLが「サービスURL」欄に入る。
「発見する」の「ビデオURLを取得する」ボタンをクリックする。

シングルボードコンピュータでAgent DVRを使う 14
Onvif情報に含まれるストリームURLが認識されて「見つかったオプション」に表示される。おそらく複数検知される筈。
「ライブURL」と「記録URL」でその検知されたストリームを選択できる。
ライブURLはリアルタイム表示用のストリームでカメラが1つでAgentDVRのホストがある程度高性能であれば高解像度のストリームでも良さそうだが、そうでなければ低解像度なストリームを選択する。
記録URLは録画用のストリームで基本的には高解像度のストリームを選択する。映像のディテールなんか不要でぼんやり認識できれば良いということであれば低解像度のストリームを選択する方が良いという考え方もある。
設定が終わったら右下の「OK」をクリック。

シングルボードコンピュータでAgent DVRを使う 15
「全般的」画面に戻るので、「名前」の下の有効/無効スイッチが「On」(有効)になっていることを確認。なっていなければスイッチをクリックして「On」にする。
右下の「OK」をクリック。

シングルボードコンピュータでAgent DVRを使う 16
設定画面で「OK」をクリックしてメイン画面に戻る。少し待たされて設定したカメラの映像が表示されればOK。
設定したカメラがAgent DVR以外のデバイス(スマホ/PC/他のNVRサーバ)に映像を送っていた場合は待ち続けても映像が表示されない(かもしれない)のでカメラの電源を入れ直して暫く待つ。

シングルボードコンピュータでAgent DVRを使う 17
カメラの映像が表示された。
今回使用した監視カメラは映像の右上に時刻を映像に打ってくれる(映像に書き込まれる)。Agent DVRは映像の左上に時刻を書き込む。
この画面ではAgent DVRの時刻が9時間遅れの夜中の2時半になっている。Agent DVRにはタイムゾーンの設定は無いよう。(見つけられなかった)
Agent DVRはそれが稼働しているホストのローカル時間を使用するっぽい。

$ date
Thu 29 Dec 2022 11:38:05 AM UTC
$ sudo timedatectl set-timezone Asia/Tokyo
$ date
Thu 29 Dec 2022 08:38:48 PM JST

dateコマンドで時刻を表示して黄色字の部分(実際は黄色ではない)がUTCだと日本時間とは9時間ズレている。
タイムゾーンをAsia/Tokyoに設定するとローカル時間が日本時間になる。以後、システムを再起動してもこの設定が有効。
改めてdateコマンドで時刻を表示すると黄色字の部分(実際は黄色ではない)がJSTになっている筈。これでローカル時間が日本時間になるので正しい時刻になる筈。
これで、以後AgentDVRの時刻も正しくなる筈。(念の為にAgentDVRを再起動するのが良いかも)
なお、時刻合わせはインターネットに接続されていればビルトインのchronyが自動で行ってくれるので簡単。インターネットと通信できないネットワークに置くなら/etc/chrony/chrony.confの最初の方にあるpool 2.debian.pool.ntp.org iburstの行頭に#を付けて無効にする。
/etc/chrony/sources.d/local-ntp-server.sources (新規作成ファイル)に server 192.0.2.1 iburst のような1行を書く。この例では192.0.2.1がLAN内で接続可能なNTPサーバとする。
sudo systemctl restart chrony でchronyサービスを再起動させて設定を有効にする。

大容量ストレージを備えたPCにAgent DVRを入れた場合は既に録画可能。録画されないようなら左下から3番めの○アイコンをクリックすれば録画が始まる筈。
ストレージの容量が少ないシングルボードコンピュータでは録画用のストレージの設定が無効になっていて録画できないかも。
次回はシングルボードコンピュータにハードディスクを接続し、ストレージの設定を行い録画できるようにする。

関連記事: