Wir streamen den Bildschirm auf mehrere Geräte im Netzwerk

Wir streamen den Bildschirm auf mehrere Geräte im Netzwerk

Ich hatte die Notwendigkeit, ein Dashboard zur Überwachung auf mehreren Bildschirmen im Büro anzuzeigen. Mir stehen einige ältere Raspberry Pi Model B+ und ein Hypervisor mit praktisch unbegrenzten Ressourcen zur Verfügung.

Offensichtlich hat der Raspberry Pi Model B+ nicht die nötige Leistungsfähigkeit, um einen Browser ständig laufen zu lassen und eine große Menge an Grafik zu rendern. Daher kommt es vor, dass die Seite teilweise hakt und häufig abstürzt.

Es fand sich eine einfache und elegante Lösung, die ich mit Ihnen teilen möchte.

Wie bekannt ist, haben alle Raspberry eine ausreichend leistungsstarke GPU, die sich hervorragend für die hardwareseitige Videodecodierung eignet. So entstand die Idee, den Browser mit dem Dashboard irgendwo anders zu starten und den gerenderten Bildstream an den Raspberry zu übertragen.

Das sollte zudem die Verwaltung erleichtern, da in diesem Fall die gesamte Konfiguration auf einer einzigen virtuellen Maschine durchgeführt wird, die einfacher zu aktualisieren und zu sichern ist.

Gesagt, getan.

Server-Seite

Wir werden ein fertiges Cloud-Image für Ubuntu verwenden. Ohne Installation enthält es alles, was für die schnelle Bereitstellung einer virtuellen Maschine erforderlich ist, und Cloud-Init-Unterstützung hilft dabei, das Netzwerk sofort einzurichten, SSH-Schlüssel hinzuzufügen und es schnell in Betrieb zu nehmen.

Wir rollen eine neue virtuelle Maschine aus und installieren zuerst Xorg, nodm und fluxbox:

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

Wir nutzen auch die Konfiguration für Xorg, die uns freundlicherweise von Diego Ongaro zur Verfügung gestellt wurde, wobei wir nur die neue Auflösung hinzufügen 1920×1080, da alle unsere Monitore genau diese verwenden werden:

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

Jetzt installieren wir Firefox, wir werden ihn als Systemsservice ausführen, und dazu schreiben wir eine Unit-Datei für ihn:

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

Xdotool ist erforderlich, um Firefox direkt im Vollbildmodus zu starten.
Mit dem Parameter -url kann jede beliebige Seite angegeben werden, die beim Start des Browsers automatisch geöffnet werden soll.

An diesem Punkt ist unser Kiosk bereits bereit, aber jetzt müssen wir das Bild über das Netzwerk auf andere Monitore und Geräte exportieren. Dazu nutzen wir die Möglichkeiten von Motion JPEG, einem Format, das häufig für das Streaming von Videos von den meisten Webcams verwendet wird.

Dafür benötigen wir zwei Dinge: FFmpeg mit dem Modul x11grab, um das Bild von X aufzunehmen, und streamEye, das es an unsere Clients verteilt:

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 </dev/null | streameye'

[Install]
WantedBy=graphical.target
EOT

systemctl enable streameye
systemctl start streameye

Da unser Bild keine schnelle Aktualisierung benötigt, habe ich die Aktualisierungsfrequenz auf 1 Frame pro Sekunde festgelegt (Parameter -r 1) und die Kompressionsqualität auf 5 eingestellt (Parameter -q:v 5)

Jetzt versuchen wir, auf http://your-vm:8080/, und als Antwort sehen Sie einen ständig aktualisierten Screenshot des Desktops. Perfekt! – genau das, was benötigt wurde.

Client-Seite

Hier ist alles noch einfacher, wie ich bereits gesagt habe, verwenden wir Raspberry Pi Model B+.

Zuerst installieren wir darauf Arch Linux ARM, dafür folgen wir Anleitung der offiziellen Website.

Wir müssen auch mehr Speicher für unseren Grafikchip zuweisen, dafür bearbeiten wir in /boot/config.txt

gpu_mem=128

Laden Sie unser neues System und vergessen Sie nicht, den pacman Keyring zu initialisieren, installieren wir OMXPlayer:

pacman -Sy omxplayer

Bemerkenswert ist, dass OMXPlayer ohne X laufen kann, daher müssen wir lediglich eine Unit-Datei für ihn schreiben und starten:

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

Als Parameter -b http://your-vm:8080/ übergeben wir die URL von unserem Server.

Damit ist alles erledigt, auf dem angeschlossenen Bildschirm sollte sofort ein Bild von unserem Server angezeigt werden. Bei Problemen wird der Stream automatisch neu gestartet und die Clients stellen die Verbindung wieder her.

Als Bonus können Sie das erhaltene Bild als Bildschirmschoner auf allen Computern im Büro einstellen. Dazu benötigen Sie MPV und 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

Jetzt werden Ihre Kollegen sehr zufrieden sein 🙂

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster