目前的问题和症状: 我发现对于每个个人我在 Raspbian 中连接了物理 USB 网络摄像头,一对这样的/dev/视频设备已创建。当我尝试使用 1 个物理相机捕获图像时网络摄像头通过指定其中之一/dev/视频一对设备中,其中一个会失败,并显示读写控制错误另一个会成功。
我想要的帮助: 我正在寻找一种方法来探测/预先确定哪对将失败,这样我就可以避免生成错误并且只调用网络摄像头反对该成员/dev/视频一对会起作用的。
背景: 我有一些 USB 网络摄像头用于多摄像头阵列。我想循环地从每个摄像机捕获一张图像。我尝试循环遍历每个/dev/视频设备并发现了这种配对现象/dev/视频对于每个摄像头,设备名称将成功,而另一个将失败。
这网络摄像头失败的调用(即抛出 ioctl 错误)会生成以下消息:
无法查询输入 0。
VIDIOC_ENUMINPUT:设备的 ioctl 不合适
完整请求: 谁能给我提供一个简单的方法grep或者寻找/dev/video* 或 /sys/class/video4linux/ 中的所有“有效”设备/当这不是 fswebcam 请求的有效设备时,我可以使用树或简单的 shell 命令来告诉我,而不会引发错误?
附加信息: 下面我展示了输出v4l2-ctl当它查询每个设备时显示。
这v4l2-ctl输出从/开发/视频*那将成功:
$ v4l2-ctl --device=/dev/video0 --all
Driver Info (not using libv4l2):
Driver name : uvcvideo
Card type : UNIQUESKY_CAR_CAMERA: Integrate
Bus info : usb-3f980000.usb-1.2.1
Driver version: 4.19.58
Capabilities : 0x84A00001
Video 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 : 1920/1080
Pixel Format : 'MJPG'
Field : None
Bytes per Line : 0
Size Image : 4147200
Colorspace : sRGB
Transfer Function : Default
YCbCr/HSV Encoding: Default
Quantization : Default
Flags :
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 1920, Height 1080
Default : Left 0, Top 0, Width 1920, Height 1080
Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080
Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 30.000 (30/1)
Read buffers : 0
brightness (int) : min=-64 max=64 step=1 default=-8193 value=0
contrast (int) : min=0 max=95 step=1 default=57343 value=0
saturation (int) : min=0 max=100 step=1 default=57343 value=80
hue (int) : min=-2000 max=2000 step=1 default=-8193 value=0
white_balance_temperature_auto (bool) : default=1 value=1
gamma (int) : min=64 max=300 step=1 default=57343 value=84
gain (int) : min=1 max=8 step=1 default=57343 value=1
power_line_frequency (menu) : min=0 max=2 default=1 value=1
white_balance_temperature (int) : min=2800 max=6500 step=1 default=57343 value=3980 flags=inactive
sharpness (int) : min=1 max=7 step=1 default=57343 value=2
backlight_compensation (int) : min=0 max=128 step=0 default=20478 value=0
exposure_auto (menu) : min=0 max=3 default=0 value=3
exposure_absolute (int) : min=10 max=626 step=1 default=156 value=156 flags=inactive
如果我尝试导致以下问题的备用设备,则会返回以下内容ioctl 错误失败:
$ v4l2-ctl --device=/dev/video1 --all
Driver Info (not using libv4l2):
Driver name : uvcvideo
Card type : UNIQUESKY_CAR_CAMERA: Integrate
Bus info : usb-3f980000.usb-1.2.1
Driver version: 4.19.58
Capabilities : 0x84A00001
Video Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04A00000
Streaming
Extended Pix Format
Priority: 2
.
两个 v4l2-ctl 输出之间的重要区别在于,“视频捕获”功能不存在于第二个 /dev/video* 对象的“Device Caps”下,但存在于第一个设备的“Device Caps”下。显然网络摄像头发出一个请求,期望设备具有“视频捕获”功能,如果“设备上限”不存在,则抛出 IOCTL 错误。
不幸的是,v4l2-cntl 输出非常冗长,并且“视频捕获”一词出现在“功能”下的两个列表中。但仅在一种情况下再次出现在“Device Caps”下。
这使得使用 grep 之类的东西编写测试变得更具挑战性,而且我担心这些报告格式的更改可能会使基于它们的任何测试变得脆弱。有没有办法只搜索设备上限?
我很想生成具有该功能的相机列表,但我不确定如何做到这一点。目前,我最好的解决方案是寻找列出两次的“视频捕获”
答案1
对于一台相机,通常第一个设备是捕捉的真实空间。
因此ls /dev/video
生成一个列表,捕获其中的第一项。