camera

Raspberry PiでMJPG-Streamerを使って監視カメラを作ってみよう

2022年7月31日

Raspberry PiでMJPG-Streamerを使って監視カメラを作ってみよう

こんにちは。ポン吉です。

今回はMJPG-Streamerの使い方を紹介します。下記、スマートホームでの監視カメラの作り方の子記事になります。こちらの記事もあわせて参照してみてください。

 
ラズパイでカメラを使う場合のソフトウェアは「MJPG-Streamer」「Motion」の2つが主流です。MJPG-Streamerはネット情報が古く、最新OS(Bullseye)で動かせない人が多発している状況。

ネットの手順通りにやっても全然動かねーぞコラぁ!!怒

読者
ポン吉

そんなMJPG-Streamerに関するお悩みを解決します!

ラズパイ監視カメラ
MJPG-Streamerのセットアップ方法
監視カメラmjpg-streamer motion
MJPG-Streamerの性能チューニングやサービス組み込み方法

 

今回の記事を読めばラズパイでMJPG-Streamerを使うノウハウをバッチリ身につけられます!

今回のテーマはこちら!

  • MJPG-Streamerのセットアップ方法を紹介 ※最新OS Bullseye対応!
  • ストリーム動画配信で高フレームレートを出すためのチューニングノウハウを紹介
  • スマートホーム監視カメラとして本番運用時のトラブル事例とその対策について紹介

 

それではやってみましょう~♪

MJPG-Streamer セットアップ方法

ラズパイ監視カメラ

MJPG-Streamerとは?

MJPG-Streamerは、Linux互換カメラの映像をWeb配信するためのアプリケーションです。カメラから直接JPEGデータを生成し、リアルタイムに高速なMJPGストリームを出力します。

MJPG-Streamerにより出力される動画は、ネットワーク経由でChrome、Safari、FirefoxなどのブラウザやVLC、mplayerのアプリで簡単に見ることができます。

もともと、CPUやメモリリソースの少ない組み込みデバイス向けに作成されたアプリです。ラズパイZeroのように小リソース機器で動画配信させるにはMJPG-Streamerがイチオシです。

mjpg-streamer-home

 
MJPG-Streamerは動作が軽量な分、動体検知などの機能はありません。動体検知が不要な「ペット監視カメラ」「子守カメラ」などで使いましょう。動体検知させたい人はMJPG-StreamerではなくMotionを使いましょう。下記にてMotionの詳細記事を記載していますので、こちらも参考にしてみてください。

 

MJPG-Streamerのセットアップ

セットアップ
ポン吉

難易度:★★☆☆☆

最新のRaspberry Pi OSでのセットアップ手順をまとめました。以前のOS(Buster以前)から手順が変わっていますので注意してください。

MJPG-Streamer本家のプロジェクトは既に開発停止。有志の開発者が本家ソースをフォークしてMJPG-Streamerを公開しています。これまでラズパイ用のMJPG-StreamerとしてはjacksonliamさんのMJPG-Streamerが主に使われてきました。

しかし、こちらのソースでは、最新ラズパイOS(Bullseye)に対応していない状況です…

makeしたのに input_raspicam.so のファイルがない!ムキー!!

読者
ポン吉

最新ラズパイOS(Bullseye)で動作するGitHubを探してみました!

いろいろ調べてみたところ、下記GitHubのソースであればラズパイの最新OSでも動作確認することができました。以降、こちらのGitHubのソースを使ってセットアップ手順を紹介していきます。

 
ネットで手順を検索すると「libjpeg8-dev」をインストールするような記載が大半ですが、最新ラズパイOS(Bullseye)では「E: Package 'libjpeg8-dev' has no installation candidate」とエラーになります。そこで、下記のように「libjpeg-dev」 をインストールして先に進みましょう。

sudo apt update
sudo apt install -y git cmake libjpeg-dev
cd ~/
git clone https://github.com/neuralassembly/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make
sudo make install
ポン吉

最後のsudo make installは正直いらないかな・・と思います

基本的にパス指定して実行するからなぁ

読者

また、ラズパイ専用カメラモジュールを使う場合、OSの設定でレガシーカメラモードをオンにする必要があります。こちらは下記コマンドで一発変更して再起動します。

sudo raspi-config nonint do_legacy 0
sudo reboot

以上でセットアップは完了です。

MJPG-Streamerのチューニングノウハウ

コーディング・チューニング

MJPG-Streamerのオプション設定

MJPG-Streamerには設定ファイルが存在しません。すべてコマンド引数として設定項目をプログラム側に渡す必要があります。更に「-i」 や「-o」のオプションで指定した.soファイルについてもオプションが存在します・・・うーん ややこしい

