RaspberryPi Zero W と libcamera で MJPG-Streamer

はじめに

以前 ffmpeg で映像と音声をストリーミングできないか試行錯誤してみたが,RPI Zero が貧弱過ぎて惑星間通信並の遅延で使い物にならないという話を書いた.RPI4 とか高性能なものを使えば改善されると思われるが,カムロボに組み込む都合上 RPI Zero 以外に選択肢がなく,ffmpeg より軽量な代替案を模索していた.

今回はかくかくしかじかで思い立ったので,音声部分は一旦捨てて,MJPG-Streamer で映像のみのストリーミングを試してみる.

MJPG-Streamer 導入

環境は次の通り.

$ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
$ uname -r
5.15.61+
$ cat  /sys/firmware/devicetree/base/model 
Raspberry Pi Zero W Rev 1.1

今回利用するソースはこれ.未だに多くの記事ではレガシーカメラを利用した方法を紹介しているが,このソースでは libcamera 用の入力モジュールもビルドしてくれる.

GitHub - ArduCAM/mjpg-streamer: Fork of http://sourceforge.net/projects/mjpg-streamer/
Fork of - ArduCAM/mjpg-streamer

ただし,このままのソースだとカメラを横向き等に設定した際に画像回転させるオプションが実装されていない.ということで画像回転オプションを実装したものがこちら.プルリクエストしてみたのでいずれマージしてもらえるかもしれない.

GitHub - HeavyMoon/mjpg-streamer: Fork of http://sourceforge.net/projects/mjpg-streamer/
Fork of - HeavyMoon/mjpg-streamer

導入を進めていく.

必要なパッケージをインストールする.libcamera-dev をインストールしてからビルドすれば make するときにライブラリを検出して libcamera 用の入力モジュールをビルドしてくれるようになる.

$ sudo apt install cmake libjpeg-dev libcamera-dev
$ git clone https://github.com/HeavyMoon/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental/
$ make
<中略>
-- The following features have been enabled:

 * PLUGIN_INPUT_FILE, File input plugin
 * PLUGIN_INPUT_HTTP, HTTP input proxy plugin
 * PLUGIN_INPUT_UVC, Video 4 Linux input plugin
 * PLUGIN_INPUT_LIBCAMERA, Libcamera input plugin     # libcamera プラグインが有効になってる
 * PLUGIN_OUTPUT_FILE, File output plugin
 * PLUGIN_OUTPUT_HTTP, HTTP server output plugin
 * PLUGIN_OUTPUT_RTSP, RTSP output plugin
 * PLUGIN_OUTPUT_UDP, UDP output stream plugin
<中略>

特にエラーもなくビルドが完了すると input_libcamera.so も生成されているはず.mjpg_streamer を実行する.

$ ./mjpg_streamer -i "input_libcamera.so -rot 180" -o "output_http.so -l 0.0.0.0 -p 8081"

ブラウザから接続する URL は次の通り.

URLメモ
http://$(IP ADDR):$(PORT)/?action=streamM-JPEG stream
http://$(IP ADDR):$(PORT)/?action=snapshotJPEG snapshot

動かしてみた感じ.音声はないものの,遅延は 1 秒程度で ffmpeg よりかなり安定して早い.

が,mjpg_streamer のプロセスだけで CPU 使用率が 90% オーバー.低遅延なのはありがたいけど,RPI Zero にはちょっとつらいかも.

おわりに

RaspberryPi OS Bullseye の libcamera で mjpg-streamer の使い方を整理した.

RPI Zero だと CPU 的に辛いので RPI Zero 2 早く流通量増えてくれないかなぁ.

コメント

タイトルとURLをコピーしました