Linux 명령줄에서 일련번호로 USB 웹캠을 식별하는 방법

Linux 명령줄에서 일련번호로 USB 웹캠을 식별하는 방법

Linux 명령줄에서 USB 웹캠의 일련 번호를 어떻게 얻나요?

Ubuntu 컴퓨터에 여러 개의 USB 웹캠이 연결되어 있습니다. 그것들은 모두 /dev/video0, /dev/video1, 등 으로 표시되지만 /dev/video2프로그래밍 방식으로 어느 것이 어느 것인지 알 수 있는 방법을 찾을 수 없는 것 같습니다. 카메라 중 여러 대가 동일한 모델이므로 모델명만 아는 것만으로는 충분하지 않습니다.

참고로 저는~ 아니다사용법을 묻는다 lsusb. 예, 장치 일련 번호, 제품 ID, 제조업체 이름 등을 얻기 위해 또는 libusb를 사용할 수 있다는 것을 알고 있습니다. lsusb그러나 내가 알 수 있는 한 표시된 내용은 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 웹캠 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

나도 같은 문제가있었습니다. USB 허브 1개를 더 사용하여 라즈베리 파이에 연결된 USB 카메라 6개를 식별해야 했습니다. 6개의 카메라는 모두 동일한 공급업체 ID, 모델 이름 및 일련 번호를 가지고 있습니다. 껐다 켤 때마다 '/dev/video0' ... '/dev/video5'를 사용하여 카메라를 처리할 수 있었습니다. 하지만 '/dev/videoX'가 항상 동일한 카메라에 할당되지는 않는다는 것을 발견했습니다. 그래서 이 문제를 해결하기 위해 시간을 투자했고 마침내 버스#을 사용하여 해결했습니다. 아래는 내 라즈베리 파이의 명령 결과입니다.

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; 이름=substr($0,2); [3] "-" 이름을 인쇄합니다. 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/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-solutions

답변4

/dev/v4l/by-id짧은 연재물이 포함된 내용을 볼 수도 있습니다 .

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

관련 정보