Documentation pour MJPGServer

Le MJPGServer est un logiciel de serveur de streaming pour une caméra USB2.0 standard (ou toute autre source V4L2 supportée) qui supporte le streaming de résolutions multiples.

Il peut être utilisé à la fois pour surveiller une imprimante 3D avec un flux vidéo basse résolution et pour capturer des images haute résolution afin de construire de belles vidéos en temps réel.

L'utilisation de ce serveur nécessite une source vidéo qui compresse les images au format JPEG. La plupart des caméras USB2.0 avec une résolution FullHD supportent cette fonction. Si vous n'êtes pas sûr, veuillez suivre les liens affiliés ci-dessous pour trouver une caméra qui fonctionne bien pour cette tâche. Elle nécessite également un ordinateur Linux (Raspberry Pi, Orange Pi, 3.1415926535...).

Vous pouvez utiliser la distribution que vous voulez, le serveur n'a pas de dépendances.

Récupérer les sources et construire le serveur

Si vous avez installé Git, vous pouvez récupérer toutes les sources nécessaires en lançant cette commande :

$ git clone https://github.com/X-Ryl669/MJPGServer.git

Sinon, vous devrez télécharger l'archive du code source depuis ici et la décompresser dans un dossier (appelons-le "MJPGServer").

Ensuite, vous pouvez construire le serveur de cette façon :

$ cd MJPGServer/build/linux
$ make

(Si la dernière commande a échoué, vous devrez installer un compilateur C++ et GNU make, consultez la documentation de votre distribution pour cela)

Il devrait retourner ceci :

>  Computing dependencies for JSON.cpp
>  Computing dependencies for LogLevel.cpp
>  Computing dependencies for V4L2Source.cpp
>  Computing dependencies for MJPGServer.cpp
>  Compiling MJPGServer.cpp
>  Compiling V4L2Source.cpp
>  Compiling LogLevel.cpp
>  Compiling JSON.cpp
>  Compiling Threads.cpp into ClassPath/Threading/
>  Compiling Lock.cpp into ClassPath/Threading/
>  Compiling HashKey.cpp into ClassPath/Hash/
>  Compiling Logger.cpp into ClassPath/Logger/
>  Compiling bstrwrap.cpp into ClassPath/Strings/BString/
>  Compiling Strings.cpp into ClassPath/Strings/
>  Compiling MemoryBlock.cpp into ClassPath/Utils/
>  Compiling Linux.cpp into ClassPath/Platform/
>  Compiling File.cpp into ClassPath/File/
>  Compiling Encode.cpp into ClassPath/Encoding/
>  Compiling Streams.cpp into ClassPath/Streams/
>  Compiling __version__.cpp into ClassPath/
../../ClassPath/src/__version__.cpp:227:64: note: « #pragma message: Using ClassPath with flags _ AES _ _ TLS Base Float Chrono Atomic MD5 ExLock _ Compress _ RegEx _ _ _ _ _ _ Debug  »
  227 |         #pragma message("Using ClassPath with flags " FlagNames)
      |                                                                ^
>  Compiling Time.cpp into ClassPath/Time/
>  Compiling Socket.cpp into ClassPath/Network/
>  Compiling Server.cpp into ClassPath/Network/
>  Compiling Connection.cpp into ClassPath/Network/
>  Compiling Address.cpp into ClassPath/Network/
>  Compiling HTTP.cpp into ClassPath/Network/Servers/
>  Compiling AES.cpp into ClassPath/Crypto/
>  Compiling HTTPCode.cpp into ClassPath/Protocol/HTTP/
>  Compiling TextualHeaders.cpp into ClassPath/Network/Clients/
>  Compiling LinuxSpecific.cpp into ClassPath/Network/
>  Compiling Random.cpp into ClassPath/Crypto/
>  Compiling bstrlib.c into ClassPath/Strings/BString/
Linking mjpgsrv

Félicitations, vous avez fini de construire le logiciel!

Tester que ça marche pour vous

Par défaut, le serveur nécessite une configuration pour savoir quelle source vidéo, quel format, quel port et ainsi de suite pour fonctionner.

Bien que vous puissiez définir tous ces paramètres à la main, il est beaucoup plus facile d'écrire un fichier de configuration et de laisser le serveur le digérer.

Heureusement, je fournis un fichier de configuration par défaut que vous pourrez modifier avec vos propres paramètres. Donc, faisons-le :

$ cp ../../defaultConfig.json config.json
$ nano config.json

