linuxでウェブカメラを接続すると自動で/dev/video0というデバイス名でマッピングしてくれます。
それはよいのですが、ウェブカメラを複数台接続する場合、接続順によっては/dev/video0と/dev/video1が入れ替わってしまいます。
これを解決するにはudevを利用するとよいです。
udevは/dev/udev/rules.dにルールファイルを置くことでそのルールに従ってデバイスをマッピングしてくれる仕組みです。
例:USBのウェブカメラを/dev/webcamにマッピング
必要なことはルールファイルを作成することだけです。
プロダクトIDとベンダーIDを調べる
dmesgやlsusb
dmesg
[text]
uvcvideo: Found UVC 1.00 device UCAM-DLG200H (056e:7007)
[/text]
lsusb
[text]
Bus 001 Device 015: ID 056e:7007 Elecom Co., Ltd
[/text]
調べた情報を元にルールファイルを記述
[bash]
sudo vi /etc/udev/rules.d/10-local.rules
[/bash]
[text]
#web camera for UCAM-DLG200H
KERNEL=="video*",BUS=="usb",SUBSYSTEM=="video4linux",SYSFS{idProduct}=="7007",SYS FS{idVendor}=="056e",SYMLINK+="webcam"
[/text]
udevを再起動は必要ない
udevdを再起動しなくてもファイルが更新されれば有効。
確認
これでUSBのウェブカメラを抜き差ししてみると、/dev/webcamが生成され利用出来るようになります。
追記
・上記の方法で利用できたような気がするのだが、後で触ってみたらmjpeg-streamerからはアクセス出来ない。ffmpegからはできるので、mjpeg-streamerの使い方が悪いのか処理が悪いのか。
ソース直して、引数のシンボリックリンクをリアルパスで渡すようにしてみたけどダメ。realpathで取得したパスをデバイス名に指定するようにしたら一応できるようになった。
ついでにv4l2のAPI仕様書っぽいの見つけたのでメモVideo for Linux Two API Specification
参考
- udevルールの書き方
- udev の仕組みを理解する – いますぐ実践! Linuxシステム管理 / Vol.114
- ソースコード・リテラシーのススメ:第15回 udevを読む|gihyo.jp … 技術評論社