Raspberry PiのCamera moduleとWebカメラでStreamingを行う

一通りRaspberry Piのカメラモジュールを試したので、今回はStreamingを試します。

Raspberry PiのCamera moduleでストリーミングを行う

ネット情報をあさること数時間。

いろいろ比較検討した結果、MJPG-Streamerを使うのが一番無難らしいので、とりあえずその方法でRaspberry PiのCamera moduleでのストリーミングを試してみます。

参考 How to build and run MJPG-Streamer on the Raspberry Pi

Raspberry Piから

sudo apt-get install libjpeg8-dev imagemagick libv4l-dev
sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-182.zip
unzip mjpg-streamer-code-182.zip
cd mjpg-streamer-code-182/mjpg-streamer
make mjpg_streamer input_file.so output_http.so
sudo cp mjpg_streamer /usr/local/bin
sudo cp output_http.so input_file.so /usr/local/lib/
sudo cp -R www /var/www/mjpg
mkdir /tmp/stream
raspistill --nopreview -w 640 -h 480 -q 20 -o /tmp/stream/pic.jpg -tl 200 -t 9999999 -th 0:0:0 &

低画質で200msごとに写真を撮ってストリーミングのようにする。

ちなみにここで* failed to open vchiq instanceと出てくる人は、piユーザではなく新しくユーザを作った人です。sudoで実行してもいいですが、新しく作ったユーザにcameraを使えるようにグループに追加しましょう。

usermod -a -G video new_username

raspistillを実行すると下記のコードがひたすら表示される場合があります。私の場合はそうでした。とりあえず一旦無視します。

mmal: Skipping frame 207 to restart at frame 211
mmal: Skipping frame 212 to restart at frame 217
mmal: Skipping frame 218 to restart at frame 222
mmal: Skipping frame 223 to restart at frame 228
mmal: Skipping frame 229 to restart at frame 233
mmal: Skipping frame 234 to restart at frame 238

新しくSSHで接続して下記のコマンドを入力

LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /var/www/mjpg"

ブラウザーで下記にアクセス
http://自分のラスベリーパイのIPアドレス:8080/stream_simple.html

ファイアウォールをしている人は、

sudo ufw add 8080
sudo ufw reload

ブラウザーでアクセスすると、
ストリーミングが行われています。

ただし、ものすごくカクカク。

200msごとに画像が送られてストリーミングみたくなっているはずなのですが、
カクーカクーすぎてストリーミングとは呼べない代物になっています。

ここで上記で無視したメッセージの登場です。
mmal: Skipping frame 207 to restart at frame 211
mmal: Skipping frame 212 to restart at frame 217

フレームをスキップしています。
つまり200msごとに写真(フレーム)を撮っているはずなのに、
何かしらの原因で撮れずに4つほどスキップしています。

つまり200msごとの写真が、1sごとの写真になっていると。

画像が大きすぎるのかと思って、320x240に切り替えました。

raspistill --nopreview -w 320 -h 240 -q 20 -o /tmp/stream/pic.jpg -tl 200 -t 9999999 -th 0:0:0 &

効果なしです。

画質をさらに悪くしてみました。

raspistill --nopreview -w 320 -h 240 -q 5 -o /tmp/stream/pic.jpg -tl 200 -t 9999999 -th 0:0:0 &

効果なしです。

ファームウェアのアップデートを行いました。
効果なしです。

CPUオーバークロックがマズイのかと思って、オーバークロックをなしにしました。
効果なしです。

ちなみにraspistillは9,999,999ms続くので、止めたい場合は下記のようにkillするしかありません。

pgrep raspistill
sudo kill raspistillのprocess_id
netstat -tulpn| grep :8080
sudo kill 8080をListenしているprocess_id

結論を言うと、カクカクを解消できませんでした。
超時間かけましたが、どうにもカクカクがなくなりません。

1つだけ疑念があるのは、Raspberry Piの電圧不足?

iPhoneの充電アダプタ(5V1A)を使っているのですが、
Raspberry PiのTP1とTP2を計ってみるとカメラ停止でも4.74Vしかありません。

カメラを動かすと4.65Vになります。

