Strömma skärmen till flera enheter över nätverket

Strömma skärmen till flera enheter över nätverket

Jag hade ett behov av att visa en instrumentpanel med övervakning på flera skärmar på kontoret. Det finns flera gamla Raspberry Pi Model B+ och en hypervisor med en nästan obegränsad mängd resurser.

Tydligen har Raspberry Pi Model B+ inte tillräckligt med slumpmässighet för att hålla webbläsaren ständigt igång och rendera mycket grafik i den, på grund av vilket det händer att sidan är delvis buggig och ofta kraschar.

Det fanns en ganska enkel och elegant lösning, som jag vill dela med mig av.

Som ni vet har alla hallon en ganska kraftfull videoprocessor, vilket är utmärkt för hårdvaruvideoavkodning. Så idén kom upp att lansera en webbläsare med en instrumentpanel någon annanstans, och skicka en färdig stream med en renderad bild till hallonet.

Dessutom borde detta ha förenklat hanteringen, eftersom i detta fall all konfiguration kommer att utföras på en virtuell maskin, vilket är lättare att uppdatera och säkerhetskopiera.

Inte tidigare sagt än gjort.

Server del

Vi använder redo Cloud Image för Ubuntu. Kräver ingen installation, den innehåller allt du behöver för att snabbt distribuera en virtuell maskin, och CloudInit-stöd hjälper till att omedelbart sätta upp ett nätverk, lägga till ssh-nycklar och snabbt sätta i drift.

Vi distribuerar en ny virtuell maskin och installerar den först och främst på den xorg, nodm и flusslåda:

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

Vi kommer också att använda konfigurationen för Xorg, vänligen beviljas us Diego Ongaro, lägger bara till en ny upplösning 1920 × 1080, eftersom alla våra monitorer kommer att använda det:

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

Nu ska vi installera Firefox, vi kommer att köra den som en systemtjänst, så för en sak kommer vi att skriva en enhetsfil för den:

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

Vi behöver Xdotool för att kunna köra firefox omedelbart i helskärmsläge.
Använder parameter -url du kan ange vilken sida som helst så att den öppnas automatiskt när webbläsaren startar.

I det här skedet är vår kiosk klar, men nu behöver vi exportera bilden över nätverket till andra bildskärmar och enheter. För att göra detta kommer vi att använda möjligheterna Motion JPEG, ett format som oftare används för att streama video från de flesta webbkameror.

För detta behöver vi två saker: FFmpeg med modul x11 ta tag, för att ta bilder från X:s och streamEye, som kommer att distribuera den till våra kunder:

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

Eftersom vår bild inte kräver en snabb uppdatering, angav jag uppdateringsfrekvensen: 1 bildruta per sekund (parameter -r 1) och komprimeringskvalitet: 5 (parameter -q:v 5)

Nu ska vi försöka gå till http://your-vm:8080/, som svar kommer du att se en ständigt uppdaterad skärmdump av skrivbordet. Bra! – vad som behövdes.

Klientsidan

Det är fortfarande enklare här, som sagt, vi kommer att använda Raspberry Pi Model B+.

Först och främst, låt oss installera det ArchLinux ARM, för detta följer vi Avstånd på den officiella webbplatsen.

Vi kommer också att behöva allokera mer minne för vårt videochip, för detta kommer vi att redigera in /boot/config.txt

gpu_mem=128

Låt oss starta upp vårt nya system och glöm inte att initialisera pacman-nyckelringen, installera OMXPlayer:

pacman -Sy omxplayer

Anmärkningsvärt nog kan OMXPlayer fungera utan X, så allt vi behöver är att skriva en enhetsfil för det och köra:

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

Som en parameter -b http://your-vm:8080/ vi skickar url från vår server.

Det är allt, en bild från vår server bör omedelbart visas på den anslutna skärmen. Vid eventuella problem kommer streamen att startas om automatiskt och klienter kommer att återansluta till den.

Som en bonus kan du installera den resulterande bilden som en skärmsläckare på alla datorer på kontoret. För detta behöver du 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

Nu kommer dina kollegor att bli väldigt glada 🙂

Källa: will.com

Lägg en kommentar