Ubuntu Weekly Recipe

第730回Shinobiとネットワークカメラで監視カメラシステムを作る🥷

Shinobiとは

自宅では防犯目的やペットの見守り、職場では計算機室や倉庫の監視目的でカメラを設置している場合もあるでしょう。今回はそういったカメラを利用して、CCTV(閉回路テレビ、いわゆる監視カメラ)/NVR(ネットワークビデオレコード)システムを構築するためのネットワークカメラソリューションShinobiを紹介します。

ShinobiはNode.jsで書かれたオープンソースのWebアプリなので、システムの利用時に専用のアプリケーションを必要としません。そして以下の場合に有用です。

  • 一つの画面で同時に複数のカメラの映像を見たいが、実現のために追加で有料のアプリを購入が必要なので二の足を踏んでいる
  • カメラの録画やスナップショット撮影を行いたいが、様々な都合からメーカーの用意しているツールやサービスを使用したくない・できない
  • 動体検知で入室してきた人・物を録画したい
  • カメラの用意しているWeb画面が古くて、Internet Exploer(現在は Microsoft EdgeのIE mode)でないとまともに使用できず、困っている

なお、本記事で利用するカメラは、Real Time Streaming Protocol(RTSP)に対応した、いわゆるネットワークカメラの利用を前提にしています。USB接続のWebカメラはネットワークストリーミングする機能がないため、利用できません。ただし、後述の方法でWebカメラをRTSP対応カメラにすることも可能です。

Shinobiのインストール

Ubuntu 22.04にはShinobiのパッケージはありません。そのため、Shinobiが用意しているインストールスクリプトを実行して実機にインストールするか、docker imageを使用するかのいずれかでインストールを行う必要があります。今回はdocker imageを使用する方法を採ります。

なお実機にインストールする場合は、Shinobiそのものを動かすために Node.js、バックエンドのデータベースとしてMariaDB、映像の変換等のためにFFmpegのインストールが必要です。これらはインストールスクリプト内でインストールされます。

さて、dockerを利用するために、docker-compose.ymlとして以下のものを用意します。

version: '3'
services:
  shinobi:
    image: registry.gitlab.com/shinobi-systems/shinobi:dev
    container_name: shinobi
    ports:
       - 8080:8080
    volumes:
       - ${PWD}/Shinobi/config:/config
       - ${PWD}/Shinobi/customAutoLoad:/home/Shinobi/libs/customAutoLoad
       - ${PWD}/Shinobi/database:/var/lib/mysql
       - ${PWD}/Shinobi/videos:/home/Shinobi/videos
       - ${PWD}/Shinobi/plugins:/home/Shinobi/plugins
       - /dev/shm/Shinobi/streams:/dev/shm/streams
       - /etc/localtime:/etc/localtime:ro

補足しておくと、Shinobiは8080番ポートで待ち受けるため、コンテナの8080番ポートをホストの任意のポートにフォワードする必要があります。この例ではホスト側も8080番ポートに設定していますが、既に使用されている場合は適当なポートに読み替えてください。また、ボリュームに設定している各ディレクトリの役割はShinobiのドキュメントを参照してください。

その後docker-compose upとコマンドを入力して、Shinobiを起動します。

Shinobiの初期設定

Shinobiが起動したら、Webブラウザからhttp://<コンテナホストのIPアドレス>:8080/superへアクセスします。

ログイン画面が表示されますので、デフォルトのスーパーユーザーのメールアドレス[1]とパスワードであるadmin@shinobi.videoadminを入力してログインします図1⁠。

図1 管理メニューのログイン画面。お寺の写真が緑がかっている
図1

ログイン後、管理画面に遷移します。まずはPreferenceタブを選択して、スーパーユーザのIDとパスワードをデフォルトから更新しておきましょう図2[2]

図2 管理メニューのPreferenceタブ画面。ここからスーパーユーザーのメールアドレスとパスワードを更新しておく
図2

スーパーユーザーからではカメラの登録や映像の確認ができませんので、新規にユーザーアカウントを作成します。管理画面のAccountsタブを選択し、⁠+ADD」ボタンをクリックしてユーザーを作成します図3⁠。最低限メールアドレスとパスワードを設定すればOKです図4⁠。

