OSSの監視カメラサーバ「ZoneMinder」を構築してみる

2023/10/17 What's Up, ネットワーク, 技術系 投稿者:

監視カメラサーバ(レコーダ)には、その監視カメラのメーカーのものを使用するのが一般的かと思いますが、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あたりでもいける気がするので、場合によってはメーカー製の専用サーバを使うより安上りでカメラサーバを用意できるかもしれません。

カレンダー

1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
   1234
567891011
12131415161718
19202122232425
26272829   
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
  12345
6789101112
13141516171819
20212223242526
2728     
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
1234567
891011121314
15161718192021
22232425262728
       
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
     12
3456789
10111213141516
17181920212223
24252627282930
31      
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
     12
3456789
10111213141516
17181920212223
242526272829 
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
    123
45678910
11121314151617
18192021222324
25262728   
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
   1234
567891011
12131415161718
19202122232425
262728    
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
     12
3456789
10111213141516
17181920212223
24252627282930
31      
   1234
567891011
12131415161718
19202122232425
2627282930  
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728     
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
1234567
891011121314
15161718192021
22232425262728
29      
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
  12345
6789101112
13141516171819
20212223242526
27282930   
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
      1
2345678
9101112131415
16171819202122
232425262728 
       
   1234
567891011
12131415161718
19202122232425
262728293031 
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
     12
3456789
10111213141516
17181920212223
24252627282930
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
1234567
891011121314
15161718192021
22232425262728
2930     
       
    123
45678910
11121314151617
18192021222324
25262728293031
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
 123456
78910111213
14151617181920
21222324252627
282930    
       
     12
3456789
10111213141516
17181920212223
2425262728  
       
  12345
6789101112
13141516171819
20212223242526
2728293031  
       
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
    123
45678910
11121314151617
18192021222324
252627282930 
       
 123456
78910111213
14151617181920
21222324252627
28293031   
       
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   1234
567891011
12131415161718
19202122232425
262728293031 
       
1234567
891011121314
15161718192021
22232425262728
293031    
       
U・Iターン転職しませんか?
群馬データセンター
群馬の法人ITサポートサービス Wide Net[ワイドネット]
Wide Netのクラウドバックアップ
クラウド型ファイル共有サービスRushDrive
ワイドオフィス
ネディアのSDGsへの取り組み