一通り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カメラが良い、でした。
コメントを残す