v4l2 Идентификация / dev / video * через lsusb

1486
lysdexia

Я пишу сценарий, который должен использовать конкретную камеру, подключенную к моей системе.

$ lsusb|grep C930e Bus 001 Device 011: ID 046d:0843 Logitech, Inc. Webcam C930e 

Как можно программно обнаружить устройство / dev / video *, соответствующее данному идентификатору устройства, из вывода lsusb?

Кажется, это должно быть легко, но, по-видимому, мне не хватает ключевого слова. :-D

1
`/ sys / class / video4linux`, вероятно, содержит больше информации, чем lsusb. Но я не могу придумать примеры, чтобы дать вам реальный ответ infixed 8 лет назад 1
Ты прав. Я нашел подсказку здесь: http://stackoverflow.com/a/4290924/218732 lysdexia 8 лет назад 1

2 ответа на вопрос

1
lysdexia

Я решил, что ответ будет гораздо лучше, несмотря на необходимость установки другого пакета. Установка v4l-utils(debian) дает одну удобную v4l2-ctlкоманду:

$ v4l2-ctl --list-devices HPigh Definition Webcam (usb-0000:00:14.0-11): /dev/video2  UVC Camera (046d:0821) (usb-0000:00:14.0-13): /dev/video0  Logitech Webcam C930e (usb-0000:00:14.0-9): /dev/video1 1.0MP H 

,, , к которому можно получить доступ таким образом:

def find_cam(cam): cmd = ["/usr/bin/v4l2-ctl", "--list-devices"] out, err = Popen(cmd, stdout=PIPE, stderr=PIPE).communicate() out, err = out.strip(), err.strip() for l in [i.split("\n\t") for i in out.split("\n\n")]: if cam in l[0]: return l[1] return False 

Гист здесь .

0
lysdexia

Как уже упоминалось выше, @infixed, каталог / sys / class / video4linux содержит то, что мне нужно. Это хрупкий пример:

#!/usr/bin/env python import sys import os  def find_cam_dev(cam): v4l2path = "/sys/class/video4linux" for base, subs, filenames in os.walk(v4l2path, followlinks=True): for filename in filenames: if filename == "name": pth = os.path.join(base, filename) with open(pth, "r") as f: name = f.read() if cam in name: return os.path.split(base)[1]  if __name__ == "__main__": cam = "C930e" print(find_cam_dev(cam))