4.7Vくらいを切ると不具合がでる可能性があるということで、
電圧不足が原因でカクカクが起きている可能性があります。

噂によるとRaspberry Piの充電アダプタは5.25V1Aが良いらしい。
ちなみに手元にあったiPhoneの充電アダプタ5V1Aとそのへんにあった5.1V1Aの充電アダプタではダメでした。

電圧不足はぶっちゃけ6V(または5.5V)1Aの充電アダプタにしてしまえばいい気がする。
どうなるかは自己責任で。。

そもそも電圧不足が原因でカクカクしているのかというと、
微妙な気がする。

カメラモジュールの仕様な気がします。

試行錯誤の結果、raspistillの最高連写間隔時間は650msくらいっぽいです。

raspistill --nopreview -w 640 -h 480 -q 20 -o /tmp/stream/pic.jpg -tl 650 -t 9999999 -th 0:0:0 &

画像が大きかろうが画質が良かろうが、650ms前後を切ると、フレームがスキップしだします。

650msのストリーミングは普通にカクカクです。

Camera moduleではストリーミングをしないほうがいい気がします。

ある一定間隔で写真を撮ったり、何かのセンサーに引っかかったときに写真を撮るなどの場合にカメラモジュールを使うのが本来の使い方っぽい気がします。raspistillで滑らかなストリーミングをしようとするのは無理な気がします。できる人いたら教えてー。

あと、写真を撮る=SDカードに書き込む、なので200msごとに写真を撮っていたらSDカードの寿命がやばいことになりそうな気がします。何かしらの回避策(RAMディスクを使うとか何とか)で超連続連写は計画的に行うべきかと思います。

ということで、
Camera moduleでのストリーミングはあきらめました。

Raspberry PiにWebカメラをつなげてストリーミングを行う

昔買ってモニタの上でホコリをかぶっていたWebカメラを拝借してきました。

Logicoolのc200、30万画素。値段忘れた。たぶん1500円くらいだった?

参考 Raspberry Pi + mjpg-streamerでwebcam動画配信

sudo apt-get install subversion libjpeg-dev imagemagick
svn co https://svn.code.sf.net/p/mjpg-streamer/code mjpg-streamer
cd mjpg-streamer/mjpg-streamer
make
./mjpg_streamer -i "./input_uvc.so -f 2 -r 320x240 -d /dev/video0 -y" -o "./output_http.so -w ./www -p 8080"

ブラウザーで下記にアクセス
http://自分のラスベリーパイのIPアドレス:8080/stream_simple.html

おー、あっけなく動いたー。
カクカクしてるけど前よりまし。

フレームレート(2→10)を変えて画像も大きくする

./mjpg_streamer -i "./input_uvc.so -f 10 -r 640x480 -d /dev/video0 -y" -o "./output_http.so -w ./www -p 8080"

おー、カメラモジュールではあんなに苦労して結局できなかったので、
Webカメラだとあっけなく滑らかに大きな画面でストリーミングされるよー。

640×480の画像が1秒間に10フレーム流れる。

CPUの使用率は70%
たぶん長時間使ったら熱暴走する。というか数ヶ月で故障するんじゃないかな?

640×480の画像で1秒間に5フレームにするとCPUの使用率は40%。
40%でも危ない気がする。
それに1秒間に5フレームはカクカクしてブレる。

480×320の画像で1秒間に10フレームにするとCPUの使用率は28%。
30%を切る感じ、大丈夫なような微妙な感じ。
ヒートシンクをつければ安心できるかな?

ちなみに480×320の画像で1秒間に5フレームにするとCPUの使用率は14%でした。

お勧めはWebカメラで480×320の画像で1秒間に10フレーム、
ヒートシンクをつけるといいかもでした。

下記のコードでmjpg streamerが電源投下時に自動起動します。

sudo vim /etc/rc.local
cd /home/username/mjpg-streamer/mjpg-streamer
./mjpg_streamer -i "./input_uvc.so -f 8 -r 640x360 -d /dev/video0 -y" -o "./output_http.so -w ./www -p 8080" &

ということでRaspberry Piで動画をWebなどにストリーミングする場合は、Camera moduleではなくWebカメラが良い、でした。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください