ウェブカメラでストリーミング
Raspberry Piとウェブカメラを使って、動画のストリーミング配信をしてみます。
なお、この方法で配信できるのは映像のみです。音声は配信できません。
OSのインストールやWiFiドングルのセットアップなどの初期設定はこちらをご覧ください。
必要なもの
- RaspbianがインストールされたRaspberry Pi
- UVC対応ウェブカメラ(私はたまたま家にあった Logitech QuickCam V-UBU48 (C905) を使用しました)
より詳しいUVC対応ウェブカメラの一覧はこちらで見れます。
あった方がいいもの
電力が不足することがあるらしいです。
なお、Raspberry Pi用にUSBハブを新調する場合は、Raspberry Piの電源の弱さをサポートするために、ACアダプタつきのUSBハブが良いようです。
右の写真では、スマホ用充電専用MicroUSBケーブルを使って、Raspberry Pi自体の電源もUSBハブから取っています。(黒いカールコード)
通常の通信もできるMicroUSBケーブルを使うとループ接続になってしまうので、要注意です。
手順
- Raspberry PiのIPを確認する。(下記の場合は192.168.0.10がIPです)
LANG=C ifconfig | grep Bcast
inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0
- 前準備として、パッケージを最新化する。
sudo aptitude update sudo aptitude upgrade
- ウェブカメラが認識されているか確認する。(下記の場合はDevice 004がウェブカメラです)
lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 004: ID 046d:0991 Logitech, Inc. QuickCam Pro for Notebooks Bus 001 Device 005: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter[Realtek RTL8188CUS]
- 必要なパッケージをインストールする。
sudo aptitude install libv4l-dev libjpeg8-dev subversion imagemagick
- mjpeg-streamerをダウンロードしてmakeする。
make USE_LIBV4L2=true clean all
- まずはインストールしないで実行してみる。
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 1" -o "./output_http.so -p 8080 -w ./www"
- ブラウザで http://【Raspberry PiのIP】:8080/javascript.html を開く。
- 動画が表示されたら、必要であれば、/usrにインストールする。
sudo make DESTDIR=/usr install
- インストール後は下記のようにして起動する。(フレームレートは毎秒1フレームにしています。私の環境では、60fps以上を指定しても56〜59fpsになりました。)
mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0 -r 640x480 -f 1" -o "/usr/lib/output_http.so -p 8080 -w /usr/www"
コマンドラインオプションの意味
オプション | 説明 | |
-b | バックグラウンドで起動。デーモンになる。停止する場合は kill -9 `pidof mjpg_streamer` とする。 | |
-i | 入力修飾子を指定する(-i 以降にダブルクォーテーションでくくって指定する) | |
-d | カメラデバイス | |
-r | 解像度(QSIF/QCIF/CGA/QVGA/CIF/VGA/SVGA/XGA/SXGA あるいは 横幅x縦幅) | |
-f | フレームレート[fps] | |
-y | YUYVフォーマットを指定するか否か(MJPEGがウェブカメラでサポートされていない場合) | |
-q | JPEGのクオリティ(1-100) | |
-m | 最小サイズ。ウェブカメラがゴミフレームを送ってくる場合にそれを除外するために指定する。 | |
-n | dynctrlsを初期化しない。(カメラ操作無効か?) | |
-l | LEDの状態。(on/off/blink/auto) | |
-o | 出力修飾子を指定する(-o 以降にダブルクォーテーションでくくって指定する) | |
-p | ポート | |
-w | ウェブコンテンツのあるディレクトリ。/usr配下にインストールした場合は/usr/www。 | |
-c | 認証情報。ユーザ名とパスワードを「:」区切りで指定する。 | |
-n | デモページのControlでのコマンド実行を無効化する。(Brightnessなどが変更できなくなります) |
より正確なオプションの説明は下記のようにすると参照できます。
|
Raspberry Pi起動時に起動するには
mjpg_streamerを起動するスクリプトを起動スクリプトとして登録します。
|
|
|
ウェブサイトへ埋め込むには
下記のようなJavascript、HTMLで埋め込みができる。
なお、<img src="http://【Raspberry PiのIPアドレス】:【ポート】/?action=stream">として埋め込めると記述されているサイトもあるが、この方法が使えるのはFirefoxなど一部のブラウザに限られる。
Javascriptの方式であれば、ほぼすべてのブラウザで閲覧できる。
以下は付属のjavascript_simple.htmlから転記したもの。
|
ただし、LAN外に公開する場合は、上記IPはグローバルIPである必要がある。
必要に応じてルータでポートマッピングをすること。
なお、その際は-cオプションで認証をかけること。
トラブルシューティング
下記のようなエラーが出る場合
ストリーミングは開始するが、下記のようなエラーが出る場合、使用しているウェブカメラが遠隔操作に対応していません。
そのままでも特に問題はありませんが、入力側の修飾子に-nを指定するとエラーが出力されなくなります。
Adding control for Pan (relative)
UVCIOC_CTRL_ADD - Error: Inappropriate ioctl for device
Adding control for Tilt (relative)
UVCIOC_CTRL_ADD - Error: Inappropriate ioctl for device
Adding control for Pan Reset
UVCIOC_CTRL_ADD - Error: Inappropriate ioctl for device
Adding control for Tilt Reset
UVCIOC_CTRL_ADD - Error: Inappropriate ioctl for device
Adding control for Pan/tilt Reset
UVCIOC_CTRL_ADD - Error: Inappropriate ioctl for device
Adding control for Focus (absolute)
UVCIOC_CTRL_ADD - Error: Inappropriate ioctl for device
mapping control for Pan (relative)
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for Tilt (relative)
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for Pan Reset
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for Tilt Reset
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for Pan/tilt Reset
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for Focus (absolute)
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for LED1 Mode
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for LED1 Frequency
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for Disable video processing
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
mapping control for Raw bits per pixel
UVCIOC_CTRL_MAP - Error: Inappropriate ioctl for device
音が出ない場合
mjpg-streamerには音声を配信する機能はありません。
カメラが突然切れる
こんなエラーメッセージが出てmjpg_streamerが死んで、lsusbでウェブカメラが見つからない場合は、恐らく電力不足です。
Unable to requeue buffer: No such device
i: Error grabbing frames
セルフパワーのUSBハブを買いましょう。