シングルボードコンピュータで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が入っていないようなシステムだと他にもいろいろ足りなくてその後のビルドが上手くいかないかも。

2025年11月24日追記:
いつの変更かは不明ですが、最近のバージョンではインストール中のビルドはなくなった模様です。以下のビルドとスワップの部分は読み飛ばしてください。
逆に、libicuパッケージがシステムにインストールされていない場合に、AgentDVRサービスが正常に起動しない問題を抱えていました。これはログを見れば判ることですが、journalctlコマンドを使う習慣がない方は気付けない可能性があります。

$ apt-cache search libicu (インストール可能なlibicu関係のパッケージを探す)
libicu-dev - Development files for International Components for Unicode (これを入れると下も入る)
libicu76 - International Components for Unicode (普通はこれだけで可 バージョンは変わります)
libicu4j-java - Library for Unicode support and internationalization
libicu4j-4.4-java - Library for Unicode support and internationalization

$ sudo apt install libicu-dev (今回はlibicu開発用パッケージセットをインストール)
libicuはAgentDVR実行時に必要なので開発用パッケージをインストールする必要はありません。

メモリが豊富な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番めの○アイコンをクリックすれば録画が始まる筈。
ストレージの容量が少ないシングルボードコンピュータでは録画用のストレージの設定が無効になっていて録画できないかも。
次回はシングルボードコンピュータにハードディスクを接続し、ストレージの設定を行い録画できるようにする。

関連記事:

Google AdSenseの審査に合格するために読んでおくべきドキュメント

ストップ
©いらすとや.

AdSenseの申込みをして数日〜2週間ほど待たされて、帰ってきた返事が「腕組みニキ」(不合格通知に表示されるいかついおじさんの画像)。既に何度も再申請しているけど尽く不合格で「やれることは全てやったけど合格しない」「何をしたら合格するのかわからない」という人をSNSでよく見かけます。

コンテンツの価値が低いと指摘されて不合格になる方の殆どが何故かGoogleさんが何を求めていて何を嫌っているのか知らない様子。
おそらくAdSenseに合格するための方法を「ググって」はいる筈だけど、それだと情報が古かったり見当違いだったりで役に立ちません。特に、不合格回数が多くていろいろやったらなんとか合格しましたっていう記事は的外れなのが多い印象です。1,2回は運悪く不合格になることはあっても、適切に対応して再審査請求すれば5回も10回も不合格になるなんてことはない筈です。

これは、クルマの免許を取得したことがない人が、金を払いたくないからと自動車学校にも行かず、面倒だからと道路交通法の勉強もせずいきなり免許センターで仮免学科試験や技能試験を受けて免許を取得しようとするのに似ています。教習所に行かないにしてもせめてクルマの運転に関わる法律くらいは目を通しておくべきです。それもしないで何度も何度も試験だけ受けてマグレで受かったとしてもそんな人の提供する免許を取るためのノウハウなんて全く信用できません。

AdSenseの審査は免許の試験ではありませんが、Googleが定めるポリシーに沿ったウェブサイトでなければ審査に合格しません。Googleが提供する関係ドキュメントには目をとおしましょう。ドキュメントの数が多いので初回は一通りさらっと流し読みしてその後に気になる部分からじっくり読み込むと理解しやすいです。AdSenseの要件はGoogle検索向けのポリシーと被る部分が多いのでGoogle検索, SEO関係のドキュメントにも目を通しましょう。

Google パブリッシャー向けポリシー

  • コンテンツ ポリシー
  • 違法なコンテンツ
  • 知的財産権の侵害
  • 危険または中傷的なコンテンツ
  • 動物への残虐行為
  • 不適切な表示に関連するコンテンツ
  • 不正行為を助長する商品やサービス
  • 悪意のあるソフトウェアまたは望ましくないソフトウェア
  • 性的描写が露骨なコンテンツ
  • 報酬を伴う性的行為
  • 国際結婚の斡旋
  • 家族向けコンテンツに含まれる成人向けのテーマ
  • 児童の性的虐待と性的搾取

最もしっかり読み込んでおくべきドキュメントです。これを理解しなければAdSenseの審査が通りにくい、検索インデックスに登録されない、検索の表示順位が上がらないことになりかねません。

AdSense申請で確認するドキュメント

申し込み前

AdSenseのプログラムポリシーはもちろん重要ですが、「Google AdSense のコンテンツとユーザー エクスペリエンス」がわかりやすく書かれているのでしっかり理解したいものです。

申込み後

ポリシー違反関係は、知っていれば違反行為自体を避けやすく、もしもポリシー違反を指摘されたときも戸惑わずに済みます。

Google検索セントラル Google検索の基本事項

(旧)Google 検索のウェブマスター向けガイドライン(品質に関するガイドライン)です。

Google検索セントラル
SEOの基礎

Google ウェブ検索のスパムに関するポリシー」には「Google のポリシーに違反しているサイトは、検索結果での掲載順位が下がったり、まったく表示されなかったりすることがあります」という恐ろしい1文が書かれています。ポリシー違反内容の多くは常識的なものなのでヘンなことをしなければ大丈夫な筈ですが、気をつけたいのが「リンクスパム」です。
「質の低いディレクトリやブックマーク サイトのリンク」「過剰な相互リンク(「リンクする代わりにリンクしてもらう」)や、相互リンクのみを目的としてパートナー ページを作成する」が挙げられています。リンクが欲しいのは解ります。ググると「被リンクを増やしましょう」と書かれていることが多いですしそれは正しいでしょう。しかし、「なんとか村」や「なんとかランキング」にブログを登録して非リンクを得ましょうなんて書いてあるのも多く、素直にそうしている人達を見かけます。これはGoogleさんのドキュメントの言葉どおりならポリシー違反ですし、そもそも「なんとか村」や「なんとかランキング」利用者サイトからの非リンクなんて全然価値がありません。ポリシー違反で検索結果の掲載順位が下げられるなら超マイナスです。なお、どの程度でポリシー違反を指摘されるかは不明です。

