Verrouillez votre appareil photo sur un port USB spécifique dans OBS

Si vous diffusez avec OBS avec plusieurs caméras sous Linux, vous remarquerez peut-être que les caméras sont chargées lorsqu’elles sont détectées lors du démarrage. Vous n’y réfléchissez probablement pas beaucoup, normalement, mais si vous avez une configuration de streaming permanente avec des modèles OBS complexes, vous devez savoir quelle caméra du monde physique va apparaître sur quel écran dans le monde virtuel. En d’autres termes, vous ne voulez pas affecter un appareil en tant que caméra A aujourd’hui uniquement pour qu’il devienne la caméra B demain.
Pour standardiser une configuration de caméra complexe, vous pouvez imposer des règles spéciales sur la façon dont les caméras sont attribuées à des emplacements dans le système de fichiers Linux.
Contents
Le sous-système udev
Le système traitant des périphériques matériels sous Linux s’appelle udev. Il détecte et gère tous les appareils que vous branchez sur votre ordinateur. Vous n’êtes probablement pas au courant car il n’attire pas trop l’attention sur lui-même, même si vous avez certainement interagi avec lui lorsque vous branchez une clé USB pour l’ouvrir sur votre bureau ou connectez une imprimante.
Détection de matériel
Supposons que vous ayez deux caméras USB : une à gauche de votre ordinateur et une à droite. La caméra de gauche prend un gros plan, la caméra de droite prend un plan long et vous basculez entre les deux pendant votre diffusion. Dans OBS, vous ajoutez chaque caméra à votre Sources panneau et, intuitivement, appeler un came GAUCHE et l’autre camDROITE.
En supposant le pire des cas, supposons que vous ayez deux des même appareils photo : ils sont de la même marque et du même numéro de modèle. C’est le pire des cas, car lorsque deux éléments matériels sont identiques, il y a peu de chances que chacun ait un identifiant unique pour que votre ordinateur les différencie l’un de l’autre.
Il existe cependant une solution à ce casse-tête, et cela nécessite juste une petite enquête à l’aide de commandes de terminal simples.
1. Obtenez les identifiants du fournisseur et du produit
Tout d’abord, branchez une seule caméra sur le port USB auquel vous souhaitez qu’elle soit affectée. Ensuite, lancez cette commande :
$ lsusb
Bus 006 Device 002: ID 0951:1666 Kingston Technology DataTraveler G4
Bus 005 Device 003: ID 03f0:3817 Hewlett-Packard LaserJet P2015 series
Bus 003 Device 006: ID 045e:0779 Microsoft Corp. LifeCam HD-3000
Bus 003 Device 002: ID 8087:0025 Intel Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 046d:c216 Logitech, Inc. Dual Action Gamepad
Bus 001 Device 002: ID 048d:5702 Integrated Technology Express, Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
[...]
Vous pouvez généralement rechercher spécifiquement la chaîne “cam” pour affiner les résultats, car la plupart des caméras (mais pas toutes) sont signalées comme une caméra.
$ lsusb | grep -i cam
Bus 003 Device 006: ID 045e:0779 Microsoft Corp. LifeCam HD-3000
Il y a beaucoup d’informations ici. L’ID est répertorié comme 045e:0779
. Le premier numéro est l’ID du fournisseur et le second est l’ID du produit. Notez-les car vous en aurez besoin plus tard.
2. Obtenez l’identifiant USB
Vous avez également obtenu le chemin du périphérique vers la caméra : bus 3, périphérique 6. Il y a un dicton dans Linux qui dit que “tout est un fichier”, et en effet les périphériques USB sont décrits à udev comme un chemin de fichier commençant par /dev/bus/usb/
et se terminant par le bus (003 dans ce cas) et le dispositif (006 dans ce cas). Regardez les numéros de bus et d’appareil dans le lsusb
sortir. Ils vous disent que cette caméra est située sur /dev/bus/usb/003/006
.
Vous pouvez utiliser le udevadm
commande pour obtenir l’indicatif du noyau pour ce périphérique USB :
$ sudo udevadm info
--attribute-walk
/dev/bus/usb/003/006 | grep "KERNEL="KERNEL=="3-6.2.1"
L’identifiant USB du noyau dans cet exemple est 3-6.2.1
. Notez l’identifiant de votre système car vous en aurez également besoin plus tard.
3. Répétez l’opération pour chaque caméra
Connectez l’autre appareil photo (ou les autres appareils photo, si vous en avez plus de deux) au port USB auquel vous souhaitez qu’il soit affecté. C’est différent que le port USB que vous avez utilisé pour l’autre appareil photo !
Répétez le processus, en obtenant l’ID du fournisseur et du produit (si les caméras sont de la même marque et du même modèle, ils doivent être les mêmes que le premier) et l’identifiant USB du noyau.
$ lsusb | grep -i cam
Bus 001 Device 004: ID 045e:0779 Microsoft Corp. LifeCam HD-3000
$ sudo udevadm info
--attribute-walk
/dev/bus/usb/001/004 | grep "KERNEL="KERNEL=="1-6"
Dans cet exemple, j’ai déterminé que mes caméras sont connectées à 1-6 et 3-6.2.1 (le premier est un port USB sur ma machine, l’autre est un concentrateur branché sur le moniteur branché sur ma machine , c’est pourquoi l’un est plus complexe que l’autre.)
Écrire une règle udev
Vous avez tout ce dont vous avez besoin, vous pouvez donc maintenant écrire une règle pour dire à udev de donner à chaque caméra un identifiant cohérent lorsqu’elle se trouve sur un port USB spécifique.
Créez et ouvrez un fichier appelé /etc/udev/rules.d/50-camera.conf
, et entrez ces deux règles, en utilisant les ID de fournisseur et de produit et les identificateurs de noyau appropriés pour votre propre système :
SUBSYSTEM=="usb", KERNEL=="1-6", ATTR{idVendor}=="045e", ATTR{idProduct}=="0779", SYMLINK+="video100"SUBSYSTEM=="usb", KERNEL=="3-6.2.1", ATTR{idVendor}=="045e", ATTR{idProduct}=="0779", SYMLINK+="video101"
Ces règles indiquent à udev que lorsqu’il trouve un périphérique correspondant à un fournisseur et à un ID de produit spécifiques à ces emplacements USB spécifiques, il doit créer un lien symbolique (parfois également appelé “alias”) nommé video100
et video101
. Les liens symboliques sont pour la plupart arbitraires. Je leur donne des nombres élevés, ils sont donc faciles à repérer et parce que le nombre ne doit pas entrer en conflit avec les appareils existants. Si vous avez réellement plus de 101 caméras connectées à votre ordinateur, utilisez video200
et video201
juste pour être en sécurité (et entrer en contact ! J’aimerais en savoir plus sur cette projet).
Redémarrer
Redémarrez votre ordinateur. Vous pouvez laisser les caméras attachées pour le moment, mais cela n’a pas vraiment d’importance. Une fois qu’udev a chargé une règle, elle suit ces règles, qu’un périphérique ait été connecté pendant le démarrage ou qu’il soit branché plus tard.
Beaucoup de gens disent que Linux n’a jamais besoin de redémarrer, mais udev charge ses règles pendant le démarrage, et en plus, vous voulez prouver que vos règles udev fonctionnent à travers les redémarrages.
Une fois que votre ordinateur est de nouveau opérationnel, jetez un œil à /dev/video
, où les caméras sont enregistrées :
$ ls -1 /dev/video*
/dev/video0
/dev/video1
/dev/video100
/dev/video101
/dev/video2
/dev/video3
Comme vous pouvez le voir, il y a des entrées à video100
et video101
. Aujourd’hui, ce sont des liens symboliques vers /dev/video2
et /dev/video3
, mais demain ils pourraient être des liens symboliques vers /dev/video1
et /dev/video2
, ou toute autre combinaison basée sur le moment où Linux a détecté et leur a attribué un fichier.
Vous pouvez cependant utiliser les liens symboliques dans OBS, de sorte que camLEFT soit toujours camLEFT et camRIGHT soit toujours camRIGHT.