Como identificar a webcam USB pelo número de série na linha de comando do Linux

Como identificar a webcam USB pelo número de série na linha de comando do Linux

Como você obtém o número de série de uma webcam USB na linha de comando do Linux?

Tenho várias webcams USB conectadas a uma máquina Ubuntu. Todos eles aparecem como /dev/video0, /dev/video1, /dev/video2, etc, mas não consigo encontrar nenhuma maneira de saber programaticamente qual é qual. Várias câmeras são do mesmo modelo, portanto, apenas obter o nome do modelo não é suficiente.

Observe, eu estounãoperguntando como usar lsusb. Sim, eu sei que você pode usar lsusbor libusb para obter o número de série do dispositivo, ID do produto, nome do fabricante, etc. Mas, até onde eu sei, nada mostrado por lsusbpode ser referenciado com um /dev/video*caminho.

por exemplo, se alguém conectar duas webcams idênticas e elas aparecerem como /dev/video1e /dev/video2e depois desconectá-las e reconectá-las em portas completamente diferentes, de modo que isso /dev/video2se torna /dev/video3e /dev/video1se torna /dev/video4, posso saber imediatamente que a corrente /dev/video3"costumava ser" /dev/video2.

As únicas perguntas semelhantes que encontrei sugerem apenas hacks como desconectar e reconectar durante a varredura do dmesg. Estou procurando uma solução puramente programática que não exija manipulação de hardware para identificar as webcams.

Responder1

É possível identificar todas as câmeras. O comando

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

retorna o número de série da minha câmera (uma Logitech HD Pro Webcam, usada como exemplo com o fornecedor correto: códigos de produto obtidos de um uso anterior de lsusb). Observe que o uso de sudoé absolutamente necessário: um usuário sem privilégios não tem acesso a todas as informações disponíveis através do comando.

O número de série é frequentemente, mas nem sempre, único. Se não for exclusivo (basta comparar a saída dos comandos acima para dois dispositivos com o mesmo fornecedor:códigos de produto), você podedefinirpara que sejam distintos. Existem guias em todo o Google para fazer isso, vou apenas apontar alguns deles, por uma questão de detalhamento:aquieaqui. Mas lembre-se, este é umdependente do dispositivoprocedimento, então você terá que descobrir como fazê-lopara sua própria câmera.

Agora o comando

$ 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

retorna os códigos apropriados para esta câmera específica. Tentativa e erro com todos /dev/videoXos dispositivos permite classificá-los todos.

Responder2

Eu também tive o mesmo problema. Eu precisava identificar 6 câmeras USB conectadas ao Raspberry Pi com mais 1 hub USB. 6 câmeras possuem ID de fornecedor, nome de modelo e número de série idênticos. Sempre que eu desligava e ligava conseguia manusear as câmeras usando '/dev/video0' ... '/dev/video5'. Mas descobri que '/dev/videoX' nem sempre foi atribuído à mesma câmera. Passei algum tempo resolvendo esse problema e finalmente resolvi usando o ônibus #. Abaixo está o resultado do comando do meu Raspberry Pi.

v4l2-ctl --list-dispositivos

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

Descobri que o número do barramento (1.2, 1.3, 1.4, 1.5.1, 1.5.2, 1.5.3) sempre corresponde à porta USB física. Então analisei o resultado para encontrar o caminho da câmera para cada barramento para identificar cada câmera. Agora parece funcionar perfeitamente. Usei o comando abaixo para analisar o resultado.

v4l2-ctl --list-dispositivos | awk '{split($0,a,"-"); gsub(/[):]/,"",a[3]); Obter linha; nome=substr($0,2); imprima um[3] "-" nome; Obter linha}'

Responder3

Eu tinha o mesmo desejo de obter uma câmera específica na linha de comando, para que pudesse obter um atalho para ver meu vídeo funcionar, independentemente da porta em que eu estivesse conectado, etc. uma receita completa, então postarei uma solução completa.

Eu tenho uma câmera USB que uso para mostrar o trabalho que estou realizando por meio de um compartilhamento de tela com meus colegas. Eu uso o VLC apenas para colocar o feed de vídeo em uma janela, para que possa ser visto ao lado do código que estou desenvolvendo. Este é um exemplo específico, mas os comandos aqui funcionarão para qualquer caso de uso programático.

Com base nesta resposta e em várias outras, criei esta, que funciona como um inicializador de desktop (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 "

Para decompor tudo:

Primeiro, envolva o bash para que você possa usar pipes e variáveis ​​de ambiente, etc. em um inicializador:

bash -c "..."

Em seguida, encontre o dispositivo de vídeo correto e coloque o nome em uma variável

VID=$(...)

Primeiro liste todos os dispositivos...

vfl2-ctl ...

Combine aquele de seu interesse, incluindo linhas suficientes para mostrar todos os nomes /dev/video* ...

grep ... -A4

Em seguida, pegue o número do dispositivo que tem a resolução/configurações corretas...

sed -n ...

Aparar espaços...

xargs

Por fim, passe para vlc com configurações para minimizar a latência e definir a resolução:

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

Referências:

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

https://unix.stackexchange.com/questions/493081/how-to-create-an-environment-variable-that-is-the-output-of-a-command

https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-a-bash-variable

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

Responder4

Você também pode visualizá-los abaixo, /dev/v4l/by-idque inclui o pequeno número de série.

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

informação relacionada