2018年1月22日月曜日

Raspberry PiでIPカメラのストリーミング画像を同時再生する

工場の設備監視用に安価なIPカメラを使うにあたって、録画までは必要無い場合、Raspberry PiでRTSPを再生できれば予算を抑えられて便利。
ということで、色々と調べてみたところ、こちらのホームページに、そのものズバリな内容が書かれていたので、参考にさせて頂いた。

とりあえずラズパイにOSを入れないことには始まらないので、オフィシャルサイトからRASPBIAN STRETCH LITEをダウンロードして、microSDカードにイメージをコピーすれば、OSのインストールは完了。ハードウェア決め打ちだと、この辺りの手間が無くて良い。

microSDをラズパイに挿入して、キーボード、マウス、LANケーブル、HDMI経由でモニターを接続して、電源ケーブルを挿せばRASPBIANが起動して、モニターにターミナル画面が表示される。
ユーザー名とパスワードを聞いてくるので、ユーザー名「pi」、パスワード「raspberry」と入力すればコマンドプロンプトに文字が入力できるようになる。

ネットワークの設定については環境によって異なるので、何とも言えないけれど、うちの環境ではDHCPでディフォルトゲートウェイとDNSがうまい具合に割り振られないようで、それらを明示してやる必要があった。
sudo nano /etc/dhcpcd.conf」でエディターを起動して、「static routers」と「static domain_name_servers」を環境に合わせて書き換える。
無事にインターネットに接続できるようになったので、「sudo apt-get update」とか「sudo apt-get upgrade -y」とか入力してみれば、問題無く動作しているのが確認できた。

あとは、上記のホームページを参考にしつつ、「sudo raspi-config」でSSHでアクセスできるようにしたり、GPUに割り当てるメモリーを増やしたり、microSDカードの領域を確保したり、パスワード変更したり、パスワード入力レスで起動するようにしたりする。
時間のローケーションは変えておいた方が良いけれど、環境ロケーションはEnglishのままの方が良いかもしれない。キーボード配列が英語キーボード準拠のままになるけど。

sudo reboot」でリブートして、次にプレイヤーをインストール。
sudo apt-get install omxplayer -y && sudo apt-get install screen && sudo reboot」と入力すれば、
omxplayerとscreenがインストールされて、その後リブートされる。
omxplayerはraspberry piの動画再生支援機能が使えるメディアプレイヤー。screenはコンソールを複数開くためのソフト。

