コンテンツにスキップ

Top

MJPG-streamer

パソコンのUSBカメラの映像を、同一LAN上のPCやスマホから簡単に確認したい、と思ったときにどうしたらよいか調べたら、MJPG-streamerというアプリケーションがあることがわかったのでそれについて解説する。

なお、HTTPS通信はできない ので注意が必要である。
アクセス制限としてのベーシック認証はできるが、通信が暗号化されないので盗聴のリスクが少なからずある。

HTTPS通信による同一LAN内でのストリーミングをしたい場合、WebRTCを使ったほうが良い。
WebRTCを使って動画配信(同一LAN内) その1

公式サイト

どうも、下記が現在の公式サイトみたい。
公式サイト

Ubuntuにインストール

以下の手順でインストールする。
(公式ページは古いのか、libjpeg8-devとか見つからなかったりするので以下で)

$ sudo apt install -y cmake build-essential imagemagick libv4l-dev libjpeg-dev

$ git clone https://github.com/jacksonliam/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental
$ make
$ sudo make install

実行

起動は make したディレクトリにあるstart.shをたたくととりあえず起動する。

$ ./start.sh 

MJPG Streamer Version: git rev: 310b29f4a94c46652b20c4b7b6e5cf24e532af39
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: -1
 i: Format............: JPEG
 i: TV-Norm...........: DEFAULT
UVCIOC_CTRL_ADD - Error at Pan (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Tilt (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Pan Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Pan/tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Focus (absolute): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Tilt (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Pan/tilt Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Focus (absolute): Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at LED1 Mode: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at LED1 Frequency: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Disable video processing: Inappropriate ioctl for device (25)
UVCIOC_CTRL_MAP - Error at Raw bits per pixel: Inappropriate ioctl for device (25)
 o: www-folder-path......: ./www/
 o: HTTP TCP port........: 8080
 o: HTTP Listen Address..: (null)
 o: username:password....: disabled
 o: commands.............: enabled
^Csetting signal to stop
 i: cleaning up resources allocated by input thread
force cancellation of threads and cleanup resources
 o: cleaning up resources allocated by server thread #00
done

これで、 /dev/video0 につながっている USBカメラの映像を、以下のURLにアクセスすることによりストリーミングで見ることができるようになる。

http://[PCのアドレス]:8080

いや、これじゃない、もっと、ストリーミングの画像だけがみたいんだ!という人は、

http://[PCのアドレス]:8080/?action=stream

と、

/?action=stream
をつければよい。
おそらく期待通りの画像がでてくるだろう。

なんか UVCIOC_CTRL_MAP - Error がたくさん出てくる!

UVCIOC_CTRL_ADD - Error at Pan (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Tilt (relative): Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Pan Reset: Inappropriate ioctl for device (25)
UVCIOC_CTRL_ADD - Error at Tilt Reset: Inappropriate ioctl for device (25)
....
と、なんかErrorが出ているので失敗している感があるが気にする必要はない。Pan Tilt(上下左右にカメラを動かす)機能がないUVCカメラだからioctlで操作できないよ、的なことを行ってるだけ。
正直、Warningにしてほしいんだが。

設定

640x480じゃなく、1920x1080にしたい!とか、/dev/video1のデバイスの画像を見たい!とか、いろいろあると思う。

そもそもだが、start.sh内で何をやっているのかというと、以下のコマンドをたたいているだけ。

./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

サイズを変えたければ、

-r 1280x960
のようにrオプションでできるし、デバイスを変更したいなら、
-d /dev/video0
のようにdオプションで切り替えればよい。

結構簡単なうえに、start.sh内にコメントアウトされたサンプル実行コードがたくさん書かれているのですぐわかるはず。

2台のUVCカメラ

1台のカメラ映像を出すことはできた。では、2台の場合はどうすればよいか?

簡単で、デバイスを複数セットすればよい。ただし、最初間違えたのが以下のような感じにしてしまったこと。

./mjpg_streamer -i "./input_uvc.so -d /dev/video0 /dev/video2" -o "./output_http.so -w ./www --port 8000"

要は、-iのオプション内の-dにデバイスを2つ書いたのだが、これだとうまくいかない。というか完全に失敗してくれればいいのに、最初の(/dev/video0)だけ有効になるので訳が分からなかった。

-d を2個書いても同じ。この場合、後者(ここでいうところの/dev/video2)だけ有効になる。

./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -d /dev/video2" -o "./output_http.so -w ./www --port 8000"

正しくは以下のように-iそのものを2つ書かなければならなかった。

./mjpg_streamer -i "./input_uvc.so -d /dev/video0" -i "./input_uvc.so -d /dev/video2" -o "./output_http.so -w ./www --port 8000"

これで2つ表示される....はずだが、mjpeg-streamerのデフォルトのHPだと1つしか表示されない。

それはURLが違うからである。

<img src="./?action=stream" />
が最初のUSBカメラの画像を出しており、2番目の画像は、
<img src="./?action=stream_1" />
と 直接HTMLを変更して _1 をつけてあげれば表示される。
もっというと、最初のstreamもstream_0と同義で、省略形でstreamになっているだけだった。
カメラを3台にふやしたら_2、4台なら_3とstreamの後ろに数字を追加していけば良いだけ。

これは直接表示も同じ。

http://[PCのアドレス]:8080/?action=stream
http://[PCのアドレス]:8080/?action=stream_1
http://[PCのアドレス]:8080/?action=stream_2
...
という感じ。繰り返しになるがstreamはstream_0と同義。

HTTPS通信

最初にも書いたが、HTTPS通信はできない。
nginxをリバースプロキシにしてhttps通信にしている人もいるが、そもそもhttpsでの通信が必要であればmpeg-streamerを使わない、というのが正解だろう。

Windows で MPEG-Streamer

今までのはすべてUbuntu上での方法だったが、Windows版のMPEG-Streamerも有志が作ってはいる。

https://github.com/flyinggorilla/MJPEG-Streamer-Universal-Windows-App

コンパイルするのが面倒ならユニバーサルアプリにしたものが Microsoft Store にある。

MJPEG Streamer

使ってみたところ、別のPCのブラウザから以下のURLにアクセスしたら確かに見れた。

http://[PCのアドレス]:8000/stream.mjpeg

Linux版は

http://[PCのアドレス]:8080/?action=stream

だったので、揃えてほしかった。

注意点としては、このアプリを入れたPC上のブラウザからは アクセスできない!

え、使えないアプリだなぁ、と思ったが、これは Windows アプリ の制限とのこと。

タイトル

ので1台のマシンでmjpeg-streamerを起動して、ブラウザから確認、といったことはできない。
(Linux版はできる)

そのうえ、これを書いているうちに発生したが、30分もしないうちに映像が固まった

minimizing this app will stop...とか書いてあるので最小化したときに止まったのだろう。

最小化したら止まるって...むしろ最小化してる時だけ動いてくれたほうがいい。
(これもWindowアプリの制約なのかしら?)

いろいろあるのでWindows 版の mjpeg-streamer はやめたほうが無難。

以上!