まず「-i」オプションで指定する.soファイルは「ラズパイ専用カメラモジュール」と「USBカメラ」で違うファイルを指定する必要があります。それぞれ起動方法を紹介します。

ラズパイ専用カメラモジュールを使う場合 (input_raspicam.so)

cd ~/mjpg-streamer/mjpg-streamer-experimental
mjpg_streamer -o './output_http.so -w ./www -p 8080' -i './input_raspicam.so -x 1920 -y 1080 -fps 30 -q 10'

ラズパイ専用カメラモジュールのオプション設定

ややこしいのですが -i './input_raspicam.so XXXXXX' というXXXXXX部分に指定するオプションの説明です。

[-fps | --framerate]…:ビデオのフレームレートを設定します デフォルトは5フレーム/秒
[-x | --width]……..:フレームキャプチャの幅 デフォルトは640
[-y | --height]……..:フレームキャプチャの高さ デフォルトは480

[-quality]………….:JPEG品質を0-100に設定します デフォルトは85
[-usestills]………..:ビデオモードの代わりに静止画モードを使用します
[-preview]………….:フルスクリーンプレビューを有効にします

-sh:画像のシャープネスを設定します(-100〜100)
-co:画像のコントラストを設定します(-100から100)
-br:画像の明るさを設定します(0〜100)
-sa:画像の彩度を設定します(-100〜100)
-ISO:キャプチャISOを設定します
-vs:ビデオ安定化をオンにします
-ev:EV補正を設定します
-ex:露出モードを設定します(off, auto, night, nightpreview, backlight, spotlight, sports, snow, beach, verylong, fixedfps, antishake, fireworks から選択)
-awb:AWBモードを設定します(off, auto, sun, cloud, shade, tungsten, fluorescent, incandescent, flash, horizon, greyworld から選択)
-ifx:画像効果を設定します(none, negative, solarise, sketch, denoise, emboss, oilpaint, hatch, gpen, pastel, watercolour, film, blur, saturation, colourswap, washedout, posterise, colourpoint, colourbalance, cartoon から選択)
-cfx:カラー効果を設定します(U:V)
-mm:メータリングモードを設定します(average, spot, backlit, matrix から選択)
-rot:画像の回転を設定します(0-359)
-stats :各画像の画像統計を計算します(ノイズを減らします)
-drc:ダイナミックレンジ補正レベル(off, low, med, high から選択)
-hf:水平フリップを設定します
-vf:垂直フリップを設定します

太字のオプションあたりを意識しておけば大丈夫だと思います。

-quality の設定値が大きいとフレームレートが落ちカクカクになります。正直、品質落としても見た目ほぼ変化を感じません。-q 10 など低めの値を設定し、30fps高フレームレートで動画配信させる設定がオススメです。

USBカメラを使う場合 (input_uvc.so)

cd ~/mjpg-streamer/mjpg-streamer-experimental
mjpg_streamer -o './output_http.so -w ./www -p 8080' -i './input_uvc.so -d /dev/video1 -r 1920x1080 -fps 30 -q 10'

USBカメラのオプション設定

ややこしいのですが -i './input_uvc.so XXXXXX' というXXXXXX部分に指定するオプションの説明です。

[-d | --device] …….:ビデオデバイスを指定
[-r | --resolution] …:ビデオデバイスの解像度
 次の文字列のいずれかになります。QSIF QCIF CGA QVGA CIF VGA SVGA XGA SXGA
 または次のようなカスタム値を指定します。 例:640x480
[-f | --fps] ……….:1秒あたりのフレーム数
(YUYV形式の場合有効、MJPEG形式の場合無効)

[-m | --minimum_size] .:この制限よりも小さいフレームをドロップさせます。
 暗い場所でウェブカメラが小さなサイズのゴミフレームを発生させる場合に使う。
[-e | --every_frame] ..:番号付きを除くすべてのフレームを削除します
[-n | --no_dynctrl] …:Linuxのdynctrlを初期化しないようにします
[-l | --led] ……….:LEDの点灯を制御します。使用できるかはカメラ次第
 「on / off / blink / auto 」から選択

■オプションのパラメーター(使用するUSBカメラによって設定できないものがあります)

[-br] ……………..:画像の明るさを設定する(auto / 整数)
[-co] ……………..:画像のコントラストを設定する(整数)
[-sh] ……………..:画像のシャープネスを設定する(整数)
[-sa] ……………..:画像の彩度を設定する(整数)
[-cb] ……………..:カラーバランスの設定(auto / 整数)
[-wb] ……………..:ホワイトバランスを設定する(auto / 整数)
[-ex] ……………..:露出を設定する(auto / shutter-priorityシャッター優先 / aperature-priority絞り優先 / 整数)
[-bk] ……………..:逆光補正の設定(整数)
[-rot] …………….:画像の回転を設定します(0-359)
[-hf] ……………..:水平反転を設定します(true / false)
[-vf] ……………..:垂直反転を設定(true / false)
[-pl] ……………..:電力線フィルターを設定します(disabled / 50hz / 60hz / auto)
[-gain]……………:ゲインの設定(auto / 整数)
[-cagc] ……………:クロマゲインコントロールの設定(auto / 整数)

