하나의 물리적 장치에 여러 개의 /dev/video가 있습니다.

하나의 물리적 장치에 여러 개의 /dev/video가 있습니다.

먼저 몇 가지 사양: 내 컴퓨터는 HP EliteBook 8460p입니다. 통합형 Chicony HP HD 웹캠이 함께 제공됩니다.

내 문제는 많은 앱(적어도 Skype 및 guvcview)이 동일한 웹캠에 대해 여러 줄을 표시한다는 것입니다. 실제로 이렇게 하면 ls -l /dev | grep video다음과 같은 결과가 나타납니다.

crw-rw----  1 root video      29,   0 Apr 16 08:13 fb0
crw-rw----  1 root video     243,   0 Apr 16 08:13 media0
crw-rw----+ 1 root video      81,   0 Apr 16 08:13 video0
crw-rw----+ 1 root video      81,   1 Apr 16 08:13 video1

저는 2 /dev/video[n]개의 (통합) 웹캠을 가지고 있습니다. Skype는 잘 작동 /dev/video0하지만 작동하지 않습니다 /dev/video1. guvcview도 마찬가지입니다.

Logitech 카메라와 같은 다른 USB 웹캠을 연결하면 다음과 같은 결과가 나타납니다 dmesg.

[21222.638802] usb 2-2: new high-speed USB device number 20 using xhci_hcd
[21222.970684] usb 2-2: New USB device found, idVendor=046d, idProduct=08c2, bcdDevice= 0.05
[21222.970755] usb 2-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[21222.972518] uvcvideo: Found UVC 1.00 device <unnamed> (046d:08c2)
[21226.044535] uvcvideo 2-2:1.0: Entity type for entity Extension 4 was not initialized!
[21226.044538] uvcvideo 2-2:1.0: Entity type for entity Extension 8 was not initialized!
[21226.044540] uvcvideo 2-2:1.0: Entity type for entity Extension 10 was not initialized!
[21226.044541] uvcvideo 2-2:1.0: Entity type for entity Extension 9 was not initialized!
[21226.044543] uvcvideo 2-2:1.0: Entity type for entity Extension 3 was not initialized!
[21226.044545] uvcvideo 2-2:1.0: Entity type for entity Processing 2 was not initialized!
[21226.044547] uvcvideo 2-2:1.0: Entity type for entity Camera 1 was not initialized!
[21226.044746] input: UVC Camera (046d:08c2) as /devices/pci0000:00/0000:00:1c.7/0000:25:00.0/usb2/2-2/2-2:1.0/input/input35
[21226.137559] usb 2-2: Warning! Unlikely big volume range (=3072), cval->res is probably wrong.
[21226.137569] usb 2-2: [5] FU [Mic Capture Volume] ch = 1, val = 4608/7680/1

그리고 다음 ls -l /dev/ | grep video:

crw-rw----  1 root video      29,   0 Apr 16 08:13 fb0
crw-rw----  1 root video     243,   0 Apr 16 08:13 media0
crw-rw----  1 root video     243,   1 Apr 16 14:06 media1
crw-rw----+ 1 root video      81,   0 Apr 16 08:13 video0
crw-rw----+ 1 root video      81,   1 Apr 16 08:13 video1
crw-rw----+ 1 root video      81,   2 Apr 16 14:06 video2
crw-rw----+ 1 root video      81,   3 Apr 16 14:06 video3

3개의 새로운 항목: /dev/media1, /dev/video2/dev/video3.

심지어 최대 4개의 새 장치를 추가할 수 있는 Sony 웹캠(CEVCECM)도 발견했습니다. 통나무 dmesg:

[21927.665747] usb 2-2: new high-speed USB device number 23 using xhci_hcd
[21927.817330] usb 2-2: New USB device found, idVendor=05e3, idProduct=0608, bcdDevice= 9.01
[21927.817339] usb 2-2: New USB device strings: Mfr=0, Product=1, SerialNumber=0
[21927.817343] usb 2-2: Product: USB2.0 Hub
[21927.824119] hub 2-2:1.0: USB hub found
[21927.824814] hub 2-2:1.0: 4 ports detected
[21928.113733] usb 2-2.4: new high-speed USB device number 24 using xhci_hcd
[21928.223184] usb 2-2.4: New USB device found, idVendor=054c, idProduct=097b, bcdDevice=21.12
[21928.223192] usb 2-2.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[21928.223197] usb 2-2.4: Product: CEVCECM
[21928.223201] usb 2-2.4: Manufacturer: Sony
[21928.223206] usb 2-2.4: SerialNumber: DHZD10412EUHK1
[21928.227506] uvcvideo: Found UVC 1.00 device CEVCECM (054c:097b)
[21928.242592] uvcvideo: Unable to create debugfs 2-24 directory.
[21928.242780] uvcvideo 2-2.4:1.0: Entity type for entity Extension 7 was not initialized!
[21928.242783] uvcvideo 2-2.4:1.0: Entity type for entity Extension 3 was not initialized!
[21928.242785] uvcvideo 2-2.4:1.0: Entity type for entity Processing 2 was not initialized!
[21928.242787] uvcvideo 2-2.4:1.0: Entity type for entity Camera 1 was not initialized!
[21928.242877] input: CEVCECM: CEVCECM as /devices/pci0000:00/0000:00:1c.7/0000:25:00.0/usb2/2-2/2-2.4/2-2.4:1.0/input/input38

