Linux コマンドラインからシリアル番号で USB ウェブカメラを識別する方法

Linux コマンドラインからシリアル番号で USB ウェブカメラを識別する方法

Linux コマンドラインから USB ウェブカメラのシリアル番号を取得するにはどうすればよいですか?

/dev/video0Ubuntu マシンに複数の USB ウェブカメラを接続しています。それらはすべて、、、/dev/video1などとして表示されます/dev/video2が、どれがどれであるかをプログラムで判別する方法が見つからないようです。カメラのいくつかは同じモデルなので、モデル名を取得するだけでは不十分です。

注意してください、私はないの使用方法を尋ねていますlsusb。はい、または libusb を使用してデバイスのシリアル番号、製品 ID、製造元名などを取得できることは知っていますlsusb。ただし、私が知る限り、 で表示されるものはパスlsusbと相互参照できません/dev/video*

/dev/video1たとえば、誰かが 2 台の同一の Web カメラを接続し、それらがおよびとして表示され、/dev/video2その後それらを取り外して完全に異なるポートに再度接続すると、 およびになり/dev/video2、現在の状態が「以前は」であったことがすぐにわかります。/dev/video3/dev/video1/dev/video4/dev/video3/dev/video2

私が見つけた唯一の類似の質問は、dmesg をスキャンしながらプラグを抜いて再度差し込むなどのハックを提案しているだけです。私は、Web カメラを識別するためにハードウェア操作を必要としない、純粋なプログラムによるソリューションを探しています。

答え1

すべてのカメラを識別することが可能です。コマンド

 $ sudo lsusb -v -d 046d:082d | grep -i serial
   iSerial                 1 05C6D16F

は、カメラのシリアル番号を返します (Logitech HD Pro Webcam、例として、以前の の使用から取得した正しいベンダー:製品コードを使用lsusb)。 の使用はsudo絶対に必要であることに注意してください。権限のないユーザーは、 コマンドを通じて利用できるすべての情報にアクセスできません。

シリアル番号は、多くの場合一意ですが、常に一意であるとは限りません。一意でない場合は(同じベンダー:製品コードを持つ2つのデバイスに対する上記のコマンドの出力を比較するだけです)、セットこれらを区別できるようにする必要があります。これを行うためのガイドは Google 上にたくさんありますが、ここでは徹底のためにそのうちのいくつかを紹介します。ここそしてここしかし、これはデバイス依存手順なので、やり方を調べなければなりませんあなただけのカメラ

さて、コマンド

$ sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
  E: ID_MODEL_ID=082d
  E: ID_SERIAL_SHORT=05C6D16F
  E: ID_VENDOR_ID=046d

この特定のカメラに適切なコードを返します。すべてのデバイスで試行錯誤することで、/dev/videoXすべてのデバイスを分類することができます。

答え2

私も同じ問題を抱えていました。1 台の USB ハブを追加して、Raspberry Pi に接続された 6 台の USB カメラを識別する必要がありました。6 台のカメラのベンダー ID、モデル名、シリアル番号はすべて同じです。電源をオフにしたりオンにしたりするたびに、'/dev/video0' ... '/dev/video5' を使用してカメラを処理できました。しかし、'/dev/videoX' が常に同じカメラに割り当てられているわけではないことがわかりました。そのため、この問題を解決するために時間を費やし、最終的に bus# を使用して解決しました。以下は、私の Raspberry Pi のコマンド結果です。

v4l2-ctl --デバイスリスト

USB 2.0 カメラ: HD USB カメラ (usb-3f980000.usb-1.2):
     /dev/video0
USB 2.0 カメラ: HD USB カメラ (usb-3f980000.usb-1.3):
     /dev/video1
USB 2.0 カメラ: HD USB カメラ (usb-3f980000.usb-1.4):
     /dev/video2
USB 2.0 カメラ: HD USB カメラ (usb-3f980000.usb-1.5.1):
     /dev/video3
USB 2.0 カメラ: HD USB カメラ (usb-3f980000.usb-1.5.2):
     /dev/video4
USB 2.0 カメラ: HD USB カメラ (usb-3f980000.usb-1.5.3):
     /dev/video5

バス番号 (1.2、1.3、1.4、1.5.1、1.5.2、1.5.3) は常に物理 USB ポートと一致することがわかりました。そこで、結果を解析して各バス番号のカメラ パスを見つけ、各カメラを識別しました。これで完璧に動作するようになりました。結果を解析するために、以下のコマンドを使用しました。

v4l2-ctl --list-devices | awk '{split($0,a,"-"); gsub(/[):]/,"",a[3]); getline; name=substr($0,2); print a[3] "-" name; getline}'

答え3

私も、コマンド ラインから特定のカメラを取得して、どのポートに接続してもビデオを表示するためのショートカットが機能するようにしたいという同じ要望を持っていました。ここでの回答は役に立ちましたが、完全なレシピは提供されなかったので、完全な解決策を投稿します。

私は、同僚と画面共有して作業内容を見せるために USB カメラを持っています。VLC を使用してビデオ フィードをウィンドウに表示し、開発中のコードの横に表示できるようにしています。これは特定の例ですが、ここでのコマンドは、あらゆるプログラムの使用例で機能します。

この回答と他のいくつかの回答に基づいて、デスクトップ ランチャー (xfce) として機能する次のものを思いつきました。

bash -c "VID=$(v4l2-ctl --list-devices | grep 'H264 USB Camera' -A4 | sed -n '4p' | xargs) ; vlc v4l2://$VID --live-caching=250 --v4l2-width=1920 --v4l2-height=1080 "

すべてを詳しく説明すると:

まず、ランチャーからパイプや環境変数などを使用できるように、bash でラップします。

bash -c "..."

次に、正しいビデオデバイスを見つけて、その名前を変数に格納します。

VID=$(...)

まずすべてのデバイスを一覧表示します...

vfl2-ctl ...

すべての /dev/video* 名を表示するのに十分な行を含めて、関心のあるものを一致させます...

grep ... -A4

次に、適切な解像度/設定を持つデバイス番号を取得します...

sed -n ...

スペースをトリムします...

xargs

最後に、レイテンシを最小限に抑え、解像度を設定する設定を vlc に渡します。

vlc v4l2://$VID --live-caching=250 --v4l2-width=1920 --v4l2-height=1080

参考文献:

https://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file

https://unix.stackexchange.com/questions/493081/コマンドの出力となる環境変数を作成する方法

https://stackoverflow.com/questions/369758/bash 変数から空白文字を削除する方法

https://askubuntu.com/questions/214977/サポートされているウェブカメラの解像度を調べる方法

答え4

/dev/v4l/by-id短編連載作品も含め、下記よりご覧いただくことも可能です。

ls -l /dev/v4l/by-id/ | sort

関連情報