図3 管理メニューのAccounts画面。⁠+ADD」ボタンをクリックしてアカウント作成を行う
図3
図4 アカウント作成画面。メールアドレスとパスワードを設定すればよい
図4

アカウント作成後、Webブラウザからhttp://<コンテナホストのIPアドレス>:8080/へアクセスし、一般ユーザ用ログイン画面図5から先ほど作成したアカウントでログインすると、Shinobiのダッシュボードが表示されます図6⁠。

図5 通常のログイン画面。こちらはお寺の写真が青がかっている
図5
図6 Shinobiのダッシュボード
図6

カメラの登録

ダッシュボード左ペインの「Monitor Settings」を選択すると、カメラの登録(と設定変更)メニューが現れます。

設定項目がたくさんありますが、Shinobiのダッシュボードからカメラの映像を確認したいのであれば、大抵のカメラの場合、以下を設定する形になります。

  • Identityセクションの「Name」にカメラを識別するための分かりやすい名前を入力する図7
  • Connectionセクションの「Full URL Path」にカメラの RTSPストリームのURLを入力する図8[3][4]

ただし、筆者の所持しているカメラでは、なぜかConnectionセクションの「Skip Ping」をYesにしないとカメラとの接続に失敗するものがありました。

図7 Monitor SettingsのIdentityセクション
図7
図8 Monitor SettingsのConnectionセクション
図8

今回は筆者が対応したカメラを所持していなかったため動作を確認できなかったのですが、ネットワークカメラのインターフェイス互換性に関する規格であるONVIF(Open Network Video Interface Forum)に対応していて、かつ、外部にONVIF用のポートを開放しているカメラであれば、Shinobi経由でカメラのパン・チルト・ズームの制御やカメラ自身の設定更新が可能です。

Connectionセクションの「ONVIF」をYesにして、⁠ONVIF Port」にカメラが開放しているONVIF用ポートを入力して設定を有効化します。

なお、ONVIF用ポートはダッシュボード左ペインにある「ONVIF Scanner」を利用してスキャン可能です図9⁠。

図9 ONVIF Scanner画面
図9

設定が終了したら、画面右下の「Save」をクリックして設定を保存します。設定後にShinobiがカメラへRTSPで接続を試みます。

もし登録したいカメラが複数ある場合は、カメラの台数ぶん登録作業を繰り返します。

登録したカメラの映像はダッシュボード左ペインの「Live Grid」を選択し、⁠Open All Monitors」をクリックすると確認できます図10⁠。また映像にマウスカーソルを置くとメニューが表示されます。このメニューからは映像のフルスクリーン表示や、スナップショットのダウンロードなどが行えます。カメラが複数ある場合はグリッド上の各カメラの表示位置をドラックアンドドロップで変更することもできます。

図10 Live grid画面。登録したカメラの映像がグリッド表示される
図10

動体検知

冒頭で言及したように、入退室や侵入者の記録用途で動体検知を行えます[5]

実際に試してみましょう。ダッシュボード左ペインの「Monitors」を選択し図11⁠、動体検知を行いたいカメラの「Edit」をクリックしてカメラの設定画面を呼び出します。これは先ほどカメラを登録したメニューと同一のものです。

図11 Monitors画面。動体検知を設定したいカメラのEditをクリックする
図11

メニューから「Detector Settings」セクションの「Enabled」をYesに設定することで、動体検知が有効化されます図12図13⁠。

図12 Monitor SettingsのDetector Settingsセクション
図12
図13 Detector SettingsセクションのMotion Detectionメニュー。基本的に設定更新する必要はない
図13

動体検知はデフォルトではカメラが撮影している全領域を対象にしています。カメラの一部の領域のみを検知の対象にしたい場合は、⁠Region Editor」で領域設定を行います。領域は四角形のみならず、頂点を追加して多角形として設定できるため、カメラに写っている道路は領域から外したいなどのやや複雑なケースでも対応できます図14⁠。

図14 Region Editor。任意の多角形を領域として設定できる
図14

動体検知を有効にすると、Shinobiが動体検知を行った前後の映像を録画してくれます。録画された動画は、ダッシュボード左ペインの「Viedos」画面から再生やダウンロードが行えます図15⁠。

図15 Videosメニュー。録画された映像が再生・ダウンロードできる
図15
動画1 Shinobiが動体検知して、録画した映像

