Как определить USB веб-камеру по серийному номеру из командной строки Linux

Как определить USB веб-камеру по серийному номеру из командной строки Linux

Как получить серийный номер USB-веб-камеры из командной строки Linux?

У меня есть несколько USB-веб-камер, подключенных к машине Ubuntu. Они все отображаются как /dev/video0, /dev/video1, /dev/video2, и т. д., но я не могу найти способ программно определить, какая из них какая. Несколько камер — одной модели, поэтому просто узнать название модели недостаточно.

Обратите внимание, янетспрашивая, как использовать lsusb. Да, я знаю, что вы можете использовать lsusbили libusb, чтобы получить серийный номер устройства, идентификатор продукта, название производителя и т. д. Но, насколько я могу судить, ничто из показанного не lsusbможет быть связано с /dev/video*путем.

Например, если кто-то подключает две одинаковые веб-камеры, и они отображаются как /dev/video1и , /dev/video2а затем отключает их и снова подключает к совершенно другим портам, так что /dev/video2становится /dev/video3и /dev/video1становится /dev/video4, я могу сразу же узнать, что текущее /dev/video3«было» /dev/video2.

Единственные похожие вопросы, которые я нашел, предлагают только хаки вроде отключения и повторного подключения при сканировании dmesg. Я ищу чисто программное решение, которое не требует аппаратных манипуляций для определения веб-камер.

решение1

Можно идентифицировать все камеры. Команда

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

возвращает серийный номер моей камеры (Logitech HD Pro Webcam, использованной в качестве примера с правильными кодами Vendor:Product, полученными при предыдущем использовании lsusb). Обратите внимание, что использование sudoабсолютно необходимо: непривилегированный пользователь не получает доступа ко всей информации, доступной через команду.

Серийный номер часто, но не всегда, уникален. Если он не уникален (просто сравните вывод команд выше для двух устройств с одинаковыми кодами Vendor:Product), вы можетенаборих так, чтобы они были различимы. В 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

У меня была та же проблема. Мне нужно было идентифицировать 6 USB-камер, подключенных к Raspberry Pi с помощью еще одного USB-концентратора. У всех 6 камер одинаковый идентификатор поставщика, название модели и серийный номер. Всякий раз, когда я выключал и включал камеру, я мог управлять ею с помощью '/dev/video0' ... '/dev/video5'. Но я обнаружил, что '/dev/videoX' не всегда назначался одной и той же камере. Поэтому я потратил некоторое время, чтобы решить эту проблему, и в конце концов решил ее с помощью bus#. Ниже приведен результат команды моего Raspberry Pi.

v4l2-ctl --list-devices

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/видео5

Я обнаружил, что номер шины (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/how-to-trim-whitespace-from-a-bash-variable

https://askubuntu.com/questions/214977/how-can-i-find-out-supported-webcam-resolutions

решение4

Вы также можете посмотреть их в разделе, /dev/v4l/by-idкоторый включает в себя короткий сериал.

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

Связанный контент