Un éditeur devrait s'ouvrir pour vous permettre de modifier la configuration. En gros, les paramètres suivants sont disponibles :

Clé Format de la valeur attendue Signification Valeur par défaut
port entier non signé dans la plage [1-65535] Le port HTTP à écouter 8080
closeDeviceTimeoutSec entier non signé en secondes Délai avant la fermeture d'un périphérique inutilisé, 0 pour désactiver la fonction 0
device string Chemin d'accès au périphérique de caméra V4L2 à ouvrir /dev/video0
daemonize booléen (true or false) Si true, le serveur fonctionne en arrière-plan et abandonne les privilèges(*) false
logLevel -1, 0, 1, 2, 3 -1 : debug, 0 : info, 1 : warning, 2 : error, 3 : silent 0
lowResWidth entier non signé en pixels Nombre de colonnes du flux vidéo de prévisualisation (basse résolution) 640
lowResHeight entier non signé en pixels Nombre de lignes du flux vidéo de prévisualisation (basse résolution) 480
highResWidth entier non signé en pixels Nombre de colonnes de l'image haute résolution max detected
highResHeight entier non signé en pixels Nombre de lignes de l'image haute résolution max detected
stabPicCount entier non signé en trames Nombre d'images instables ignorées lors d'un changement de résolution 0
securityToken string Si donné, l'accès au flux nécessitera ce jeton secret empty

Lorsque vous utilisez le mode daemonize, le serveur ouvre le port TCP/HTTP et abandonne ensuite les privilèges (pour éviter de fonctionner avec les privilèges root). Cependant, si vous avez activé le paramètre closeDeviceTimeoutSec, vous risquez d'obtenir une erreur lorsque le logiciel essaiera de rouvrir un périphérique fermé car il n'aura plus les privilèges requis pour le faire.

Donc, soit vous désactivez closeDeviceTimeoutSec (en mettant 0), soit vous vous assurez que l'utilisateur non privilégié a le droit de rouvrir le périphérique vidéo.

securityToken, lorsqu'il est utilisé, nécessite d'ajouter un ?token=yoursecuritytokenhere à l'URL des flux. Ceci a pour but d'empêcher le libre accès aux flux si le serveur est directement accessible sur Internet. Il s'agit d'une sécurité par secret qui est transmise en clair sur le paramètre HTTP.

Cela signifie que sur le protocole HTTP, il est possible de d'espioner librement sur le lien réseau. Vous ne devez vous fier uniquement à cette sécurité que si vous disposez d'un proxy HTTPS inverse afin que les informations ne soient pas transmises en clair.

L'utiliser sur le protocole HTTP est mieux que rien (au moins, cela permet de garder les yeux privés hors de la vue), mais n'oubliez pas que c'est toujours limité, en termes de sécurité.

Testons!

Une fois que vous avez fini de modifier vos valeurs de configuration, vérifiez que le serveur fonctionne en exécutant :

$ ./mjpgsrv -j config.json

Cela devrait produire un résultat :

Thank you for using MJPGServer
Detected maximum picture size as 1280 x 720

Video set up for width:640, height:480, format:MJPG - LittleEndian
Server started on: http://10.250.3.89:8080?token=verySecretToken

La dernière ligne contient l'URL que vous devez visiter pour regarder votre flux. Copiez et collez dans votre navigateur et vous devriez voir la vidéo de votre caméra directement dans votre navigateur. Vérifiez également que vous pouvez capturer des images en pleine résolution.

Dans cette page, vous aurez les 2 URL pour les streams directs comme ceci :

Capture d'écran de MJPGServer

Vous pouvez copier ces URLs dans Octoprint (la première va dans le champ du flux direct, la dernière dans le plugin Octolapse).

Installer le serveur pour qu'il démarre au démarrage

Pour installer le serveur au démarrage, il suffit de lancer la commande suivante dans le répertoire de construction:

$ make install

Éditez ensuite le fichier /etc/mjpgserver/config.json pour qu'il corresponde à vos attentes (via sudo nano /etc/mjpgserver/config.json), et ajoutez le service au système pour qu'il démarre comme attendu:

$ sudo systemctl enable mjpgserver
$ sudo systemctl start mjpgserver

Voilà!

Article précédent Article suivant

Liens sponsorisés

Afin de m'aider à financer l'infrastructure de ce blog, je liste à la fin des billets les liens affiliés sur le matériel évoqué ci-dessus.

Articles en relation