Raspberry Pi 4 と mjpg-streamer でウェブカメラ配信する

Raspberry Pi 4 にカメラモジュールを CSI 接続したものの、はて、このカメラで何をしようかなーと思っていた。というか、カメラの映像が外から確認できないことには使い勝手悪いよなー。ウェブ配信できるといいなー。

そう思って調べたところ、mjpg-streamer というツールで配信ができるらしいので、試してみた。

目次

mjpg-streamer をインストールする

インストールする mjpg-streamer は、ラズパイに対応した以下の Fork 版を使う。

# 依存モジュールを先にインストールしておく
$ sudo apt-get install -y cmake libv4l-dev libjpeg-dev imagemagick

# Git リポジトリを Clone する
$ git clone https://github.com/jacksonliam/mjpg-streamer.git

# 以下のディレクトリに移動する
$ cd mjpg-streamer/mjpg-streamer-experimental

# make してインストールする
$ make
$ sudo make install

# 以下にインストールされている
$ cd /usr/local/lib/mjpg-streamer
$ ls -l
-rw-r--r-- 1 root root 17928 2020-11-29 14:49 input_file.so
-rw-r--r-- 1 root root 18604 2020-11-29 14:49 input_http.so
-rw-r--r-- 1 root root 39248 2020-11-29 14:49 input_raspicam.so
-rw-r--r-- 1 root root 50844 2020-11-29 14:49 input_uvc.so
-rw-r--r-- 1 root root 18752 2020-11-29 14:49 output_file.so
-rw-r--r-- 1 root root 35892 2020-11-29 14:49 output_http.so
-rw-r--r-- 1 root root 13264 2020-11-29 14:49 output_rtsp.so
-rw-r--r-- 1 root root 13656 2020-11-29 14:49 output_udp.so

こんな感じ。

mjpg-streamer を実行する

mjpg-streamer を実行する時は以下のように叩く。

$ cd /usr/local/lib/mjpg-streamer
$ mjpg_streamer -o './output_http.so -w ./www -p 8080' -i './input_raspicam.so -x 640 -y 480 -fps 30 -q 10'

なんとなく分かると思うが、-i オプションでラズパイに接続されているカメラを取得して、解像度や画質を指定している。-o は HTTP サーバを 8080 ポートで起動して、そこに出力している、ということ。

出力されているページを見るには、ブラウザで以下の URL を開く。クエリパラメータが必要なので注意。

ほとんどラグなく表示されている。

動いている様子

右半分にカメラの様子が映っている

ラズパイ以外の PC から参照する時は、localhost 部分をラズパイの Private IP に変えてやれば良い。ローカルネットワーク内であれば、目立った遅延もなく、ほぼほぼ 30fps を維持している。以下の動画で実際の挙動を見ていただける。

自分は今のところ LAN 内で見えていれば良いので試さなかったが、ルータからラズパイへのポートを開放するか、ngrok 等でトンネルを作ってやれば、インターネット公開もできるだろう。