Zoneminderのイベント画像ディレクトリ
Zoneminderで検知したイベント画像はデフォルトだと以下のディレクトリにあります。
/var/lib/zoneminder/events
FTPクライアントで接続して中を覗いてみると以下のような階層になっていますね。
「events」の直下は数字の「モニターID」のディレクトリがあります(上記の例では1)
モニターIDはZoneminderのWebコンソールから確認すると「Id」の列にある数字です。
その直下には「日付」のディレクトリがあります(yyyy-mm-dd形式)
さらにその下には数字だけのディレクトリがありますが、これは「イベントID」のディレクトリです。
「イベントID」は全モニターで同じカウンタを使っており、例えばモニター3でイベント001が発生し、次にモニター5でイベントが発生するとイベントIDが002になります。
Webコンソールからは以下の箇所で確認できます。
このディレクトリに保存されているのはイベントの画像のため、最新スナップショットではありませんが、「alarm.jpg」という画像はアラームの発生した時点の画像なので直近の動きがあった画像として使えそうですね。
alarm.jpg
今回は使いませんが、カレントディレクトリ以下から最新の「alarm.jpg」を探す場合は以下のようにします。
find . -name alarm.jpg -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1
モニターIDが「8」の最新の「alarm.jpg」を「/home/sakue/tmp/test1.jpg」へコピーする例です。
find /var/lib/zoneminder/events/8 -name alarm.jpg -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1 | gawk '{print $8}' | xargs -i cp '{}' /home/sakue/tmp/test1.jpg
「events」ディレクトリは膨大な数の画像が保存されているため、日付ディレクトリくらいから検索しないと相当な時間がかかり、上記の例だと10秒ほど待たされます。
以下のように日付フォルダ(2021-02-18)まで指定すると一瞬で抽出とコピーが完了するので、やるなら以下のような感じにすると良いです。
find /var/lib/zoneminder/events/8/2021-02-18 -name alarm.jpg -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1 | gawk '{print $8}' | xargs -i cp '{}' /home/sakue/tmp/test1.jpg
Zoneminderから最新スナップショットを取得して保存する
実際に使っている例です。
wgetで取得している事から分かるように、設定次第で外部からZoneminderへ直接アクセスすることもできますが、外部からは最新スナップショットだけ確認できれば良いので別途jpgで保存しています。
スナップショットの保存パスや、[Zoneminderのユーザー名]などの箇所は実際のものに修正します。
#!/bin/sh func_saveSnapshot(){ # スナップショットの保存パスを定義 local SNAPSHOTJPG1="/var/www/html/web/SnapShot/Camera01/auto.jpg" # 一時ファイルのパス定義 local SNAPSHOTTMP1="/var/www/html/web/SnapShot/Camera01/tmp.jpg" # 一時ファイルのパス定義(720p) local SNAPSHOTTMP2="/var/www/html/web/SnapShot/Camera01/tmp.jpg" # zoneminderからスナップショットを取得して保存 wget --no-check-certificate "https://localhost/cgi-bin/zm/nph-zms?mode=single&monitor=2&scale=100&maxfps=1&buffer=1000&user=[Zoneminderのユーザー名]&pass=[Zoneminderのパスワード]" -O $SNAPSHOTTMP1 2>/dev/null & wait # 1080pは大きすぎるので720pへ変換(ImageMagick) convert -geometry 1280x720 -quality 70 $SNAPSHOTTMP1 $SNAPSHOTTMP2 # 置換 mv -f $SNAPSHOTTMP2 $SNAPSHOTJPG1 # 所有者変更 chown sakue:sakue $SNAPSHOTJPG1 # パーミッション変更 chmod 0777 $SNAPSHOTJPG1 } func_saveSnapshot exit
wgetの以下の箇所はSSLを無視してダウンロードするオプションです。
--no-check-certificate
ダウンロード完了前に次に進んでしまう事があったためwgetの後に次の処理に進むためwaitを入れています。
wget --no-check-certificate "https://localhost/cgi-bin/zm/nph-zms?mode=single&monitor=2&scale=100&maxfps=1&buffer=1000&user=[Zoneminderのユーザー名]&pass=[Zoneminderのパスワード]" -O $SNAPSHOTTMP1 2>/dev/null & wait
wgetのURLのうち、[Zoneminderのユーザー名] と [Zoneminderのパスワード] は実際のZoneminderのものに修正します。
あと、同じURL内に以下の「monitor=2」という箇所がありますが、これも取得したいモニターIDに修正します。
monitor=2
モニターIDはZoneminderのWebコンソールから確認すると「Id」の列にある数字です。
以下の箇所で1280x720pxに縮小しています。
外からスマホで確認するだけならこれくらいのサイズで良いかなと思います。
convert -geometry 1280x720 -quality 70 $SNAPSHOTTMP1 $SNAPSHOTTMP2
あと、一時ファイルに保存してから最後に置き換えをしていますが、ダウンロードなど処理中にアクセスされると壊れたjpgになるためです。
ロックファイルなどを使用した方が確実ですが、mvコマンドは一瞬で終わるので上記で問題ありませんでした。
おしまいです。
その他
よくあるトラブルと解決方法は以下にまとめました。
コメントフォーム