自分で使うならscreenなんて無くても、omxplayerさえあれば、
omxplayer --avdict rtsp_transport:tcp --win "0 0 960 540" <rtsp IP address> --live -n -1 | \
omxplayer --avdict rtsp_transport:tcp --win "960 0 1920 540" <rtsp IP address> --live -n -1 | \
omxplayer --avdict rtsp_transport:tcp --win "0 540 960 1080" <rtsp IP address> --live -n -1 | \
omxplayer --avdict rtsp_transport:tcp --win "960 540 1920 1080" <rtsp IP address> --live -n -1
と、入力してやればFullHDのモニターに4分割でIPカメラの画像を確認する事は可能だ。
しかし、使うのは現場作業者であるから、家電並みに電源を入れるだけで使えるようにしておかなければならないし、リモートでメンテナンスできるようにしておかなければならない。
というわけで、やはり上記のホームページに書かれているようにスクリプトを組んで、cronでカメラの接続状態を一定時間毎に監視するようにするのがモアベターという事になる。
下のスクリプトは上記ホームページからの引用。該当するページが無くなってしまうとメモ代わりにならないので、転記しておく。
sudo nano /etc/init.d/displaycameras」でエディターを起動して、displaycamerasというテキストを作製する。
---------- 以下引用
#!/bin/bash
### BEGIN INIT INFO
# Provides: omxplayer
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Displays camera feeds for monitoring
# Description:
### END INIT INFO
# Camera Feeds & Positions
top_left="screen -dmS top_left sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"0 0 960 540\" <rtsp IP address> --live -n -1'";
top_right="screen -dmS top_right sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"960 0 1920 540\" <rtsp IP address> --live -n -1'";
bottom_left="screen -dmS bottom_left sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"0 540 960 1080\" <rtsp IP address> --live -n -1'";
bottom_right="screen -dmS bottom_right sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"960 540 1920 1080\" <rtsp IP address> --live -n -1'";
# Camera Feed Names
# (variable names from above, separated by a space)
camera_feeds=(top_left top_right bottom_left bottom_right)
#---- There should be no need to edit anything below this line ----
# Start displaying camera feeds
case "$1" in
start)
for i in "${camera_feeds[@]}"
do
eval eval '$'$i
done
echo "Camera Display Started"
;;
# Stop displaying camera feeds
stop)
sudo killall omxplayer.bin
echo "Camera Display Ended"
;;
# Restart any camera feeds that have died
repair)
for i in "${camera_feeds[@]}"
do
if !(sudo screen -list | grep -q $i)
then
eval eval '$'$i
echo "$i is now running"
fi
done
;;
*)
echo "Usage: /etc/init.d/displaycameras {start|stop|repair}"
exit 1
;;
esac
---------- 以上引用
として、保存する。rtspのアドレスの部分は各IPカメラによって異なるので、予め「ONVIF Device Manager」等を使用して調べておく事。
上記のスクリプトの権限設定を
sudo chmod 755 /etc/init.d/displaycameras
と変更して、下記コマンドにてスタートアップに追加する。
sudo update-rc.d displaycameras defaults
また、IPカメラの死活確認及び再接続を行う為に、
sudo crontab -e」で
*/5 * * * * /etc/init.d/displaycameras repair
といった感じで、スケジューリングしておく。上記の場合5分毎の確認となる。
上記のスクリプトを見ればわかると思うが、映像を止めたければ「/etc/init.d/displaycameras stop」で表示を停止する事ができる。
再スタートは「/etc/init.d/displaycameras repair」もしくは「/etc/init.d/displaycameras start

上記スクリプトは4分割同時再生のものだが、6分割同時再生の場合は、下記のスクリプトとなる。
---------- 以下引用
#!/bin/bash
### BEGIN INIT INFO
# Provides: omxplayer
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Displays camera feeds for monitoring
# Description:
### END INIT INFO
# Camera Feeds & Positions
#First Colmn
large_left="screen -dmS large_left sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"0 0 1280 720\" rtsp://192.168.1.168:7447/56fc759be4b01f1769f35f7f_1 --live -n -1'";
mid_lcenter="screen -dmS mid_lcenter sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"640 720 1280 1080\" rtsp://192.168.1.168:7447/56fc791fe4b01f1769f35fad_1 --live -n -1'";
bottom_left="screen -dmS bottom_left sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"0 720 640 1080\" rtsp://192.168.1.168:7447/56fc791fe4b01f1769f35fae_1 --live -n -1'";
#Second Colmn
top_right="screen -dmS top_right sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"1280 0 1920 360\" rtsp://192.168.1.168:7447/56fc795be4b01f1769f35faf_1 --live -n -1'";
mid_rcenter="screen -dmS mid_rcenter sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"1280 360 1920 720\" rtsp://192.168.1.168:7447/56de2e1888117cf574015d71_1 --live -n -1'";
bottom_right="screen -dmS bottom_right sh -c 'omxplayer --avdict rtsp_transport:tcp --win \"1280 720 1920 1080\" rtsp://192.168.1.168:7447/56de2e1888117cf574015d71_1 --live -n -1'";

