WebUSB 按 deviceClass 和 deviceSubClass 过滤

WebUSB filter by deviceClass and deviceSubClass

我正在开发一个使用 WebUSB 的 UVC 实用程序,但我无法让它仅列出网络摄像头。我应该能够添加基于 deviceClass 和 deviceSubClass 的过滤器,但它返回一个空列表。

这是一个网络摄像头设备...

0: USBDevice
configuration: USBConfiguration {configurationName: null, configurationValue: 1, interfaces: Array(5)}
configurations: [USBConfiguration]
deviceClass: 239
deviceProtocol: 1
deviceSubclass: 2
deviceVersionMajor: 1
deviceVersionMinor: 1
deviceVersionSubminor: 3
manufacturerName: "Microsoft"
opened: false
productId: 1906
productName: "Microsoft® LifeCam Studio(TM)"
serialNumber: ""
usbVersionMajor: 2
usbVersionMinor: 0
usbVersionSubminor: 0
vendorId: 1118

您可以看到 deviceClass 是 239 (0xEF),deviceSubClass 是 2,所以我应该能够根据这些条件进行过滤,但我没有得到任何结果。

https://www.xmos.com/download/AN00127:-USB-Video-Class-Device(2.0.2rc1).pdf

For Video class device, it is mandatory to set the ‘bDeviceClass’, ‘bDeviceSubClass’ and ‘bDeviceProtocol’ fields to 0xEF, 0x02 and 0x01 respectively.

const opts = {
  filters: [{
    classCode: 239, // 0xEF
    subclassCode: 2, // 0x02
  }]
}
const device = await navigator.usb.requestDevice(opts)

没有过滤器,我可以看到所有 USB 设备

我也试过加protocolCode,但是也没用,我觉得没必要。即使仅传递 classCode 字段 returns 一个空列表。

WebUSB API spec

我已针对 Chromium 提出 issue 980281 以解决设备过滤问题。

正如评论中所讨论的那样,很难直接控制 UVC 相机,因为操作系统通常要求这些设备具有内核驱动程序,从而阻止网络浏览器。作为支持使用网络平台媒体 API 的 security/privacy 措施,Blink 还明确阻止访问这 class 台设备。

问题的作者正在寻找控制对比度和曝光等参数的能力。 Chromium 错误跟踪器中的 extensions to the media track constrainable properties included in the Image Capture API. However, not all of these capabilities are supported by browsers on all platforms. For example, Chromium does not support many constraints on macOS as it is constrained by what can be controlled via AVFoundation. This is tracked by issue 817805 支持这些。