こちらも太字のオプションを意識しておけば大丈夫だと思います。

MJPG-Streamerのストリーム動画確認

起動後、同一ネットワーク内のPCからブラウザでストリーム動画を見てみましょう。ブラウザから下記URLでMJPG-Streamerにアクセスしてみましょう。

http://raspberrypi.local:8080    ※ホスト名は環境に合わせて変更して下さい

以下のようなメニュー画面が表示されると思います。

mjpg-streamer-home

 
左のメニューの上から3つ目の「Stream」の項目に入るとリアルタイムのストリーム動画が見れます。フル解像度で大きな動画が見たい場合は、以下のURLを指定してください。

http://raspberrypi.local:8080/?action=stream    ※ホスト名は環境に合わせて変更して下さい

mjpg-streamer

スマートホーム用のHTTPに埋め込む形で使うのがオススメです。

 

MJPG-Streamerのサービス化(スマートホーム組み込み)

監視カメラmjpg-streamer motion

前の章でも説明しましたが、MJPG-Streamerには設定ファイルがありません。コマンド引数としてオプション項目をモリモリ記載する必要があります。毎回あんな長いコマンド実行してられないですよね。

オプション長すぎ!こんなん毎回入力してられるか!

読者
ポン吉

オプション設定項目はシェルにまとめよう!

 

MJPG-Streamerをシェルで実行するようにする方法

cd ~/
vi mjpg-streamer.sh
#!/bin/bash
# MJPG-Streamerの起動シェル

# MJPG-Streamerの格納先ディレクトリ
MJPG_DIR="/home/XXXXXXXX/mjpg-streamer/mjpg-streamer-experimental"

# USBカメラのデバイス名
DEV="/dev/video1"

# カメラ設定
WIDTH=1920
HEIGHT=1080
RES="${WIDTH}x${HEIGHT}"
FPS=30
QUALITY=10
PORT=8080

# 使用するカメラの種別を指定します
#   RPI: ラズパイ専用カメラモジュール  USB: USBカメラ
#CAMERA_MODE="RPI"
CAMERA_MODE="USB"

# カレントディレクトリ移動
cd $MJPG_DIR

# 既に動いているプロセスがあればkillしておく
pkill mjpg_streamer

# カメラ種別ごとに実行コマンドを切り替える
if [ "$CAMERA_MODE" == "RPI" ]; then
    ./mjpg_streamer -i "./input_raspicam.so -x $WIDTH -y $HEIGHT -fps $FPS -quality $QUALITY" -o "./output_http.so -w ./www -p $PORT"
else
    ./mjpg_streamer -i "./input_uvc.so -d $DEV -r $RES -f $FPS" -o "./output_http.so -w ./www -p $PORT"
fi

exit 0

注意

5行目のディレクトリ(赤字XXXXXX部分)については、ご利用されているユーザ名に置き換えて使用してください。
MJPG_DIR="/home/XXXXXXXX/mjpg-streamer/mjpg-streamer-experimental"

8行目のデバイス名は、複数のカメラを接続している場合は、video0, video1, video2 と該当するものを指定してください。ラズパイ専用カメラモジュール+USBカメラの両方を使う場合は特に注意しましょう。

20,21行目はラズパイ専用カメラモジュールとUSBカメラのどちらを使うかを指定。使わない方の先頭に#をつけてコメント扱いにしましょう。

作成したシェルファイルに実行権限を付与しておきます。

chmod 755 mjpg-streamer.sh

以下のようにシェルを実行してMJPG-Streamerが起動することを確認しましょう。

cd ~/
./mjpg-streamer.sh

 

MJPG-Streamerをサービス登録する方法

cd /etc/systemd/system
sudo vi mjpg-streamer.service
[Unit]
Description=MJPG-Streamer Service
After=network-online.target

[Service]
Type=simple
KillMode=process
Restart=always
ExecStart=/home/XXXXXXXX/mjpg-streamer.sh

[Install]
WantedBy=multi-user.target

注意

9行目のディレクトリ(赤字XXXXXX部分)については、ご利用されているユーザ名に置き換えて使用してください。
ExecStart=/home/XXXXXXXX/mjpg-streamer.sh

上記で作成したサービスファイルをシステムに読み込ませます。

sudo systemctl daemon-reload

MJPG-Streamerのサービスを「開始」する場合は次のようにコマンドを実行します。

sudo systemctl start mjpg-streamer.service