# Camera Feed Names
# (variable names from above, separated by a space)
camera_feeds=(large_left mid_lcenter bottom_left top_right mid_rcenter bottom_right)
#---- There should be no need to edit anything below this line ----
# Start displaying camera feeds
case "$1" in
start)
for i in "${camera_feeds[@]}"
do
eval eval '$'$i
done
echo "Camera Display Started"
;;
# Stop displaying camera feeds
stop)
sudo killall omxplayer.bin
echo "Camera Display Ended"
;;
# Restart any camera feeds that have died
repair)
for i in "${camera_feeds[@]}"
do
if !(sudo screen -list | grep -q $i)
then
eval eval '$'$i
echo "$i is now running"
fi
done
;;
*)
echo "Usage: /etc/init.d/displaycameras {start|stop|repair}"
exit 1
;;
esac
--------- 以上引用
基本的にはomxplayerのwinオプションで大きさと場所を指定しているだけなので、ディスプレイの解像度や、画面レイアウトの変更も含めて、設定は煩雑ではあるものの、自由度は非常に高い。
ラズパイの性能に依存する部分もあるから、何画面まで同時に再生できるか分からないが、1ディスプレイ当たり4画面ぐらいが視認性の面でも良いのではないかと思う。
プレイヤーの設定については以上だが、IPカメラの設定について。
カメラの解像度は1080pの性能があったとしても960pもしくは720pに下げておく事。
自分の環境では1080pの解像度では何故か正常に動作しなかった。
まぁ、4分割表示なので1080pの解像度があっても、意味が無い上にネットワークトラフィックが増えるだけで害にしかならないから、解像度を下げて使う分には特に問題は無いだろう。
カメラの解像度の下げ方は、CMSやONVIF Device Managerを使うか、NVRを持っているなら、それで設定すると良いだろう。

因みにカメラ1台あたり、凡そ1~3Mbps弱の帯域を使用する。
VBRなので映像に動きが無ければそれ以下になる事もあるし、フレームレートや解像度、圧縮率等の設定で変動するが、多量のカメラを常時閲覧する場合はネットワークの経路を考えて、基幹系に影響を与えないように配慮する必要があるだろう。
また映像のタイムラグに関しては、IPカメラの設定次第だが凡そ1秒程度。
自社の製造ラインの監視に使うなら、それぐらいのラグは許容できる。 それが許容できないぐらいシビアな条件だと、そもそもIPカメラは使えないかな…
録画もしたい向きにはラズパイを使わず、素直にNVRを買いましょう。
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab
TechShare

Giantree POEスプリッタインジェクタアダプタケーブルワイヤイーサネットDC 5V IPカメラキット部品アクセサリ
Giantree

Dovewill 便利  実用  電源充電アダプタ  DCメス→オス  マイクロ USB  5.5 * 2.1mm  黒色
Dovewill

汎用ACアダプター用出力DCプラグ変換アダプター (5.5mm×2.1mm ⇒ microUSB, 商品1点)
サクル株式会社

A-ZONE 200万画素タイプ POE給電カメラ 防犯カメラキット 10.1インチモニター付き ネットワークカメラ 暗視撮影 cctvセキュリティカメラシステム 監視カメラ ナイトビジョン 防水カメラ ハイビョン HD NVRキット 屋内/屋外 クイックリモートアクセス 無料アプリ 遠隔監視対応 (ハードディスク無し)
ANSON(エンソン)

PoE IPカメラ SV3C 1080P IP 防犯カメラ 監視カメラ LAN&PoE 802.3af対応 屋外 15メートルナイトビジョン IP66防水性能 Iphone/Android/Tablets/Windows PC対応
SV3Cテクノロジー

NETGEAR レイヤー2スマートスイッチ ギガ10ポート(PoE8ポート15.4W/全体46W)/VLAN QoS ACL IGMP LAG/外部電源/無償永久保証 GS110TP-200AJS
ネットギア

Lovoski 2ピース IEEE 802.3af マイクロ USB アクティブ PoE スプリッタ パワー オーバー イーサネット 48V 12V  耐久性 互換性
Lovoski

0 件のコメント:

コメントを投稿