監視カメラサーバ(レコーダ)には、その監視カメラのメーカーのものを使用するのが一般的かと思いますが、OSS(オープンソースソフトウェア)の監視カメラサーバというものもあります。
今回はそのひとつ「ZoneMinder」を使用して、監視カメラサーバを構築していきます。
目次
環境について
今回使用するサーバのOSは「AlmaLinux9.2」です。
Webサーバには「Apache」を使用します。
サーバは社内LANに設置して外部には公開しないので、サーバのセキュリティ機能は使用しません。
また、カメラはPanasonic製で、RTSP(Real Time Streaming Protocol)に対応したものを使用します。
ZoneMinderは汎用の監視カメラサーバなので、使用するカメラはメーカーなどを選びませんが、RTSPに対応したものである必要があります。
といっても、RTSPは映像・音声の配信のためのプロトコルなので、ネットワークカメラであればほぼ対応しているはずです。
構成イメージ
ZoneMinderのインストール
ZoneMinderのインストール
早速ZoneMinderをインストールします。
ZoneMinderのインストール自体はとても簡単です。
下記の手順でインストールすることができます。
必要なリポジストリを追加
# dnf -y install epel-release
# dnf -y install --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-9.noarch.rpm
# dnf -y install dnf-plugins-core
# dnf config-manager --set-enabled crb
ZoneMinderをインストール
# dnf -y install zoneminder
これでZoneMinderのインストールができました。
インストールが完了したら「/usr/share/doc/zoneminder-common」にあるREADMEファイルに沿って設定していきます。
今回はApacheを使用するので、「README.httpd」の手順を行っていきます。
ちなみに、「README.httpd」の手順を要約すると次のようなことが書かれています。
- データベースサーバ(MariaDB)を構成してください。
- SELinuxを無効にしてください。
- Webサーバを構成してください。
- 必要に応じてファイアウォールの設定を変更してください。
このうち、SELinuxとファイアウォールは既に無効化しているものとして省略します。
データベースの設定
READMEの手順に沿って、まずはデータベースから設定してきます。
手順は次の通りです。
MariaDBをインストール
# dnf -y install mariadb-server
# systemctl start mariadb
# systemctl enable mariadb
MariaDB初期設定
# mysql_secure_installation
データベース作成・ユーザ作成
# mysql -u root -p < /usr/share/zoneminder/db/zm_create.sql
# mysql -u root -p -e "create user 'zmuser'@'localhost' identified by 'zmpass';"
# mysql -u root -p -e "grant all privileges on zm.* to 'zmuser'@'localhost';"
# mysqladmin -uroot -p reload
これでデータベースの設定は完了です。
なお、READMEに記載がありますが、ZoneMinderが使用する「データベースユーザ名/パスワード」の組み合わせを「zmuser/zmpass」以外の任意のものにする場合は、ZoneMinderの設定ファイルにデータベースユーザとパスワードの設定が必要になります。
Webサーバの設定
ZoneMinderのインストール時にApacheも同時にインストールされているはずなので、Apacheを個別にインストールする必要はありません。
ただし、「mod_ssl」も必要ですがこちらはインストールされていないので手動でインストールします。
mod_sslインストール
# dnf -y install mod_ssl
ZoneMinderの設定ファイルをApacheに追加
# ln -sf /etc/zm/www/zoneminder.httpd.conf /etc/httpd/conf.d/
WebサーバとZoneMinderを起動
# systemctl start httpd
# systemctl enable httpd
# systemctl start zoneminder
# systemctl enable zoneminder
ここまでの手順を終えると「http://サーバのIPアドレス/zm」からZoneMinderのWebコンソールへアクセスできるようになります。
初めてWebコンソールへアクセスすると、情報収集に同意するか聞かれるので、AcceptまたはDeclineを選択してAPPLYを押します。
なお、情報収集には同意しなくてもとくに問題はありません。
これでZoneMinderのWebコンソールが使用可能になりました。
ZoneMinderの初期設定
ここからはZoneMinderのWebコンソールから設定を行っていきます。
Webコンソールにアクセスしたら、上部メニューの「Options」から設定画面を開き、次のように設定します。
タイムゾーン設定
時刻表示設定
最下部の「SAVE」から設定を保存
左側メニューの「Web」を選択
イベント表示順を降順に変更(新しい録画データが先頭になるようにする)
最下部の「SAVE」から設定を保存
カメラの設定
カメラの登録は「Console」の「ADD」ボタンから行います。
しかし、カメラの登録には、後ほど設定する「Sourceの設定」のところで「Source Path」に入力するRTSPのURLが必要になるので、先にこれを調べます。
RTSPのURLはNmapで調べることができます。
Nmapをインストールしてから、下記のコマンドを使用します。
# nmap --script rtsp-url-brute -p [RTSPのポート番号] [カメラのIPアドレス]
上記のコマンドを実行すると次のような結果が得られます。
実行結果の「rtsp://」で始まる部分が必要なURLになっています。
「Source Path」には、これにカメラへのログイン情報を付加したものを設定します。
上記の例の場合であれば、「rtsp://[カメラのログインID]:[ログインパスワード]@[カメラのIPアドレス]/nphMpeg4~」といった具合です。
今回は「~/nphMpeg4/g726-640×480」を使用しますので、
rtsp://[ログインID]:[パスワード]@[IPアドレス]/nphMpeg4/g726-640x480
というのが「Source Path」の内容となります。
必要な情報が得られたので、「Console」の「ADD」ボタンからカメラを登録していきます。
Generalの設定
Sourceの設定
Storageの設定
Miscの設定
これで「SAVE」を押して設定を保存すると
このようにカメラを登録することができました。
なお、「フレームを画像として保存する設定」を有効にしておくと、映像の1フレーム毎に画像が生成され、膨大な数になってしまうので今回は無効にしています。
また、デフォルトだと録画モードが「Mocord」(常時録画+動体検知)になっていますが、「Mocord」の部分を押すといつでも変更可能です。
ちなみに、選択できる録画モードは次の通りです。
- None - 停止
- Monitor - 監視のみ(録画しない)
- Modect - 動体検知
- Record - 常時録画
- Mocord - 動体検知+常時録画
- Nodect - 外部トリガによる録画
録画データについて
ZoneMinderの録画データは、デフォルトで設定されている「Default」というストレージ設定では「/var/lib/zoneminder/events」に保存されます。
今回はとくに変更しませんが、これは「Options」から変更・追加などが可能です。
「Path」に指定されたディレクトリを起点に、下図のように「/モニタID/日付/イベントID」という階層構造で保存されます。
今回の設定ではビデオとして保存するようにしているので、最下層のイベントIDのディレクトリに「.mp4」で録画データが保存されています。
ちなみに、フレームを画像として保存する設定を有効にした場合は、同じディレクトリに「.jpg」で保存されます。
マルチポートの設定
ここまでの手順で、ZoneMinderでのカメラ映像の録画はできるようになったので、基本的にはそのまま使用して問題ありません。
しかし、「Montage」の機能を使用する場合に不都合がある場合があります。
「Montage」は登録されているカメラからのストリーミングを同時に再生する機能です。
カメラの台数が5台くらいまでであれば問題ありませんが、それ以上になってくると正常に機能しなくなります。
これはブラウザ側の制限の問題で、「同じドメインからのストリーミング数が制限されているから」ということのようです。
自分が試した限りChromeでは5台、FireFoxでは6台が上限でした。
この問題を回避するためには、マルチポートの設定が必要になります。
マルチポートの設定をすると、各カメラからのストリーミングがそれぞれ別のポートに分けられ、ブラウザの制限に引っ掛からなくなります。
マルチポートの設定手順は次の通りです。
Apacheの設定ファイル(/etc/httpd/conf.d/ssl.conf)を修正
Listenポート設定追加
バーチャルホスト設定修正
設定反映
# apachectl graceful
ZoneMinderの「Options」から設定変更
「MIN_STREAMING_PORT」に設定する数値は、「実際に使用するポート番号の最小値-1」に設定します。
これは、ここで設定された数値+モニタIDのポート番号が使用されるためです。
たとえば、モニタIDが1のカメラのストリーミングは30001番ポートが使用されます。
今回の設定例では「30001~30010」までの10個のポートを使用することができるので、10台までのカメラ映像をストリーミングできます。
日本語化
タイムゾーンなどを設定した「System」の設定の中に「LANG_DEFAULT」の設定項目があり、日本語(ja_JP)を選択することができますが、そのままでは文字化けしてしてしまう可能性が高いです。
自分の環境(Chrome)では文字化けして使い物になりませんでした。
この言語設定は、対応する言語用のPHPファイルが「/usr/share/zoneminder/www/lang/」の中にあるので、こちらを修正します。
具体的には「/usr/share/zoneminder/www/lang/ja_jp.php」の文字コード部分を下記のように変更します。
header( "Content-Type: text/html; charset=UTF-8" );
文字コードを変更してから「LANG_DEFAULT」を「ja_JP」に変更すると、文字化けが解消されます。
ただし、文字化けが解消しても日本語ローカライズは完璧ではなく、日本語化されていない部分や誤っている部分などが結構あります。
「/usr/share/zoneminder/www/lang/ja_jp.php」の中身を見るとわかりますが、特定の文字列を特定の文字列(この場合は日本語)に置き換えるようになっているので、使いやすさを求めるなら自分で適宜修正していく必要があります。
まとめ
ZoneMinderを構築してみて、少し触ってみた感じでは、とくに不満なく使えるような気がしました。
日本語化の部分は自分で調整するなどが必要ですが、機能としては十分実用に耐えると思います。
カメラの台数が数台であれば、Raspberry Piあたりでもいける気がするので、場合によってはメーカー製の専用サーバを使うより安上りでカメラサーバを用意できるかもしれません。