MJPG-Streamerのサービスを「停止」する場合は次のようにコマンドを実行します。

sudo systemctl stop mjpg-streamer.service

ラズパイ起動時に「自動起動させたい」場合は、次のようにコマンドを実行します。

sudo systemctl enable mjpg-streamer.service

ここでラズパイを再起動させて、ブラウザからカメラのストリーミング動画が視聴できることを確認しましょう。

 

ラズパイ起動時に「自動起動をやめたい」場合は、次のようにコマンドを実行します。

sudo systemctl disable mjpg-streamer.service

 

MJPG-Streamerの更に高度な使い方

MJPG-Stremaerのストリーム動画のURL情報をOpenCVの入力として指定することが可能です。

cap = cv2.VideoCapture("http://rasbperrypi.local:8080/?action=stream")

この方法を使うと、カメラを接続していない別のパワフルなPCにリアルタイム画像処理をさせることも可能。「AI画像分析で人物検出処理」を加えると楽しいことがいろいろと出来ると思います♪興味のある方は下記リンク先の記事も参考にしてみてください。

ポン吉

MJPG-Streamerで中継してOpenCV処理するとちょっとフレーム抜けが発生します
この解決策がないものか…

  

MJPG-Streamerのトラブル事例と対処方法

監視カメラトラブルシュート

初心者の方が陥りやすいトラブル事例について対処方法を紹介したいと思います。

MJPG-Streamerトラブル事例

  • MJPG-Streamer実行後にCTRL+Cを押しても終了できない(コマンド無応答
  • MJPG-Streamerを起動しようとするとエラーになる(bind: Address already in use

CTRL+Cを押してもたまにMJPG-Streamerが終了しない

MJPG-Streamerをコマンド実行した場合、CTRL+Cを押してもプログラムが終了しない時があります。(バグ?)

CTRL+Cを押して無応答になる場合の画面出力はこちら。

^Csetting signal to stop
force cancellation of threads and cleanup resources
o: cleaning up resources allocated by server thread #00
  (ここで無応答になる事がある)

この場合は、別コンソール画面から下記コマンドを実行しmjpg_streamerプロセスを終了させましょう。

▼MJPG-Streamerのプロセス終了

pkill mjpg_streamer

  

MJPG-Streamerを起動しようとするとエラーになる(bind: Address already in use)

既に起動済みのMJPG-Streamerが存在している可能性があります。

起動コマンドを実行したコンソールで CTRL+Z などでバックグラウンド処理にした場合などが該当します。

psコマンドを使ってmjpg_streamerのプロセスが起動済みでないかチェックしてみましょう。

ps -ef | grep mjpg_streamer | grep -v grep

バックグラウンドにプロセスが残っている場合は下記のように表示されます

ponkic+ 7556 738 6 13:27 pts/0 00:00:17 mjpg_streamer -o ./output_http.so -w ./www -p 8080 -i ./input_raspicam.so -x 1920 -y 1080 -fps 30 -q 10

この場合は、下記コマンドを実行しmjpg_streamerプロセスを終了させましょう。

▼mjpg_streamerのプロセスを終了させる方法

pkill mjpg_streamer

ポン吉

設定変更したのに変わらない!といった怪しい動きを感じた際は
mjpg_streamerのプロセスが残留していないかチェックしましょう

 

MJPG-Streamerで動作実績のあるカメラを紹介

うちのスマートホームで使っているカメラ4種類。更に複数購入してあちこち監視させています。ラズパイでカメラを使う場合、下記4台のカメラを選べば後悔はしないと思います。どのカメラ買おうかお悩みの方がいましたら参考にしてみてください。

ラズパイ自体も品薄で購入が難しい状況が続いています。ラズパイの在庫と価格をリアルタイム確認できるページを作りました。ラズパイを購入しようとしている方は是非参考にしてみてください。

カメラの選び方や詳細スペックについては下記サイトにまとめていますので、あわせて参照してみてください。

まとめ

 

まとめ

  • お手軽に軽量な動画ストリーム配信をしたい場合は「MJPG-Streamer」がイチオシ
  • 最新OS Bullseye で動かすためにコツが必要(過去OSと同じ手順では動かない)
  • AIなどの重い処理は別PCからMJPG-Streamerの動画を読み込み分析処理をしよう
ポン吉

軽量ストリーム配信するならMJPG-Streamerで決まり!

正直ちょっと古いアプリなので

MJPG-Streamerはかなり昔からあるアプリで、機能もシンプルであまり更新されていません。最新Raspberry PI OSではカメラ周りの仕様が大幅に変更されBusterと同じ設定では動きません。GitHubのフォークが多いことからも最新Raspberry PI OSへの対応もバラバラな状況。今後がやや心配なところです・・・

-camera