前回に引き続きPi Zero rev1.3ネタです。
rev1.3を使うからには、増設されたPi Cameraコネクタを使ってナンボでしょう!
という事で、今回はPi Cameraモジュールを使って無線LANなミニマムなネットワークカメラにしてみようと思います。
<ご参考>Pi Zeroで5GHz WiFiなGW-450D2を使える様にしたお話。
【2017/09/21追記】
2017年版として、もっと小型のPi Zeroカメラシステムを公開しました。詳しくはコチラ↓
Piをネットワークカメラとして使う方法いろいろ
ネットワークカメラソフトウェアを使えば、ネットワークカメラに早変わりです。
Raspberry Piで動くモノも幾つかあるみたい。
Motion
公式リンクはコチラ。
動態検知などの機能がある様で、監視カメラ用途に使えそう。
Pi Zeroでも動作しました。遅延も少ないです。
但し、監視カメラ用途でデフォルトでストレージアクセスが頻繁な為、microSDカードの寿命を気にして今回は採用せず。
設定でストレージキャッシュ書き込み無しに出来そうではありましたが、追求してません。
GStreamer
公式リンクはコチラ。
ストリーミング用途で圧縮されるのか、遅延が大きい。
Pi Zeroで安定させて動作できなかったので、現状では採用せず。
mjpg-streamer
githubリンクはコチラ。
昔のデジカメや低価格ネットワークカメラなどの採用されているMotion JPEG(MJPEG)を使ってるので、CPUパワーがそれほど必要なく低遅延。
今回採用した方式です。
必要なモノの準備
先日用意したPi Zero rev1.3 & GW-450D2周り以外に必要なモノはこれだけ。
Pi Camera v2.1
別に最新のv2.1じゃなきゃいけない理由は有りません。単に私がv2.1で試したというだけです。
公式Piカメラの通常タイプ(v2.1)
公式Piカメラの赤外線対応(赤外線フィルタ無し)タイプ(v2.1)
Pi Zero専用フレキケーブル
残念ながら、Pi Cameraに同梱されてるフレキは使えません。
Pi Zero rev1.3とPi Cameraを繋ぐには、Pi Zero専用のフレキが必要です。
作業概要
トランジスタ技術の2016年11月号でRaspberryPiとPi Cameraモジュールを使った特集があり、参考にさせて頂きました。
しかし、トラ技にこんな記事が載るとは・・・時代を感じます。(笑)
また、コチラのサイトの情報も参考にさせて頂きました。有難うございます。m(__)m
大雑把な流れになりますが、こんな感じです。
- Pi Cameraを接続し、コンフィグでアクティブ化
- mjpg-streamerのインストール
- 配信画質設定と自動起動の設定
- ネットワーク視聴確認
では作業を進めましょう。
Pi Cameraを接続し、コンフィグでアクティブ化
Pi Cameraを接続する
Pi Cameraとフレキを繋ぎます。
フレキには裏表有りますので向きに注意しましょう。この向きになる様に繋ぎましょう。
っと、剥き出しだと万が一接触ショートして壊れる危険もありますので、ケースに入れておきます。
Pi Zero専用ケース(rev1.3対応)はコチラ↓
Pi Camera専用ケースはコチラ↓
尚、Pi Camera専用ケースに収めるには、穴からフレキを通してから繋ぐ必要が有ります。
うん、凄いミニマム感。(笑)
一通り接続出来たら、起動させてSSH接続しましょう。
初期設定を行う
続いて、下記コマンドで初期設定を行います。
$ sudo raspi-config
下記の項目を修正してください。
[Enable Camera]
Pi Cameraをアクティブにします。
以上の項目を修正したら、Finishを選んで再起動しましょう。
mjpg-streamerのインストール
再起動したらもう一度SSH接続します。
Pi Cameraがアクティブになっているか確認する
フレキ接続のミスや、初期不良などの可能性もありますので、念の為に。
$ vcgencmd get_camera
正しく動いているなら下記の様に返ってくる筈です。
supported=1 detected=1
mjpg-streamerをインストールする
下記コマンドを実行します。
$ sudo apt-get update $ sudo apt-get install libjpeg9-dev cmake $ sudo git clone https://github.com/jacksonliam/mjpg-streamer.git mjpg-streamer $ cd mjpg-streamer/mjpg-streamer-experimental $ sudo make $ cd $ sudo mv mjpg-streamer/mjpg-streamer-experimental /opt/mjpg-streamer
補足すると、「libjpeg9-dev」は、JPEGイメージファイルの読み書きをするアプリケーションだそうで。
「mjpg-streamer」は、今回のメイン動画ストリーミングアプリケーションで、「mjpg-streamer-experimental」は、「mjpg-streamer」をPi Camera対応にしたアプリケーションで、オプショナルなのかコンパイルしないと使えないという事みたい。
配信画質設定と自動起動の設定
mjpg-streamerの設定スクリプトを作成する
下記コマンドで、配信画質を設定するスクリプトファイルを新規作成します。
$ sudo vi /home/pi/start_stream.sh
下記の内容をコピーして保存終了させてください。
#!/bin/bash if pgrep mjpg_streamer > /dev/null then echo "mjpg_streamer already running" else LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_raspicam.so -fps 15 -q 50 -x 640 -y 480" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www" > /dev/null 2>&1& echo "mjpg_streamer started" fi
スクリプトの赤字部分は下記のパラメータを挿してます。お好みに合わせて修正してください。
-fps 15 で、1秒当たりのフレーム数を指定しています。
-x 640 -y 480 で、解像度を指定しています。
-q 50 で、JPEGの品質を指定しています。(1~100)
-p 9000 で、配信するポート番号を指定しています。
スクリプトが自動起動する様に設定する
先程のスクリプトを「/etc/rc.local」に追記します。
$ sudo vi /etc/rc.local
最終行「exit 0」の前の行に、下記を差し込みましょう。
sh /home/pi/start_stream.sh
書込み後保存終了したら、一度再起動させます。
$ sudo reboot
ネットワーク視聴確認
ここまでうまく行っていれば、再起動後にブラウザで「PiのIP:9000」にアクセスしてみましょう。
例:http://192.168.xx.xx:9000
※赤字はPi Zero(GW-450D2)のIPアドレスに読み替えて下さい。
こんな感じに見えてる筈です。(Streamを選択すると動画、Staticは静止画です)
※キャプチャ時は画面回転させて正位置にしてあります。
尚、本記事では、宅内ネットワーク止まりとなっております。
外出先でも見れる様にするには、セキュリティ対応などもうひと手間必要なので、また改めて。
(参考データ)画質設定によるデータ転送量の比較
ネットストリーミングでスループット10Mbps程度で抑えれて、画質が良い組み合わせを探したいと思います。
先程の画像のと違って、赤外線対応タイプのPi Cameraでキャプチャしたので、画像がやや赤っぽいですが、ご容赦を。
マクベスチャートとかあれば比較しやすいのですが・・・流石に持ってないのです。(;´・ω・)
作業台に置いて映しただけなので、対象の画像がイマイチなのはお目こぼし下さい。m(__)m
VGA(640×480)、15fps、JPEG品質100
Windows10のタスクマネージャー読みで、スループットは21Mpbs程度。
静止画キャプチャしたJPEG画像は品質100だけにかなりクッキリしてる。
VGA(640×480)、15fps、JPEG品質50
18Mpbs程度。
VGA(640×480)、15fps、JPEG品質25
11Mpbs程度。
VGA(640×480)、15fps、JPEG品質10
VGA(640×480)、15fps、JPEG品質5
VGA(640×480)、15fps、JPEG品質1
800k~1Mpbs程度。 設定再下限だけに、画質はモザイク画像レベルまで超絶劣化。(笑)
ということで、品質設定は10程度でも画質劣化を気にせずに使えそう。
(撮影対象によって差がある可能性有ります)
続いて、品質設定10のまま、解像度を上げてみる。
SXVGA(1280×960)、15fps、JPEG品質10
HD(1280×720)、15fps、JPEG品質10
9Mbps程度。 16:9だと左右が広がるかと思いきや、上下がトリミングされただけだった。(笑)
FullHD(1920×1080)、15fps、JPEG品質10
17Mbps程度。 HDと同じ16:9なのにトリミング量が増えてる・・・謎です。
という事で、11Mbpsと実用的なレベルで最大画角になる設定は「SXVGA(1280×960)、15fps、JPEG品質10」でしょうか。
もっとも、外出先からモバイルで視聴とか出来る様にするには、3~5Mbps程度には抑えないとパケ死しそう。(笑)
ちなみに、Raspberry PiのGPUにはH.264のハードエンコーダーが載ってるみたいなので、コレが活用できるとCPUパワーも抑えれてデータ帯域も抑えれてと万々歳なんですが、まだ使える状況には辿り着いてません。
CPU温度とのバランスも必要
「SXVGA(1280×960)、15fps、JPEG品質10」設定で放置してみたところ、CPU温度が結構上がってました。
下記コマンドでCPU温度を見る事が出来ます。
$ vcgencmd measure_temp
とすると下記の様に出てきました。
temp=54.1’C
Pi Zeroをケース入れた状態で、30分程放置してこの温度でした。
ちょっと危険域かもしれませんので、フレームレートを15fpsから10fpsへ落としたところ、11Mbpsから7~8Mbpsへ転送量が落ち、温度も50℃付近へやや落ちてくれました。
謝辞
参考にさせて頂いた諸々のサイトリンクです。
mjpg-streamerのインストールについて、参考にさせて頂きました。
同じく、mjpg-streamerのインストールについて、参考にさせて頂きました。
CPU温度を測る方法について、参考にさせて頂きました。
動画コーデックの種類と違いについて、参考にさせて頂きました。
有難うございました。m(__)m
トランジスタ技術2016年11月号
公式Piカメラの通常タイプ v2.1
公式Piカメラの赤外線対応(赤外線フィルタ無し)タイプ v2.1
新型Pi Zero(ver1.3)のセット
Pi Zero用カメラケーブル
コメント
素晴らしい記事をありがとうござます。私はこの記事を参考にしてPi Zero Wを用いて実験してみました。オンボードの2.4GHz Wi-Fiでストリーミングしてみましたが、1920×1080 15fps、JPEG品質10でも途切れなく配信できるのに驚いています。すごくお安く、しかも満足すべき性能が出るネットワークカメラですね。
当方3Dプリンターを持ち合わせていませんので、ラズパイ財団オフィシャルのケースに押し込んで使っています。SDカードの部分は削ってスリットを開け、無理やりメモリー交換可能にしました。
ストリーミングのビットレートは21.4Mbps程度です。寒いせいかCPU温度は56.7度cくらいで安定しています。
Raspberry PiのGPUにはH.264のハードエンコーダーが載ってるのでこれが使えるようになれば、もっと快適な利用状況になると思いますが、その辺の解が出てくるのを心待ちにしています。
ご本家のmjpg-streamerチーム内でもその辺の開発が進んでいないようなので、やっぱり難しいんだろうなあ。
林さん コメント有難う御座います。
mjpg-streamerでH.264ハードエンコーダーが使えると良いんですがねぇ・・・。
上手く動かす方法はまだ追及出来てません。
林さんは、Pi Zero Wをお使いなんですね~。
ちなみに、私もPi Zero Wで新たなネットワークカメラを構築しております。
新しいネットワークカメラシステムは録画前提になってますが、このブログ内にて投稿してますので、興味がおありであればそちらも参照頂けると幸いです。m(__)m