생성된 장치 파일에는 다음이 포함됩니다 ls -l /dev | grep video.

crw-rw----  1 root video      29,   0 Apr 16 08:13 fb0
crw-rw----  1 root video     243,   0 Apr 16 08:13 media0
crw-rw----  1 root video     243,   1 Apr 16 14:18 media1
crw-rw----+ 1 root video      81,   0 Apr 16 08:13 video0
crw-rw----+ 1 root video      81,   1 Apr 16 08:13 video1
crw-rw----+ 1 root video      81,   2 Apr 16 14:18 video2
crw-rw----+ 1 root video      81,   3 Apr 16 14:18 video3
crw-rw----+ 1 root video      81,   4 Apr 16 14:18 video4
crw-rw----+ 1 root video      81,   5 Apr 16 14:18 video5

5개의 새로운 항목: /dev/media1/dev/video2./dev/video5

나는 사용하기에 올바른 파일이 이것들이라고 생각 /dev/media[n]하지만 Skype와 guvcview는 어떻게든 그렇게 하지 못하고 /dev/video[n].

예를 들어 Webcamoid를 사용할 때는 이 문제가 발생하지 않습니다.

누구든지 아이디어가 있으면 즐겁게 할게요. 그동안 계속 조사하겠습니다…

--- 2019-05-14 수정됨 ---

흥미로운 정보를 얻었습니다 v4l2-ctl --device=/dev/video* --all. Chicony HP HD 웹캠의 경우 장치 기능이 서로 다른 2개의 장치 파일이 있습니다.

# Devices capabilities for /dev/video0
Video Capture
Streaming
Extended Pix Format

# Devices capabilities for /dev/video1
Metadata Capture
Streaming
Extended Pix Format

USB 웹캠에서도 비슷한 결과를 얻었습니다. 결국 Skype와 guvcview가 할 수 없는 것은 Video Capture장치 기능을 지원하는 비디오 장치만 나열하는 것입니다.

답변1

두 번째 장치는 첫 번째 장치의 비디오 데이터에 대한 메타데이터를 제공합니다. 이 패치에는 새로운 장치가 도입됩니다.

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=088ead25524583e2200aa99111bea2f66a86545a

V4L 메타데이터 인터페이스에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

https://linuxtv.org/downloads/v4l-dvb-apis/userspace-api/v4l/dev-meta.html

일반 USB 비디오 장치의 경우 이는 주로 다음과 같은 기능을 제공합니다.더욱 정확한 타임스탬프 정보. Intel RealSense 시리즈와 같은 카메라의 경우,이미지 캡처 방법에 대한 더 광범위한 데이터 제공.

아마도 이 데이터는 호환 가능한 방식으로 기본 장치 노드에 쉽게 전달될 수 없기 때문에 별도의 장치 노드로 분할됩니다. 그러나 (a) 이 메타데이터에 관심이 없는 앱은 이제 추가 장치를 필터링해야 하고 (b) 메타데이터에 관심 있는 앱은 두 장치를 함께 묶는 방법이 필요하기 때문에 약간 고통스럽습니다.

답변2

정말 짜증나지만 해결책을 찾았습니다. udev가 메타데이터의 장치 노드 대신 "실제" 카메라에 심볼릭 링크를 할당하도록 합니다. udev(?)와 동일합니다.

udevadm info -n /dev/video0"동일" udevadm info -n /dev/video1하지만 ATTR{index}가 다릅니다. 그래서 내 두 대의 카메라에 대해 다음과 같이 끝납니다 /etc/udev/rules.d/99-cam.rules.

SUBSYSTEM=="video4linux", ATTRS{idVendor}=="eb1a", ATTRS{idProduct}=="299f", ATTR{index}=="0", MODE="0664", GROUP="video", SYMLINK+="cams/cam1"

SUBSYSTEM=="video4linux", ATTRS{idVendor}=="1908", ATTRS{idProduct}=="2311", ATTR{index}=="0", MODE="0664", GROUP="video", SYMLINK+="cams/cam2"

그런 다음 /dev/cams/camX응용 프로그램에서 대신 사용하십시오./dev/videoY

관련 정보