最近のUSBウェブカメラ(UVC対応)は非常にお安くなってきました。私の住む田舎の量販店でも1000円程度で130万画素のウェブカメラが買えます。amazonでも沢山売っているし非常に手頃です。
今回はMJPG-streamer、USBウェブカメラ、ubuntu(Linux)を使って簡単にストリーミングサーバーを作ってみます。
ちなみに私の場合、生まれた娘を外出先から見るのに使ってます。ハムスターや猫などを見たりするのもいいかもしれません。
準備
- ubuntuがインストールされたパソコン(ここではubuntu 10.04で検証)
- USBのウェブカメラ(UVC対応)
確認
まず、LinuxのカーネルがUVCに対応しているか、USBのウェブカメラがUVC対応か、を確認しておくと後で残念な気分になりません。
Linuxのカーネルはバージョンが2.6.26以上(くらいだったはず)であれば標準で組み込まれているので、それ以上であればOKです。最近のubuntuであればまず大丈夫です。
USBのウェブカメラがUVCに対応しているかはウェブカメラのパッケージを確認するか、実際にLinuxのパソコンに接続してみます。接続してdmesgでログを確認して、以下のような「uvcvideo: Found UVC 1.00 device・・・」のようなログがあればOKです。
[ 4845.583764] usb 2-1: new full speed USB device using ohci_hcd and address 4 [ 4845.815824] usb 2-1: configuration #1 chosen from 1 choice [ 4845.821053] uvcvideo: Found UVC 1.00 device BUFFALO BSW13K07H Webcam (0c45:62e0) [ 4845.832366] input: BUFFALO BSW13K07H Webcam as /devices/pci0001:10/0001:10:19.0/usb2/2-1/2-1:1.0/input/input10
ここでデバイスが接続されたパス(/dev/video0など)を確認しておきましょう。
他にビデオデバイスが接続されていなければ/dev/video0ですが、他にUSBウェブカメラやビデオキャプチャーボードが接続されている場合は/dev/video1かもしれませんので、接続の前後で、/dev/video*がどうなるか確認してみてください。もし、このデバイス名を毎回固定したい場合は「デバイス名を固定する」を試してみてください。
手順
1.MJPG-streamerのインストール
まず、ソースをダウンロードします。もしくは、svnから取得します。(SVNの最新ソースの方が少し性能が良い気がしますが定かではありません。)
・ダウンロードする場合
cd mkdir src cd src wget http://sourceforge.net/projects/mjpg-streamer/files/mjpg-streamer/Sourcecode/mjpg-streamer-r63.tar.gz/download mv download mjpg-streamer-r63.tar.gz tar vzxf mjpg-streamer-r63.tar.gz
・subversionのリポジトリから取得する場合(こっちは最新のソース)
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
2.コンパイル
次にダウンロードしたソースをコンパイルします。
MJPG-streamerをコンパイルするには、libjpegが必要になりますので、先にコンパイルの環境も含めてインストールします。
・コンパイル環境の準備
sudo apt-get install build-essential libjpeg-dev
コンパイルする準備が整ったら、次にダウンロードして展開したフォルダに移動してコンパイルします。
cd mjpg-streamer-r63 make
しばらくするとmakeが終わりmjpg_streamerなどの実行ファイルが生成されます。
3.MJPG-streamerを起動する
MJPG-streamerは、実行ファイルのmjpg_streamerにいくつかの引数を与えて起動します。
とりあえず、以下のコマンドで起動してみてください。
sudo ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -y" -o "./output_http.so -w ./www -p 8080"
起動できなかった場合、”./input_uvc.so -d /dev/video0 -y”の -y を削除して再度実行してみてください。また、ウェブカメラが/dev/video0かどうか確認して下さい。
sudoで起動するのも忘れないで下さい。/dev/video0がパーミッションがroot:videoなので、そのままではアクセスできません。
起動したらブラウザで http://(mjpg_streamerを起動したホスト):8080 を開いてみてください。以下のような画面が表示されたらOKです。
起動パラメータについて
主要なパラメータについて説明します。細かいパラメータは最後の付録を見てください。
mjpg_streamerのパラメータ
| パラメータ | 説明 |
|---|---|
| -i | 入力ソースに関するパラメータを指定 |
| -o | 出力に関するパラメータを指定 |
| -b | デーモンモードで起動。終了するときはプロセスIDをKILLする |
入力(-i)のパラメータ
| パラメータ | 説明 |
|---|---|
| -d | デバイス名。例) -d /dev/video0 |
| -r | サイズ。例) -r 640×320、-r 320×240 |
| -f | FPS。例)-f 5 |
| -q | 画質 例) -q 50 |
| -y | YUYVフォーマットを有効化。 |
出力(-o)のパラメータ
| パラメータ | 説明 |
|---|---|
| -w | ウェブページデータへのパス |
| -p | ポート |
| -c | 認証設定。「ユーザー名:パスワード」で指定 |
例えば、サイズが320×240で、FPSが5で、画質が50で、YUYVで、ポート8080で、ユーザー名hogeとパスワードhogeで認証をかけるなら以下のような感じです。
sudo ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 320x240 -f 5 -q 50 -y -n" -o "./output_http.so -w ./www -p 8080 -c hoge:hoge"
その他の使い方は「start.sh」が同梱されているので中身を確認してみるといいです。
ウェブカメラがない、またはUVC非対応の場合
今のところ、UVC対応カーネルとUVCウェブカメラが揃っていればどんなディストリビューションでも動いている気がしますが、ウェブカメラがUVC非対応のウェブカメラの場合、ちょっと面倒な上、ドライバが余りよろしくなくて画質がちょ〜悪かったりします。頑張ってみてもいいですが、おとなしくここで対応がはっきりしているウェブカメラを買った方が楽です。
今のところ私が購入して大丈夫だったUVC対応ウェブカメラはBUFFALO BSW13K07H
、LOGICOOL C200
、ELECOM UCAM-DLG200HBK
です。まぁ、「UVC対応」であればまず大丈夫だと思います。
付録:mjpg_streamer help
mjpg-streamer -h
----------------------------------------------------------------------- Usage: ./mjpg_streamer -i | --input "[parameters]" -o | --output " [parameters]" [-h | --help ]........: display this help [-v | --version ].....: display version information [-b | --background]...: fork to the background, daemon mode ----------------------------------------------------------------------- Example #1: To open an UVC webcam "/dev/video1" and stream it via HTTP: ./mjpg_streamer -i "input_uvc.so -d /dev/video1" -o "output_http.so" ----------------------------------------------------------------------- Example #2: To open an UVC webcam and stream via HTTP port 8090: ./mjpg_streamer -i "input_uvc.so" -o "output_http.so -p 8090" ----------------------------------------------------------------------- Example #3: To get help for a certain input plugin: ./mjpg_streamer -i "input_uvc.so --help" ----------------------------------------------------------------------- In case the modules (=plugins) can not be found: * Set the default search path for the modules with: export LD_LIBRARY_PATH=/path/to/plugins, * or put the plugins into the "/lib/" or "/usr/lib" folder, * or instead of just providing the plugin file name, use a complete path and filename: ./mjpg_streamer -i "/path/to/modules/input_uvc.so" -----------------------------------------------------------------------
./mjpg_streamer -i “`pwd`/input_uvc.so -h”
MJPG Streamer Version.: 2.0
---------------------------------------------------------------
Help for input plugin..: UVC webcam grabber
---------------------------------------------------------------
The following parameters can be passed to this plugin:
[-d | --device ].......: video device to open (your camera)
[-r | --resolution ]...: the resolution of the video device,
can be one of the following strings:
QSIF QCIF CGA QVGA CIF VGA
SVGA XGA SXGA
or a custom value like the following
example: 640x480
[-f | --fps ]..........: frames per second
[-y | --yuv ]..........: enable YUYV format and disable MJPEG mode
[-q | --quality ]......: JPEG compression quality in percent
(activates YUYV format, disables MJPEG)
[-m | --minimum_size ].: drop frames smaller then this limit, useful
if the webcam produces small-sized garbage frames
may happen under low light conditions
[-n | --no_dynctrl ]...: do not initalize dynctrls of Linux-UVC driver
[-l | --led ]..........: switch the LED "on", "off", let it "blink" or leave
it up to the driver using the value "auto"
---------------------------------------------------------------
output_http.soのヘルプ(出し方がわからずソースから抜粋・・・)
Help for output plugin..: "OUTPUT_PLUGIN_NAME"
---------------------------------------------------------------
The following parameters can be passed to this plugin:
[-w | --www ]...........: folder that contains webpages in
flat hierarchy (no subfolders)
[-p | --port ]..........: TCP port for this HTTP server\n" \
[-c | --credentials ]...: ask for "username:password" on connect
[-n | --nocommands ]....: disable execution of commands



