自从从 ubuntu 16.04 (kernel 4.15.0-60-generic
) 升级到 18.04 (kernel 5.0.0-27-generic
) 后,v4l 现在会为每个物理设备返回多个 /dev/video 设备。这在尝试使用 udev 规则将视频设备映射到别名时会导致问题。其中一个 /dev/video 设备可以流式传输视频,另一个则不能。我创建的 udev 别名似乎无法始终选择正确的 /dev/video 索引(具有流式传输功能的索引)。
我知道这篇文章与这个非常相似:
但是,接受的答案(Skype 的错误)并不能充分解决我遇到的 udev 问题。
我看到有人在 Stack Exchange 上有类似的问题:
https://unix.stackexchange.com/questions/512759/multiple-dev-video-for-one-physical-device
但尚未有任何答复被接受。
附加信息:
电脑品牌/型号:Asus ROG GL503V
网络摄像头品牌/型号:Genius WideCam F100、Logitech C920 等。
v4l2-ctl --list-devices
返回:
USB2.0 PC CAMERA: USB2.0 PC CAM (usb-0000:00:14.0-11):
/dev/video4
/dev/video5
USB_Camera: USB_Camera (usb-0000:00:14.0-3):
/dev/video0
/dev/video1
HD Pro Webcam C920 (usb-0000:00:14.0-4.1):
/dev/video6
/dev/video7
USB2.0 HD UVC WebCam: USB2.0 HD (usb-0000:00:14.0-7):
/dev/video2
/dev/video3
以下是 Genius WideCam F100 的详细介绍:
user@AsusROG:~$ sudo v4l2-ctl --list-devices
USB_Camera: USB_Camera (usb-0000:00:14.0-3):
/dev/video0
/dev/video1
USB2.0 HD UVC WebCam: USB2.0 HD (usb-0000:00:14.0-7):
/dev/video2
/dev/video3
user@AsusROG:~$ sudo v4l2-ctl --device=/dev/video0 --all
Driver Info (not using libv4l2):
Driver name : uvcvideo
Card type : USB_Camera: USB_Camera
Bus info : usb-0000:00:14.0-3
Driver version: 5.0.21
Capabilities : 0x84A00001
Video Capture
Metadata Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04200001
Video Capture
Streaming
Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
Width/Height : 640/480
Pixel Format : 'YUYV'
Field : None
Bytes per Line : 1280
Size Image : 614400
Colorspace : sRGB
Transfer Function : Default (maps to sRGB)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization : Default (maps to Limited Range)
Flags :
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 640, Height 480
Default : Left 0, Top 0, Width 640, Height 480
Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 640, Height 480
Selection: crop_bounds, Left 0, Top 0, Width 640, Height 480
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 30.000 (30/1)
Read buffers : 0
brightness 0x00980900 (int) : min=-64 max=64 step=1 default=0 value=0
contrast 0x00980901 (int) : min=0 max=95 step=1 default=32 value=32
saturation 0x00980902 (int) : min=0 max=100 step=1 default=55 value=55
hue 0x00980903 (int) : min=-2000 max=2000 step=1 default=0 value=0
white_balance_temperature_auto 0x0098090c (bool) : default=1 value=1
gamma 0x00980910 (int) : min=100 max=300 step=1 default=165 value=165
power_line_frequency 0x00980918 (menu) : min=0 max=2 default=1 value=1
white_balance_temperature 0x0098091a (int) : min=2800 max=6500 step=10 default=4600 value=4600 flags=inactive
sharpness 0x0098091b (int) : min=1 max=7 step=1 default=2 value=2
backlight_compensation 0x0098091c (int) : min=0 max=1 step=1 default=0 value=0
exposure_auto 0x009a0901 (menu) : min=0 max=3 default=3 value=3
exposure_absolute 0x009a0902 (int) : min=50 max=10000 step=1 default=166 value=166 flags=inactive
user@AsusROG:~$ sudo v4l2-ctl --device=/dev/video1 --all
Driver Info (not using libv4l2):
Driver name : uvcvideo
Card type : USB_Camera: USB_Camera
Bus info : usb-0000:00:14.0-3
Driver version: 5.0.21
Capabilities : 0x84A00001
Video Capture
Metadata Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04A00000
Metadata Capture
Streaming
Extended Pix Format
Priority: 2
以下是我安装的各种 v4l 包的版本:
ii libv4l-0:amd64 1.14.2-1 amd64 Collection of video4linux support libraries
ii libv4l-dev:amd64 1.14.2-1 amd64 Collection of video4linux support libraries (development files)
ii libv4l2rds0:amd64 1.14.2-1 amd64 Video4Linux Radio Data System (RDS) decoding library
ii libv4lconvert0:amd64 1.14.2-1 amd64 Video4linux frame format conversion library
ii v4l-utils 1.14.2-1 amd64 Collection of command line video4linux utilities
以下为摘录lsusb
:
Bus 001 Device 017: ID 0458:708c KYE Systems Corp. (Mouse Systems) Genius WideCam F100
以及相关的 udev 规则:
KERNEL=="video?", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="0458", ATTRS{index}=="0", ATTRS{idProduct}=="708c", SYMLINK+="v4l/hd_cam"
任何投入将不胜感激
答案1
正如所注意到的这个相关问题ATTR{index}
,当设备是真实摄像头或仅为元数据时,的值会有所不同。应使用规则ATTR{index}=="0"
来获取真实设备。
答案2
第二台设备提供有关第一台设备的视频数据的元数据。此补丁引入了新设备:
有关 V4L 元数据接口的更多信息,请参见此处:
https://linuxtv.org/downloads/v4l-dvb-apis/uapi/v4l/dev-meta.html
对于普通的 USB 视频类设备来说,这主要只是提供更准确的时间戳信息对于英特尔 RealSense 系列等相机来说,提供有关图像拍摄方式的更广泛的数据。
推测这些数据被拆分到单独的设备节点中,是因为无法以兼容的方式轻松地将这些数据传送到主设备节点。不过这有点麻烦,因为 (a) 不关心这些元数据的应用程序现在需要过滤掉多余的设备,而 (b) 关心元数据的应用程序需要一种方法将这两个设备绑定在一起。