Ding Ding! J'ai réussi à comprendre celui-ci avec l'aide des gens sympas de #v4l sur freenode.
Pour faire court :v4l2-ctl est le meilleur outil pour déboguer les problèmes de caméra USB. Lisez toutes les commandes disponibles et la page de manuel, ce sera amusant, je vous le promets. Utilisation de v4l2-ctl J'ai découvert qu'une de mes caméras ne supportait aucun mode vidéo compressé. Vous pouvez vérifier les modes pris en charge par vos caméras en exécutant la commande suivante :
v4l2-ctl -d /dev/video0 --list-formats
Ce qui devrait produire quelque chose comme ça.
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : MJPEG
Index : 1
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUV 4:2:2 (YUYV)
Si le seul format de pixel renvoyé est "YUYV", "IUYV", "I420" ou "GBRG", vous ne pourrez exécuter qu'une seule caméra par contrôleur USB* puisque ces formats ne sont pas compressés. L'utilisation de plusieurs webcams prenant en charge MJPEG ou une autre forme de compression fonctionnera correctement.
Si vous utilisez OpenCV comme moi, ne vous inquiétez pas si le format de pixel par défaut n'est pas compressé car il semble qu'OpenCV utilise par défaut la compression de toute façon.
**Sauf si vous êtes satisfait d'une résolution de 320 x 240 ou moins.*
La réponse est d'utiliser les modifications uvcvideo écrites par SwDevRefugee et décrites ci-dessus. Lui et moi avons travaillé ensemble pour obtenir le code modifié compilé pour OpenWrt, avec succès. La version sur laquelle je l'exécute est OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130), sur un routeur tplink wdr3600 :
RESULTAT :Je peux avoir 3*c270 (logitech) fonctionnant simultanément à 1280x960 et 15fps au format MJPG, via un hub usb 2.0. Je n'ai pas de quatrième c270 à brancher, désolé.
Je peux également avoir 2 * c270 et 1 * GEMBIRD 640 * 480 * 15fps au format YUV, mais l'ajout d'un 2e GEMBIRD conduit au redoutable "Impossible de démarrer la capture :il ne reste plus d'espace sur l'appareil" (espace ==bande passante ici, comme vous Bien connaître:)). Notez que GEMBIRD (1908:2311) ==http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .
L'utilisation du CPU avec 3*c270 est assez raisonnable sur un wdr3600 :
Mem: 50600K used, 75444K free, 320K shrd, 3436K buff, 8800K cached
CPU: 16% usr 27% sys 0% nic 45% idle 0% io 0% irq 10% sirq
Load average: 1.20 0.85 0.44 4/60 2546
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
2240 1679 root S 15348 12% 17% mjpg_streamer --input input_uvc.so --
2505 1679 root S 15368 12% 11% mjpg_streamer --input input_uvc.so --
2239 1679 root S 15532 12% 11% mjpg_streamer --input input_uvc.so --
Si la communauté offre une certaine réputation et un certain soutien, je pense que SwDevRefugee est prêt à intégrer le code dans uvc-linux.
J'ai regardé le pilote uvcvideo et le paramètre de module quirks=128 est ignoré si le flux est compressé en mjpeg.
Mes webcams de choix ont été la Logitech C500 et la Logitech C270, et j'ai trouvé que l'image produite par la C500 à 1280x1024 est de 100kbytes et l'image produite par la C270 à 1280x960 est de 200kbytes.
Si j'exécute le C270 à 10 images par seconde, le débit requis est de 10x200000x8 =16Mbit/s. Dans Ubuntu 14.04, le module uvcdriver alloue toujours 196 Mbits/s quelle que soit la fréquence d'images. Pour le C500, il se comporte un peu mieux, mais reste un gros consommateur de bande passante.
J'ai modifié le pilote uvcvideo afin de pouvoir fournir un facteur de "compression" au pilote via l'interface V4L2. C'est un "petit hacky" dans la mesure où j'ai utilisé l'attribut priv dans la structure v4l2_pix_format pour spécifier la valeur. Dans le pilote, il calcule la taille de l'image non compressée, puis la divise par le facteur de compression pour déterminer la bande passante USB à utiliser.
Par défaut, j'utilise un facteur de compression de 10 qui permet une grande marge si l'appareil photo rencontre une image particulièrement difficile à compresser. Le C270 fonctionnant à 1280x960 et 10fps utilise maintenant 41Mbit/s et je peux facilement faire fonctionner 4 caméras sur un bus.
Si quelqu'un est intéressé par cette fonctionnalité, j'essaierai d'amener les mainteneurs d'uvcvideo à considérer le concept de facteur de "compression".