v4l2rtspserverでWebカメラをネットワークカメラにする

RTSP対応のネットワークカメラが手元になくても、Webカメラは所持しているケースはあるのではないでしょうか。その場合は、v4l2rtspserverを利用してWebカメラをネットワークカメラ化できます。

ただ、v4l2rtspserverもShinobi同様にUbuntu 22.04にはパッケージが存在していないので、dockerコンテナを利用することになります。さらに今回はH.264圧縮を利用するため、v4l2rtspserverのドキュメントに記載の以下の方法を採ります。

  • v4l2loopbackを用いてv4l2loopbackデバイスを用意する
  • Webカメラの映像をv4ltoolsに含まれるv4l2compressで圧縮し、v4l2loopbackデバイスへ出力する
  • v4l2rtspserverにはv4l2loopbackデバイスを用いて、RTSPを配信する
Webカメラ -- (v4l2compress による H.264 圧縮)
--> v4l2loopback device
--> v4l2server
--> (RTSPでの配信)

では実際に試してみましょう。dockerのホスト側でv4l2loopback-dkmsをインストールします。また、Webカメラやv4l2loopbackデバイスの確認のためにv4l-utilsも併せてインストールします。

$ sudo apt install v4l2loopback-dkms linux-modules-extra-$(uname -r) v4l-utils

インストール後、modprobeでv4l2loopbackモジュールをロードします。video_nrに指定する数字は後述の通り/dev/videoXXになるため、既存のカメラのデバイスファイル名と被らないものにしてください。

$ sudo modprobe v4l2loopback video_nr=10

再起動するとモジュールはアンロードされてしまうため、永続化させる場合は/etc/modules/load.d/と/etc/modprobe.d/へ設定を追加します。

$ sudo sh -c "echo 'v4l2loopback' >> /etc/modules-load.d/modules.conf"
$ sudo sh -c "echo 'options v4l2loopback video_nr=10' > /etc/modprobe.d/v4l2loopback.conf"
$ sudo modprobe v4l2loopback

モジュールをロードすると、/dev/video10としてv4l2loopbackデバイスが現れます。

$ v4l2-ctl -d /dev/video10 --info
Driver Info:
        Driver name      : v4l2 loopback
        Card type        : Dummy video device (0x0000)
        Bus info         : platform:v4l2loopback-000
        Driver version   : 5.15.39
        Capabilities     : 0x85200003
                Video Capture
                Video Output
                Read/Write
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x05200003
                Video Capture
                Video Output
                Read/Write
                Streaming
                Extended Pix Format
Driver Info:
        Driver name      : v4l2 loopback
        Card type        : Dummy video device (0x0000)
        Bus info         : platform:v4l2loopback-000
        Driver version   : 5.15.39
        Capabilities     : 0x85200003
                Video Capture
                Video Output
                Read/Write
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x05200003
                Video Capture
                Video Output
                Read/Write
                Streaming
                Extended Pix Format

Webカメラが一つだけ繋がっている場合は/dev/video0として見えます。Webカメラが複数接続されていて、使用するカメラがどれかわからない場合はv4l2-ctl --list-deviceで確認できます。

次に、v4l2tools(v4l2compress)とv4l2rtspserverを起動するdocker-compose.ymlを用意します。RTSPは通常TCP 554番ポートを使用しますが、v4l2rtspserverはTCP 8554ポートを使用します。

version: '3'
services:
  v4l2tools:
    image: mpromonet/v4l2tools
    container_name: v4l2tools
    devices:
      - /dev/video0
      - /dev/video10
    command: 
      - -fH264
      - /dev/video0
      - /dev/video10
    restart: unless-stopped
  v4l2rtspserver:
    image: mpromonet/v4l2rtspserver
    container_name: v4l2rtspserver
    ports:
      - 8554:8554
    devices:
      - /dev/video10
    entrypoint: "/bin/sh -c 'sleep 3 && /usr/local/bin/v4l2rtspserver /dev/video10'"
    depends_on: 
      - v4l2tools

その後docker-compose upとコマンドを入力して、コンテナを起動します。

v4l2rtspserverはrtsp://<コンテナホストのIPアドレス>:8554/unicastのURLでRTSPストリームを提供します。Shinobiのカメラ登録時にはこのURLを使用してください[6]

おすすめ記事

記事・ニュース一覧