USBウェブカメラとubuntuで簡単ストリーミングサーバー構築

 最近のUSBウェブカメラ(UVC対応)は非常にお安くなってきました。私の住む田舎の量販店でも1000円程度で130万画素のウェブカメラが買えます。amazonでも沢山売っているし非常に手頃です。
 今回はMJPG-streamer、USBウェブカメラ、ubuntu(Linux)を使って簡単にストリーミングサーバーを作ってみます。

 ちなみに私の場合、生まれた娘を外出先から見るのに使ってます。ハムスターや猫などを見たりするのもいいかもしれません。

スクリーンショット(2010-11-07 20.48.36).jpg

準備

  • ubuntuがインストールされたパソコン(ここではubuntu 12.04.2で検証)
  • USBのウェブカメラ(UVC対応)

確認

 まず、LinuxのカーネルがUVCに対応しているか、USBのウェブカメラがUVC対応か、を確認しておくと後で残念な気分になりません。
 Linuxのカーネルはバージョンが2.6.26以上(くらいだったはず)であれば標準で組み込まれているので、それ以上であればOKです。最近のubuntuであればまず大丈夫です。
 USBのウェブカメラがUVCに対応しているかはウェブカメラのパッケージを確認するか、実際にLinuxのパソコンに接続してみます。接続してdmesgでログを確認して、以下のような「uvcvideo: Found UVC 1.00 device・・・」のようなログがあればOKです。

[text]
[ 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
[/text]

 ここでデバイスが接続されたパス(/dev/video0など)を確認しておきましょう。
 他にビデオデバイスが接続されていなければ/dev/video0ですが、他にUSBウェブカメラやビデオキャプチャーボードが接続されている場合は/dev/video1かもしれませんので、接続の前後で、/dev/video*がどうなるか確認してみてください。もし、このデバイス名を毎回固定したい場合は「デバイス名を固定する」を試してみてください。

手順(2013/6/10に更新)

ライブラリのインストール〜ビルドまで

[bash]
sudo apt-get update
sudo apt-get install subversion imagemagick libjpeg-dev
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
cd mjpg-streamer/mjpg-streamer
make
[/bash]

しばらくするとmakeが終わりmjpg_streamerなどの実行ファイルが生成されます。

2.MJPG-streamerを起動する

 MJPG-streamerは、実行ファイルのmjpg_streamerにいくつかの引数を与えて起動します。
 とりあえず、以下のコマンドで起動してみてください。

[bash]
sudo ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -y" -o "./output_http.so -w ./www -p 8080"
[/bash]

 起動できなかった場合、”./input_uvc.so -d /dev/video0 -y”の -y を削除して再度実行してみてください。また、ウェブカメラが/dev/video0かどうか確認して下さい。
 sudoで起動するのも忘れないで下さい。/dev/video0がパーミッションがroot:videoなので、そのままではアクセスできません。

 起動したらブラウザで http://(mjpg_streamerを起動したホスト):8080 を開いてみてください。以下のような画面が表示されたらOKです。

スクリーンショット(2010-11-07 20.48.10).jpg

起動パラメータについて

 主要なパラメータについて説明します。細かいパラメータは最後の付録を見てください。

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で認証をかけるなら以下のような感じです。

[bash]
sudo ./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 320×240 -f 5 -q 50 -y -n" -o "./output_http.so -w ./www -p 8080 -c hoge:hoge"
[/bash]

 その他の使い方は「start.sh」が同梱されているので中身を確認してみるといいです。

ウェブカメラがない、またはUVC非対応の場合

 今のところ、UVC対応カーネルとUVCウェブカメラが揃っていればどんなディストリビューションでも動いている気がしますが、ウェブカメラがUVC非対応のウェブカメラの場合、ちょっと面倒な上、ドライバが余りよろしくなくて画質がちょ〜悪かったりします。頑張ってみてもいいですが、おとなしくここで対応がはっきりしているウェブカメラを買った方が楽です。
 今のところ私が購入して大丈夫だったUVC対応ウェブカメラはBUFFALO BSW13K07HLOGICOOL C200ELECOM 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 servern" 
[-c | --credentials ]...: ask for "username:password" on connect
[-n | --nocommands ]....: disable execution of commands

3 thoughts to “USBウェブカメラとubuntuで簡単ストリーミングサーバー構築”

  1. こんにちは
    このサイト通りにやってみたのですが、makeをした時に

    gcc -O2 -DLINUX -D_GNU_SOURCE -Wall -lpthread -ldl mjpg_streamer.o utils.o -o mjpg_streamer
    mjpg_streamer.o: In function `signal_handler’:
    mjpg_streamer.c:(.text+0x122): undefined reference to `dlclose’
    mjpg_streamer.c:(.text+0x144): undefined reference to `dlclose’
    mjpg_streamer.o: In function `main’:
    mjpg_streamer.c:(.text.startup+0x2e9): undefined reference to `dlopen’
    mjpg_streamer.c:(.text.startup+0x308): undefined reference to `dlsym’
    mjpg_streamer.c:(.text.startup+0x32a): undefined reference to `dlsym’
    mjpg_streamer.c:(.text.startup+0x34c): undefined reference to `dlsym’
    mjpg_streamer.c:(.text.startup+0x36e): undefined reference to `dlsym’
    mjpg_streamer.c:(.text.startup+0x3eb): undefined reference to `dlopen’
    mjpg_streamer.c:(.text.startup+0x407): undefined reference to `dlsym’
    mjpg_streamer.c:(.text.startup+0x424): undefined reference to `dlsym’
    mjpg_streamer.c:(.text.startup+0x441): undefined reference to `dlsym’
    mjpg_streamer.c:(.text.startup+0x45e): undefined reference to `dlsym’
    mjpg_streamer.c:(.text.startup+0x5e5): undefined reference to `dlerror’
    mjpg_streamer.c:(.text.startup+0x7ed): undefined reference to `dlerror’
    collect2: ld はステータス 1 で終了しました
    make: *** [mjpg_streamer] エラー 1

    とエラーが吐かれました
    どうすれば良いのでしょうか?
    環境はUbuntu12.04です
    ご回答よろしくおねがいします。

  2. >岡村さん
    ものすごい遅いコメントで申し訳ありませんm(__)m
    おそらく圧縮ファイルの方をダウンロードしてmakeされたと思いますが、そちらの方では最近はmakeが通らないようですね。
    記事をsubversionを利用したインストール方法のみに変更しましたので、もしよかったら試してみてください。

コメントを残す

メールアドレスが公開されることはありません。