「有用で信頼性の高い、ユーザーを第一に考えたコンテンツの作成」にはとても重要なことが書かれています。これは古いSEO関係の記事には書かれていませんし、古い小手先SEOの知識しかない人は知りません。

専門的な知識を扱う場合はそれを書いた人や情報の出処が重要視されます。つまり専門家がその専門分野で根拠のある情報を扱うことが求められます。そして、その専門家は自称ではなく世間からある程度認知されていることが求められます。ド素人が勝手に「○○士の私がオススメするのは〜です」と書いてもそれは専門家が書いたとは認められません。

「検索エンジンを第一に考えたコンテンツ作成を回避する」は2022年夏以降に展開されたヘルプフルコンテンツアップデートの核心です。古いSEOの知識を基にウェブを作ると真逆だったということになることもあるので十分に注意するべきです。最近は雑記ブログが検索上位に表示されにくくなっていたりAdSenseで稼ぎにくくなっているのは「いずれかが検索結果の上位に表示されることを期待して、さまざまなトピックで多くのコンテンツを制作していますか。」「既存のユーザー層のためではなく、ただ話題になっているという理由で記事を書いていますか。」という文言にも現れています。

E-A-T と品質評価ガイドラインについて」は個人ブログにとっては悪い方に影響の大きいものです。所謂YMYLです。これを知らずにSEOも糞もありません。個人ブログはGoogle検索からの流入を重視するところが多いでしょうが、それならYMYLなジャンル(テーマ)は避けた方が良さそうです。非専門家の個人ブログはYMYLで検索順位で上位の表示どころか最初の数ページに入ることすらキツいのでページビュー(PV)が低調なままということになります。PVが少なければAdSenseで稼ぐのは無理です。Google検索がダメならSNSなどGoogle検索以外からの流入に力を入れるというのありますが、それならAdSense以外で収益を得る方が良いでしょう。
なお、2022年12月15日付けで検索品質評価ガイドラインが更新されE-A-Tに経験(Experience)の頭文字Eが付いたE-E-A-Tになっていますが、まだ日本語への翻訳はされていません。

Google ウェブ検索のスパムに関するポリシー

  • クローキング
  • 誘導ページ
  • ハッキングされたコンテンツ
  • 隠しテキストと隠しリンク
  • キーワードの乱用
  • リンクスパム
  • 機械生成トラフィック
  • マルウェアや悪意のある動作
  • 誤解を招く機能
  • 無断で複製されたコンテンツ
  • 不正なリダイレクト
  • スパム行為のある自動生成コンテンツ
  • 内容の薄いアフィリエイト ページ
  • ユーザー生成スパム
  • ランキングの降格や削除につながる可能性のあるその他の行為

Google 検索のコンテンツ ポリシー

  • Google 検索の全般的なコンテンツ ポリシー
    • 児童への性的虐待の画像または児童搾取のコンテンツ
    • 機密性の高い個人情報
    • スパム
    • ウェブマスターまたはサイト所有者からのリクエスト
    • 有効な法的要請
  • 検索機能のポリシー
    • 広告
    • 危険なコンテンツ
    • 欺瞞行為
    • ハラスメント コンテンツ
    • ヘイト コンテンツ
    • 操作されたメディア
    • 医療のコンテンツ
    • 規制品
    • 露骨な性的描写を含むコンテンツ
    • テロリストのコンテンツ
    • 暴力や残虐行為
    • 下品な言葉や罵倒語
  • 機能固有のポリシー

Google検索、SEO関係で見ておくべきドキュメント

以前のGoogleのドキュメントは日本語の体裁なのに1行も頭に入らないような謎のGoogle語で書かれていましたが、最近のGoogleのドキュメントはだいぶ解りやすいものになっています。そして、例も交えて丁寧に説明されているものが増えています。しっかり理解すれば、Googleさんが何を求めていて何を嫌っているかがわかるようになります。
なお、ドキュメントはアルゴリズムの変更やポリシーの変更に伴い更新・移動・追加・削除されます。1度確認して終わりではなく半年〜1年に1度程度は読み直しましょう。つまりGoogleさんの御心は変わってゆくものなので常に公式の最新情報を仕入れるようにしましょう。

ブログで稼ぎたいけど努力するのが嫌だから「WordPressの高機能テーマを購入しました」とか「ブログのコンサルをお願いしました」とかいう人がいますが、有料テーマを買ったら検索順位が上がるなんてことはなく、コンサルさんがあなたに代わって何かしてくれるということはなく、結局頑張らなければならないのはあなた(自分)というのは変わりません。金を払ったからといってラクになることは殆どありません。また、投資した金額をAdSenseで回収しようとすると道は長く険しいです。初期投資で気前よく金をばら撒かないようにしましょう。
アドバイスするだけのコンサルは害が少ないので置いといて、怪しいサービスを提供するSEO業者については「SEO 業者の利用を検討する」にもありますがご注意ください。

Up