Diffusez l'écran sur plusieurs appareils sur le réseau


J'avais besoin d'afficher des tableaux de bord avec surveillance sur plusieurs écrans du bureau. Il existe plusieurs anciens Raspberry Pi Model B + et un hyperviseur avec une quantité presque illimitée de ressources.


Apparemment, le Raspberry Pi Model B + n'a pas assez d'aléatoire pour maintenir le navigateur en cours d'exécution et dessiner un grand nombre de graphiques, à cause de quoi il se trouve que la page est partiellement boguée et se bloque souvent.


Il y avait une solution assez simple et élégante, que je veux partager avec vous.


Comme vous le savez, tous les Raspberry ont un processeur vidéo assez puissant, idéal pour le décodage vidéo matériel. L'idée est donc venue de lancer un navigateur avec un tableau de bord ailleurs et de transférer le flux fini avec l'image rendue vers la framboise.


En plus de tout cela, il était censé simplifier la gestion, car dans ce cas, toute la configuration sera effectuée sur une machine virtuelle, ce qui est plus facile à mettre à jour et à sauvegarder.


Aussitôt dit, aussitôt fait.


Côté serveur


Nous utiliserons une image cloud prête à l'emploi pour Ubuntu . Sans nécessiter d'installation, il contient tout ce dont vous avez besoin pour déployer rapidement une machine virtuelle et le support Cloud-Init vous aide à configurer instantanément votre réseau, à ajouter des clés ssh et à le mettre rapidement en service.


Nous déployons une nouvelle machine virtuelle et y installons tout d'abord Xorg , nodm et fluxbox :


apt-get update apt-get install -y xserver-xorg nodm fluxbox sed -i 's/^NODM_USER=.*/NODM_USER=ubuntu/' /etc/default/nodm 

Nous utilisons également la configuration Xorg aimablement fournie par Diego Ongaro, en ajoutant seulement la nouvelle résolution 1920x1080 , car tous nos moniteurs l'utiliseront:


 cat > /etc/X11/xorg.conf <<\EOT Section "Device" Identifier "device" Driver "vesa" EndSection Section "Screen" Identifier "screen" Device "device" Monitor "monitor" DefaultDepth 16 SubSection "Display" Modes "1920x1080" "1280x1024" "1024x768" "800x600" EndSubSection EndSection Section "Monitor" Identifier "monitor" HorizSync 20.0 - 50.0 VertRefresh 40.0 - 80.0 Option "DPMS" EndSection Section "ServerLayout" Identifier "layout" Screen "screen" EndSection EOT systemctl restart nodm 

Maintenant, installez Firefox, nous allons le démarrer en tant que service système, nous allons donc en même temps écrire un fichier d'unité:


 apt-get install -y firefox xdotool cat > /etc/systemd/system/firefox.service <<\EOT [Unit] Description=Firefox After=network.target [Service] Restart=always User=ubuntu Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/ubuntu/.Xauthority" ExecStart=/usr/bin/firefox -url 'http://example.org/mydashboard' ExecStartPost=/usr/bin/xdotool search --sync --onlyvisible --class "Firefox" windowactivate key F11 [Install] WantedBy=graphical.target EOT systemctl enable firefox systemctl start firefox 

Nous avons besoin de Xdotool pour exécuter Firefox directement en mode plein écran.
En utilisant le paramètre -url , -url pouvez spécifier n'importe quelle page afin qu'elle s'ouvre automatiquement au démarrage du navigateur.


À ce stade, notre kiosque est prêt, mais nous devons maintenant exporter l'image sur le réseau vers d'autres moniteurs et appareils. Pour ce faire, nous utiliserons les capacités de Motion JPEG , un format qui est le plus souvent utilisé pour diffuser des vidéos à partir de la plupart des caméras Web.


Pour ce faire, nous avons besoin de deux choses: FFmpeg avec le module x11grab , pour capturer des images à partir de X et streamEye , qui le distribuera à nos clients:


 apt-get install -y make gcc ffmpeg cd /tmp/ wget https://github.com/ccrisan/streameye/archive/master.tar.gz tar xvf master.tar.gz cd streameye-master/ make make install cat > /etc/systemd/system/streameye.service <<\EOT [Unit] Description=streamEye After=network.target [Service] Restart=always User=ubuntu Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/ubuntu/.Xauthority" ExecStart=/bin/sh -c 'ffmpeg -f x11grab -s 1920x1080 -r 1 -i :0 -f mjpeg -q:v 5 - 2>/dev/null | streameye' [Install] WantedBy=graphical.target EOT systemctl enable streameye systemctl start streameye 

Étant donné que notre image ne nécessite pas de mise à jour rapide, j'ai indiqué le taux de rafraîchissement: 1 image par seconde (paramètre -r 1 ) et la qualité de compression: 5 (paramètre -q:v 5 )


Maintenant, nous essayons d'aller sur http: // your-vm: 8080 / , en réponse, vous verrez une capture d'écran constamment mise à jour du bureau. Super! - c'était ce qu'il fallait.


Partie client


C'est encore plus simple ici, comme je l'ai dit, nous allons utiliser le Raspberry Pi Model B +.


Tout d'abord, installez Arch Linux ARM dessus, pour cela nous suivons les instructions sur le site officiel.


Nous aurons également besoin d'allouer plus de mémoire pour notre puce vidéo, pour cela nous /boot/config.txt dans /boot/config.txt


 gpu_mem=128 

Démarrez notre nouveau système et n'oubliez pas d'initialiser le trousseau de clés pacman, installez OMXPlayer :


 pacman -Sy omxplayer 

Remarquablement, OMXPlayer peut fonctionner sans X, c'est pourquoi tout ce que nous devons faire est d'écrire un fichier unitaire pour lui et de l'exécuter:


 cat > /etc/systemd/system/omxplayer.service <<\EOT [Unit] Description=OMXPlayer Wants=network-online.target After=network-online.target [Service] Type=simple Restart=always ExecStart=/usr/bin/omxplayer -r --live -b http://your-vm:8080/ --aspect-mode full [Install] WantedBy=multi-user.target EOT systemctl enable omxplayer systemctl start omxplayer 

En tant que paramètre -b http://your-vm:8080/ nous transmettons l'URL de notre serveur.


C'est tout, une image de notre serveur devrait apparaître immédiatement sur l'écran connecté. En cas de problème, le flux sera automatiquement redémarré et les clients s'y reconnecteront.


En prime, vous pouvez définir l'image résultante comme économiseur d'écran pour tous les ordinateurs du bureau. Pour ce faire, vous aurez besoin de MPV et XScreenSaver :


 mode: one selected: 0 programs: \ "Monitoring Screen" mpv --really-quiet --no-audio --fs \ --loop=inf --no-stop-screensaver \ --wid=$XSCREENSAVER_WINDOW \ http://your-vm:8080/ \n\ maze -root \n\ electricsheep --root 1 \n\ 

Maintenant, vos collègues seront très heureux :)

Source: https://habr.com/ru/post/fr450118/


All Articles