Raspberry Pi Zero W を使って、カメラ映像をリアルタイムでストリーミングする方法をご紹介します。
1.カメラを有効化
sudo raspi-config
sshで接続し、コマンドを実行し設定画面を開きます。
カメラオプションを探し、有効化しましょう。
最後に再起動して変更を反映させます。
コマンドを実行してカメラが認識されているか確認しておきましょう。
vcgencmd get_camera
supported=1 detected=1と表示されれば問題ありません。
2. UV4Lをインストール
まず、パッケージを追加します。
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add -
echo 'deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main' | sudo tee -a /etc/apt/sources.list
次に、パッケージをアップデートして、UV4Lをインストールします。
sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam uv4l-raspicam-extras
webRTCもインストールして使いやすくします。
sudo apt-get install uv4l-webrtc-armv6
* Pi1,Zero, Zero W は”uv4l-webrtc-armv6”ですが、Pi2, Pi3などは”uv4l-webrtc”です!
最後に再起動して準備完了!
sudo shutdown -r now
3.ブラウザでチェック
ブラウザを開いて、
http://raspberryip:8080/stream/video.mjpeg
にアクセスするとストリーミング動画が再生されます。
が、しかし!
動画がカクカクですね。
設定を変えて、スムーズに見れるようにしましょう。
4.コマンドを使ってUV4Lをスタート
まず、すでに走っているUV4Lをストップします。
sudo pkill uv4l
次に、好みのオプション設定でUV4Lをスタートします。
uv4l --auto-video_nr --driver raspicam --encoding mjpeg --server-option '--port=8080' --width 640 --height 480
私の環境では、遅延が0.3秒ぐらい。
ロボットからの映像を確認するには十分です!
5. 設定ファイルを変更
Raspberry pi zero w を起動するたびにuv4lを終了し、好みのオプションでコマンドから再度起動するのは面倒ですよね。
そこで、設定ファイルを変更して、好みのオプションで最初から起動するようにしましょう。
エディタでuv4l-raspicam.confを開いて設定を変更します。
sudo nano /etc/uv4l/uv4l-raspicam.conf
私は画像サイズを小さく変更しました。
width = 640 height = 480
これで、Raspberry Pi Zero W を起動するだけでストリーミング動画をリアルタイムでブラウザから見れるようになりました!!!
6.UV4Lをストップ
sudo pkill uv4l
UV4Lを終了してからRaspbianをShutdownしましょう。
そうしないと、RaspbianのShutdownがうまく処理されず、Raspbianが再起動されなかったり、無理やり電源を切って終了させないといけなくなってしまいます。
<トラブルシューティング>
Raspbianが固まる
デフォルト設定のまま高画質の映像をストリーミングしているとたまにSSHが切断され、Piにアクセスできなくなることがあります。
画像処理用のメモリースペースが足りなくなっていることが原因のようです。必要に応じてGPUメモリーの割り当て容量を増やすか、画像サイズを小さくしましょう。
ストリーミングされない
http://raspberryip:8080/stream
このURLを試して、ストリーミングできるなら、”uv4l-webrtc”のバージョンが間違ってます。ステップ2でも書きましたが、Pi1,Zero, Zero W は”uv4l-webrtc-armv6”ですが、Pi2, Pi3などは”uv4l-webrtc”です!
アンドロイドでWebViewを使うと表示サイズがおかしい
http://raspberryip:8080/streamからストリーミング用HTMLを拾ってくると、ブラウザでは指定した大きさで表示されるのに、アンドロイドのWebViewで表示サイズが設定サイズより大きく表示されます。これは、参照先HTML内のViewportの設定が間違っているからです。
こっちのURLだと、WebViewで指定した画像サイズで表示できました。
http://192.168.3.10:8080/stream/video.mjpeg
h264の場合は、
http://192.168.3.10:8080/stream/video.h264
ただ、よくわからないのが設定ファイルでエンコーディングをmjpegに指定していてもvideo.h264に繋がるんですよね。このURLをリクエストした時点でエンコーディングの設定をサーバー側で変更してるのかな???