Streamen Sie den Bildschirm über das Netzwerk auf mehrere Geräte

Streamen Sie den Bildschirm über das Netzwerk auf mehrere Geräte

Ich hatte das Bedürfnis, ein Dashboard mit Überwachung auf mehreren Bildschirmen im Büro anzuzeigen. Es gibt mehrere alte Raspberry Pi Model B+ und einen Hypervisor mit nahezu unbegrenzten Ressourcen.

Anscheinend verfügt der Raspberry Pi Model B+ nicht über genügend Zufälligkeit, um den Browser ständig laufen zu lassen und viele Grafiken darin darzustellen, wodurch es vorkommen kann, dass die Seite teilweise fehlerhaft ist und häufig abstürzt.

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

Wie Sie wissen, verfügen alle Raspberry über einen recht leistungsstarken Videoprozessor, der sich hervorragend für die Hardware-Videodekodierung eignet. So entstand die Idee, irgendwo anders einen Browser mit Dashboard zu starten und einen fertigen Stream mit einem gerenderten Bild auf den Raspberry zu übertragen.

Darüber hinaus sollte die Verwaltung dadurch vereinfacht werden, da in diesem Fall die gesamte Konfiguration auf einer virtuellen Maschine durchgeführt wird, was einfacher zu aktualisieren und zu sichern ist.

Gesagt, getan.

Serverteil

Wir verwenden fertig Cloud-Image für Ubuntu. Es erfordert keine Installation und enthält alles, was Sie zum schnellen Bereitstellen einer virtuellen Maschine benötigen CloudInit-Unterstützung hilft dabei, ein Netzwerk sofort einzurichten, SSH-Schlüssel hinzuzufügen und es schnell in Betrieb zu nehmen.

Wir stellen eine neue virtuelle Maschine bereit und installieren sie zunächst darauf Xorg, nom и Fluxbox:

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

Wir werden freundlicherweise auch die Konfiguration für Xorg verwenden gewährt uns Diego Ongaro, der nur eine neue Auflösung hinzufügt 1920/1080, da alle unsere Monitore es 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 werden wir Firefox installieren, ihn als Systemdienst ausführen, also zum einen eine Unit-Datei dafür schreiben:

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

Wir benötigen Xdotool, um Firefox sofort im Vollbildmodus auszuführen.
Verwenden des Parameters -url Sie können eine beliebige Seite so festlegen, dass sie beim Start des Browsers automatisch geöffnet wird.

Zu diesem Zeitpunkt ist unser Kiosk fertig, aber jetzt müssen wir das Bild über das Netzwerk auf andere Monitore und Geräte exportieren. Dazu werden wir die Möglichkeiten nutzen Motion JPEG, ein Format, das häufiger zum Streamen von Videos von den meisten Webcams verwendet wird.

Dazu benötigen wir zwei Dinge: FFmpeg mit Modul x11grab, zum Aufnehmen von Bildern von x's und streamEye, die es an unsere Kunden verteilen wird:

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

Da unser Bild keine schnelle Aktualisierung benötigt, habe ich die Bildwiederholfrequenz angegeben: 1 Bild pro Sekunde (Parameter -r 1) und Komprimierungsqualität: 5 (Parameter -q:v 5)

Versuchen wir nun, zu gehen http://your-vm:8080/, als Antwort sehen Sie einen ständig aktualisierten Screenshot des Desktops. Großartig! – was benötigt wurde.

Kundenteil

Hier ist es noch einfacher, wie gesagt, wir werden den Raspberry Pi Model B+ verwenden.

Lassen Sie es uns zunächst installieren ArchLinux-ARM, dafür folgen wir Anleitung auf der offiziellen Seite.

Außerdem müssen wir unserem Videochip mehr Speicher zuweisen, dafür werden wir ihn bearbeiten /boot/config.txt

gpu_mem=128

Starten wir unser neues System und vergessen Sie nicht, den Pacman-Schlüsselbund zu initialisieren und zu installieren OMXPlayer:

pacman -Sy omxplayer

Bemerkenswerterweise kann OMXPlayer auch ohne x funktionieren, wir müssen also nur eine Unit-Datei dafür schreiben und Folgendes ausführen:

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/ Wir übergeben die URL von unserem Server.

Das ist alles, ein Bild von unserem Server sollte sofort auf dem angeschlossenen Bildschirm erscheinen. Bei Problemen wird der Stream automatisch neu gestartet und die Clients stellen erneut eine Verbindung her.

Als Bonus können Sie das resultierende Bild als Bildschirmschoner auf allen Computern im Büro installieren. Dafür benötigen Sie MPV и 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 glücklich sein 🙂

Source: habr.com

Kommentar hinzufügen