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

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

J'avais un besoin d'afficher un tableau de bord avec suivi sur plusieurs écrans au bureau. Il existe plusieurs anciens Raspberry Pi Model B+ et un hyperviseur avec une quantité quasi illimitée de ressources.

Apparemment, le Raspberry Pi Model B+ n'a pas assez d'aléatoire pour que le navigateur fonctionne constamment et affiche beaucoup de graphiques, à cause de quoi il arrive que la page soit 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, toutes les framboises ont un processeur vidéo assez puissant, ce qui est 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 d'envoyer un flux prêt à l'emploi avec une image rendue à la framboise.

De plus, cela devrait avoir une gestion simplifiée, puisque dans ce cas, toute la configuration sera effectuée sur une seule machine virtuelle, ce qui est plus facile à mettre à jour et à sauvegarder.

À peine dit que c'était fait.

Partie serveur

Nous utilisons prêt Image cloud pour Ubuntu. Ne nécessitant aucune installation, il contient tout ce dont vous avez besoin pour déployer rapidement une machine virtuelle, et Prise en charge de CloudInit aide à configurer instantanément un réseau, à ajouter des clés ssh et à le mettre rapidement en service.

Nous déployons une nouvelle machine virtuelle et l'installons d'abord dessus Xorg, nomm и boîte à flux:

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

Nous utiliserons également la configuration pour Xorg, veuillez accordé nous Diego Ongaro, ajoutant seulement une nouvelle résolution 1920 × 1080, puisque 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, nous allons installer Firefox, nous allons l'exécuter en tant que service système, donc pour commencer, nous allons écrire un fichier unité pour lui :

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 immédiatement en mode plein écran.
Utilisation du paramètre -url vous pouvez spécifier n'importe quelle page pour qu'elle s'ouvre automatiquement au démarrage du navigateur.

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

Pour cela, nous avons besoin de deux choses : FFmpeg avec modules x11saisir, pour capturer des images de X et fluxEye, 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 -i :0 -r 1 -f mjpeg -q:v 5 - 2>/dev/null | streameye'

[Install]
WantedBy=graphical.target
EOT

systemctl enable streameye
systemctl start streameye

Comme notre image ne nécessite pas de mise à jour rapide, j'ai précisé le taux de rafraichissement : 1 image par seconde (paramètre -r 1) et qualité de compression : 5 (paramètre -q:v 5)

Essayons maintenant d'aller à http://your-vm:8080/, en réponse, vous verrez une capture d'écran constamment mise à jour du bureau. Super! — ce qu'il fallait.

Côté client

C'est quand même plus simple ici, comme je l'ai dit, on va utiliser le Raspberry Pi Model B+.

Tout d'abord, installons-le Arc Linux ARM, pour cela nous suivons instructions sur le site officiel.

Nous devrons également allouer plus de mémoire pour notre puce vidéo, pour cela nous allons éditer en /boot/config.txt

gpu_mem=128

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

pacman -Sy omxplayer

Remarquablement, OMXPlayer peut fonctionner sans X, donc tout ce dont nous avons besoin est d'écrire un fichier d'unité pour lui et d'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 installer l'image résultante comme économiseur d'écran sur tous les ordinateurs du bureau. Pour cela, vous aurez besoin MPV и XSscreenSaver:

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: habr.com

Ajouter un commentaire