
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 lsusb
or 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 lsusb
pode ser referenciado com um /dev/video*
caminho.
por exemplo, se alguém conectar duas webcams idênticas e elas aparecerem como /dev/video1
e /dev/video2
e depois desconectá-las e reconectá-las em portas completamente diferentes, de modo que isso /dev/video2
se torna /dev/video3
e /dev/video1
se 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/videoX
os 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://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-id
que inclui o pequeno número de série.
ls -l /dev/v4l/by-id/ | sort