Raspbian

一個物理設備掛載兩個 /dev/video 設備;這會導致 fswebcam 拋出 ioctl 錯誤?

  • February 4, 2021

出現的問題和症狀: 我發現對於我在 Raspbian 中附加的每個單獨的物理 USB 網路攝像頭,都會創建一對這樣的*/dev/video設備。當我嘗試通過指定一對中的/dev/video設備之一來使用fswebcam從該 1 個物理相機擷取圖像時,一個將因ioctl 錯誤*而失敗,而另一個將成功。

我想要的幫助: 我正在尋找一種方法來探測/預先確定這對中的哪一個會失敗,這樣我就可以避免產生錯誤,並且只針對*/dev/video*對中有效的成員呼叫fswebcam

背景: 我在多攝像頭陣列中使用了一些 USB 網路攝像頭。我想在一個循環中從每個攝像頭擷取一張圖像。我嘗試遍歷每個*/dev/video設備並發現了這種配對現象,其中一個/dev/video*設備名稱將成功,而另一個將失敗,對於每個攝像頭。

失敗的fswebcam呼叫(即拋出 ioctl 錯誤)生成以下消息:

無法查詢輸入 0。

VIDIOC_ENUMINPUT:設備的 ioctl 不合適

完整請求: 任何人都可以為我提供一種簡單的方法來grep查找/dev/video* 或 /sys/class/video4linux/ */*樹中的所有“有效”設備或一個簡單的 shell 命令我可以用來告訴我沒有當這不是 fswebcam 請求的有效設備時拋出錯誤?

附加資訊: 下面我顯示了v4l2-ctl在查詢每個設備時顯示的輸出。

/dev/videov4l2-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* 對象的“設備上限”下不存在,但在第一個設備的“設備上限”下存在。顯然, fswebcam發出的請求期望設備具有“影片擷取”功能,並且如果拋出 IOCTL 錯誤,則當“設備帽”不存在時。

不幸的是,v4l2-cntl 輸出非常冗長,並且“影片擷取”一詞出現在“功能”下的兩個列表中。但僅在一種情況下再次出現在“設備上限”下。

這使得使用 grep 之類的東西編寫測試變得更具挑戰性,而且我擔心這些報告格式的更改可能會使基於它們的任何測試變得脆弱。有沒有辦法只搜尋設備帽?

我很想生成具有該功能的相機列表,但我不確定如何去做。目前,我最好的解決方案是尋找兩次列出的“影片擷取”

對於一個相機,通常第一個設備是用於捕捉的真實空間。

所以ls /dev/video生成一個列表,擷取第一項就可以了。

引用自:https://unix.stackexchange.com/questions/541493