Stream het scherm naar meerdere apparaten via het netwerk

Stream het scherm naar meerdere apparaten via het netwerk

Ik had behoefte om een ​​dashboard met monitoring weer te geven op meerdere schermen op kantoor. Er zijn verschillende oude Raspberry Pi Model B + en een hypervisor met een bijna onbeperkte hoeveelheid bronnen.

Blijkbaar heeft de Raspberry Pi Model B+ niet genoeg willekeur om de browser constant aan de gang te houden en er veel grafische afbeeldingen in weer te geven, waardoor het gebeurt dat de pagina gedeeltelijk buggy is en vaak crasht.

Er was een vrij eenvoudige en elegante oplossing, die ik met u wil delen.

Zoals u weet, hebben alle frambozen een vrij krachtige videoprocessor, wat geweldig is voor hardwarevideodecodering. Zo ontstond het idee om ergens anders een browser met een dashboard te starten, en een kant-en-klare stream met een gerenderde afbeelding naar de framboos te sturen.

Bovendien zou dit het beheer moeten vereenvoudigen, aangezien in dit geval alle configuratie op één virtuele machine wordt uitgevoerd, wat gemakkelijker te updaten en te back-uppen is.

Zo gezegd zo gedaan.

Servergedeelte

Wij gebruiken klaar Cloudafbeelding voor Ubuntu. Het vereist geen installatie en bevat alles wat u nodig hebt om snel een virtuele machine te implementeren, en CloudInit-ondersteuning helpt om direct een netwerk op te zetten, ssh-sleutels toe te voegen en snel in gebruik te nemen.

We implementeren een nieuwe virtuele machine en installeren deze er allereerst op Xorg, knik и fluxdoos:

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

We zullen ook de configuratie voor Xorg gebruiken, vriendelijk toegekend ons Diego Ongaro, die alleen een nieuwe resolutie toevoegt 1920 × 1080, aangezien al onze monitoren het zullen gebruiken:

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 gaan we Firefox installeren, we zullen het uitvoeren als een systeemservice, dus om te beginnen zullen we er een eenheidsbestand voor schrijven:

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

We hebben Xdotool nodig om firefox onmiddellijk in volledige schermmodus uit te voeren.
De parameter gebruiken -url u kunt elke pagina specificeren zodat deze automatisch wordt geopend wanneer de browser start.

In dit stadium is onze kiosk klaar, maar nu moeten we de afbeelding via het netwerk exporteren naar andere monitoren en apparaten. Hiervoor maken we gebruik van de mogelijkheden Motion JPEG, een indeling die vaker wordt gebruikt voor het streamen van video vanaf de meeste webcams.

Hiervoor hebben we twee dingen nodig: FFmpeg met moduul x11grijp, voor het vastleggen van foto's van X's en stroomOog, die het zal verspreiden onder onze klanten:

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

Omdat onze foto geen snelle update nodig heeft, heb ik de verversingssnelheid opgegeven: 1 frame per seconde (parameter -r 1) en compressiekwaliteit: 5 (parameter -q:v 5)

Laten we nu proberen om naar toe te gaan http://your-vm:8080/, als reactie ziet u een constant bijgewerkte schermafbeelding van het bureaublad. Geweldig! - wat nodig was.

Kant van de cliënt

Het is hier nog gemakkelijker, zoals ik al zei, we zullen de Raspberry Pi Model B + gebruiken.

Laten we het eerst installeren ArchLinux ARM, hiervoor volgen we instructies op de officiële site.

We zullen ook meer geheugen moeten toewijzen voor onze videochip, hiervoor gaan we monteren /boot/config.txt

gpu_mem=128

Laten we ons nieuwe systeem opstarten en vergeet niet de pacman-sleutelhanger te initialiseren, installeren OMXPlayer:

pacman -Sy omxplayer

Opmerkelijk is dat OMXPlayer zonder x kan werken, dus we hoeven er alleen maar een eenheidsbestand voor te schrijven en uit te voeren:

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/ we geven de url van onze server door.

Dat is alles, een afbeelding van onze server zou onmiddellijk op het aangesloten scherm moeten verschijnen. In geval van problemen wordt de stream automatisch opnieuw gestart en maken clients er opnieuw verbinding mee.

Als bonus kunt u de resulterende afbeelding als screensaver op alle computers op kantoor installeren. Hiervoor heb je nodig 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 zullen je collega's heel blij zijn 🙂

Bron: www.habr.com

Voeg een reactie