L'exécution de plus d'une webcam USB dans Debian / Linux entraîne l'erreur suivante:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
Ce qui semblait initialement être un problème de programmation dans OpenCV s'est transformé en quête d'un mystérieux problème matériel / logiciel après que les mêmes erreurs ont été produites en exécutant cheese et xawtv.
Apparemment, cela est dû au fait que les webcams demandent toute la bande passante disponible sur le contrôleur hôte USB. Dans cet esprit, j'ai décidé d'exécuter WireShark et Capinfos pour voir la bande passante utilisée par une seule caméra.
4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720
Intéressant! Cela pourrait expliquer pourquoi deux caméras à 320x240 fonctionnent mais toute résolution supérieure échoue. C'est comme si mon contrôleur USB ne fonctionnait qu'à des vitesses USB 1, mais lsusb affiche les deux webcams appartenant à un appareil qui prend en charge soi-disant 480 mégabits par seconde.
Une solution a proposé de forcer les webcams à calculer leur utilisation de bande passante au lieu de demander leur maximum en exécutant les commandes suivantes:
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
Malheureusement, cela n'a fait aucune différence, j'ai donc décidé d'essayer une autre solution. Un message sur StackOverflow a suggéré de dire à mes webcams d'utiliser un FPS inférieur ou un format vidéo compressé comme MJPEG, mais après avoir exécuté la liste v4lctl, aucune de mes webcams ne prend en charge la modification de leur mode vidéo.
Et c'est là que je suis coincé. Pourquoi deux webcams fonctionnant bien en dessous de la vitesse maximale d'USB 2 produiraient-elles cette erreur?
ps: Ce n'est pas un problème d'espace disque, df n'affiche aucun changement au démarrage des webcams.
pps: Si cela fait une différence, voici la sortie de lsusb
v4l2-ctl
est en effet un excellent outil de débogage. J'ai beaucoup appris sur mon appareil photo et j'ai pu résoudre le problème. Quoi qu'il en soit, j'ai pu le corriger en forçant la résolution de mon appareil photo320x240
et en l'utilisantYUYV
comme mode de sortie de l'appareil photo.guvcview
a également beaucoup aidé.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 mod'ed 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:
RÉSULTAT: 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 avec le format YUV, mais l'ajout d'un 2ème GEMBIRD conduit à la redoutable "Impossible de démarrer la capture: il n'y a 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 processeur avec 3 * c270 est assez raisonnable sur un wdr3600:
Si la communauté donne une certaine réputation et un certain soutien, je pense que SwDevRefugee est prêt à introduire le code dans uvc-linux.
la source
J'ai regardé le pilote uvcvideo et le paramètre du module quirks = 128 est ignoré si le flux est compressé en mjpeg.
Mes webcams de choix ont été le Logitech C500 et le Logitech C270, et j'ai trouvé que l'image produite par le C500 à 1280x1024 est de 100 Ko et l'image produite par le C270 à 1280x960 est de 200 Ko.
Si j'exécute le C270 à 10fps, le débit requis est 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 porc 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" en ce que j'ai utilisé l'attribut priv dans la struct 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 exécuter 4 caméras sur un bus.
Si quelqu'un est intéressé par cette fonctionnalité, j'essaierai d'amener les responsables uvcvideo à considérer le concept de facteur de "compression".
la source
J'ai aussi obtenu cette erreur d'espace. Ce qui a fonctionné, c'est de débrancher l'une des caméras et de la brancher sur un autre port USB de mon PC fixe - il y a environ 6 ou 7 ports USB dispersés à ce sujet. L'exécution de «show_webcams 0 1» a soudainement fait apparaître les deux images.
la source