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)
....
正直、Warningにしてほしいんだが。
設定
640x480じゃなく、1920x1080にしたい!とか、/dev/video1のデバイスの画像を見たい!とか、いろいろあると思う。
そもそもだが、start.sh内で何をやっているのかというと、以下のコマンドをたたいているだけ。
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
サイズを変えたければ、
-r 1280x960
-d /dev/video0
結構簡単なうえに、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" />
<img src="./?action=stream_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
...
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 にある。
使ってみたところ、別の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 はやめたほうが無難。
以上!