2017-07-06 3 views
0

Nous développons un projet basé sur Chrome (ancienne API USB migrant vers WEBUSB) et une webcam. La webcam USB a un bouton utilisé pour prendre une photo. En MAC et Linux, je peux montrer la vidéo en direct de la webcam en utilisant getUserMedia() et en même temps, je peux utiliser l'API Web USB pour communiquer avec l'appareil pour détecter la pression sur un bouton. Le problème est Windows. Sur Windows Chorme peut voir le périphérique USB comme une webcam accessible depuis getUserMedia (si j'installe le pilote original du périphérique USB) ou comme périphérique USB accessible WebUSB (si je remplace le pilote original avec WINUSB) mais nous ne pouvons pas utiliser les deux API ensemble. C'est un problème uniquement sur WINDOWS, dans Mac ou Linux tout fonctionne. comment pouvons nous résoudre ceci?getUserMedia et WEBUSB sur le même périphérique Windows

N.B. Pour que les commandes USB javascript fonctionnent sur linux et OSX, j'ai dû remplacer "interface" par "endpoint" dans les commandes de transfert.

Linux dump lsusb:

Bus 001 Device 008: ID a168:0872 AnMo Electronics Corporation 
Device Descriptor: 
    bLength    18 
    bDescriptorType   1 
    bcdUSB    2.00 
    bDeviceClass   239 Miscellaneous Device 
    bDeviceSubClass   2 
    bDeviceProtocol   1 Interface Association 
    bMaxPacketSize0  64 
    idVendor   0xa168 AnMo Electronics Corporation 
    idProduct   0x0872 
    bcdDevice   20.01 
    iManufacturer   1 ANMO Electronics Corporation 
    iProduct    2 Dino-Lite Premier 
    iSerial     3       
    bNumConfigurations  1 
    Configuration Descriptor: 
    bLength     9 
    bDescriptorType   2 
    wTotalLength   509 
    bNumInterfaces   2 
    bConfigurationValue  1 
    iConfiguration   0 
    bmAttributes   0x80 
     (Bus Powered) 
    MaxPower    500mA 
    Interface Association: 
     bLength     8 
     bDescriptorType  11 
     bFirstInterface   0 
     bInterfaceCount   2 
     bFunctionClass   14 Video 
     bFunctionSubClass  3 Video Interface Collection 
     bFunctionProtocol  0 
     iFunction    2 Dino-Lite Premier 
    Interface Descriptor: 
     bLength     9 
     bDescriptorType   4 
     bInterfaceNumber  0 
     bAlternateSetting  0 
     bNumEndpoints   1 
     bInterfaceClass  14 Video 
     bInterfaceSubClass  1 Video Control 
     bInterfaceProtocol  0 
     iInterface    2 Dino-Lite Premier 
     VideoControl Interface Descriptor: 
     bLength    13 
     bDescriptorType  36 
     bDescriptorSubtype  1 (HEADER) 
     bcdUVC    1.00 
     wTotalLength   80 
     dwClockFrequency  6.000000MHz 
     bInCollection   1 
     baInterfaceNr(0)  1 
     VideoControl Interface Descriptor: 
     bLength    18 
     bDescriptorType  36 
     bDescriptorSubtype  2 (INPUT_TERMINAL) 
     bTerminalID    1 
     wTerminalType  0x0201 Camera Sensor 
     bAssocTerminal   0 
     iTerminal    0 
     wObjectiveFocalLengthMin  0 
     wObjectiveFocalLengthMax  0 
     wOcularFocalLength   0 
     bControlSize     3 
     bmControls   0x000200a2 
      Auto-Exposure Mode 
      Focus (Absolute) 
      Iris (Absolute) 
      Focus, Auto 
     VideoControl Interface Descriptor: 
     bLength    11 
     bDescriptorType  36 
     bDescriptorSubtype  5 (PROCESSING_UNIT) 
     Warning: Descriptor too short 
     bUnitID     3 
     bSourceID    1 
     wMaxMultiplier   0 
     bControlSize   2 
     bmControls  0x0000147f 
      Brightness 
      Contrast 
      Hue 
      Saturation 
      Sharpness 
      Gamma 
      White Balance Temperature 
      Power Line Frequency 
      White Balance Temperature, Auto 
     iProcessing    0 
     bmVideoStandards  0x1d 
      None 
      PAL - 625/50 
      SECAM - 625/50 
      NTSC - 625/50 
     VideoControl Interface Descriptor: 
     bLength    29 
     bDescriptorType  36 
     bDescriptorSubtype  6 (EXTENSION_UNIT) 
     bUnitID     4 
     guidExtensionCode   {2652215a-8932-5641-894a-5c557cdf9664} 
     bNumControl   16 
     bNrPins     1 
     baSourceID(0)   3 
     bControlSize   4 
     bmControls(0)  0xff 
     bmControls(1)  0xff 
     bmControls(2)  0xff 
     bmControls(3)  0xff 
     iExtension    0 
     VideoControl Interface Descriptor: 
     bLength     9 
     bDescriptorType  36 
     bDescriptorSubtype  3 (OUTPUT_TERMINAL) 
     bTerminalID    2 
     wTerminalType  0x0101 USB Streaming 
     bAssocTerminal   0 
     bSourceID    4 
     iTerminal    0 
     Endpoint Descriptor: 
     bLength     7 
     bDescriptorType   5 
     bEndpointAddress  0x81 EP 1 IN 
     bmAttributes   3 
      Transfer Type   Interrupt 
      Synch Type    None 
      Usage Type    Data 
     wMaxPacketSize  0x0008 1x 8 bytes 
     bInterval    9 
    Interface Descriptor: 
     bLength     9 
     bDescriptorType   4 
     bInterfaceNumber  1 
     bAlternateSetting  0 
     bNumEndpoints   1 
     bInterfaceClass  14 Video 
     bInterfaceSubClass  2 Video Streaming 
     bInterfaceProtocol  0 
     iInterface    0 
     Endpoint Descriptor: 
     bLength     7 
     bDescriptorType   5 
     bEndpointAddress  0x82 EP 2 IN 
     bmAttributes   5 
      Transfer Type   Isochronous 
      Synch Type    Asynchronous 
      Usage Type    Data 
     wMaxPacketSize  0x0000 1x 0 bytes 
     bInterval    1 
     INTERFACE CLASS: 0f 24 01 02 67 01 82 00 02 01 01 00 01 00 00 
     INTERFACE CLASS: 0b 24 06 01 05 00 01 00 00 00 00 
     INTERFACE CLASS: 1e 24 07 01 00 80 02 e0 01 00 00 08 ca 00 00 08 ca 00 60 09 00 15 16 05 00 01 15 16 05 00 
     INTERFACE CLASS: 1e 24 07 02 00 40 01 f0 00 80 00 02 32 80 00 02 32 00 58 02 00 15 16 05 00 01 15 16 05 00 
     INTERFACE CLASS: 1e 24 07 03 00 a0 00 78 00 a0 00 00 8c a0 00 00 8c 00 96 00 00 15 16 05 00 01 15 16 05 00 
     INTERFACE CLASS: 1e 24 07 04 00 00 05 00 04 00 00 19 00 00 00 19 00 00 00 28 00 20 a1 07 00 01 20 a1 07 00 
     INTERFACE CLASS: 1e 24 07 01 00 80 02 e0 01 00 00 08 ca 00 00 08 ca 00 60 09 00 15 16 05 00 01 15 16 05 00 
     INTERFACE CLASS: 1b 24 04 02 05 59 55 59 32 00 00 10 00 80 00 00 aa 00 38 9b 71 10 01 00 00 00 00 
     INTERFACE CLASS: 1e 24 05 01 00 80 02 e0 01 00 00 08 ca 00 00 08 ca 00 60 09 00 15 16 05 00 01 15 16 05 00 
     INTERFACE CLASS: 1e 24 05 02 00 40 01 f0 00 80 00 02 32 80 00 02 32 00 58 02 00 15 16 05 00 01 15 16 05 00 
     INTERFACE CLASS: 1e 24 05 03 00 a0 00 78 00 a0 00 00 8c a0 00 00 8c 00 96 00 00 15 16 05 00 01 15 16 05 00 
     INTERFACE CLASS: 1e 24 05 04 00 00 05 00 04 00 00 19 00 00 00 19 00 00 00 28 00 20 a1 07 00 01 20 a1 07 00 
     INTERFACE CLASS: 1e 24 05 01 00 80 02 e0 01 00 00 08 ca 00 00 08 ca 00 60 09 00 15 16 05 00 01 15 16 05 00 
     INTERFACE CLASS: 06 24 0d 00 00 00 
    Interface Descriptor: 
     bLength     9 
     bDescriptorType   4 
     bInterfaceNumber  1 
     bAlternateSetting  1 
     bNumEndpoints   1 
     bInterfaceClass  14 Video 
     bInterfaceSubClass  2 Video Streaming 
     bInterfaceProtocol  0 
     iInterface    0 
     Endpoint Descriptor: 
     bLength     7 
     bDescriptorType   5 
     bEndpointAddress  0x82 EP 2 IN 
     bmAttributes   5 
      Transfer Type   Isochronous 
      Synch Type    Asynchronous 
      Usage Type    Data 
     wMaxPacketSize  0x13fc 3x 1020 bytes 
     bInterval    1 
Device Qualifier (for other device speed): 
    bLength    10 
    bDescriptorType   6 
    bcdUSB    2.00 
    bDeviceClass   239 Miscellaneous Device 
    bDeviceSubClass   2 
    bDeviceProtocol   1 Interface Association 
    bMaxPacketSize0  64 
    bNumConfigurations  1 
can't get debug descriptor: Resource temporarily unavailable 
Device Status:  0x0000 
    (Bus Powered) 

Répondre

0

Basé sur la sortie de lsusb -v ci-dessus, je peux voir que ce dispositif a une fonction unique composé de deux interfaces USB. Le descripteur d'association d'interface (IAD, Interface Association Descriptor) signale au système d'exploitation hôte que ces deux interfaces sont liées et que les systèmes d'exploitation tels que Windows les traitent comme une interface unique aux fins de la liaison des pilotes. Je pense que sous Linux et macOS, vous pouvez communiquer avec le point de terminaison EP 1 IN car seule l'interface 1 est revendiquée par le pilote de classe vidéo USB (UVC). Sous Windows, puisqu'elle considère les deux interfaces comme une seule entité "fonction 0", vous ne pouvez pas revendiquer l'interface 0 car l'interface 1 est déjà revendiquée dans le cadre de la fonction 0.

+0

Merci pour la réponse. J'ai édité la question avec la décharge. Pour que le projet fonctionne sous Linux et Mac, j'ai dû remplacer "interface" par "endpoint" dans les commandes de transfert. –

+0

Merci pour les détails supplémentaires. J'ai mis à jour ma réponse avec des détails basés sur votre appareil. –

+0

Merci pour votre explication. Donc je ne peux rien faire sur les fenêtres? –