Przesyłaj strumieniowo ekran do wielu urządzeń przez sieć

Przesyłaj strumieniowo ekran do wielu urządzeń przez sieć

Potrzebowałem wyświetlić dashboard z monitoringiem na kilku ekranach w biurze. Jest kilka starych Raspberry Pi Model B+ i hypervisor z niemal nieograniczoną ilością zasobów.

Najwyraźniej Raspberry Pi Model B+ nie ma wystarczającej losowości, aby przeglądarka działała stale i renderowała w niej dużo grafiki, przez co zdarza się, że strona jest częściowo zabugowana i często się zawiesza.

Było dość proste i eleganckie rozwiązanie, którym chcę się z tobą podzielić.

Jak wiesz, wszystkie Maliny mają dość mocny procesor wideo, który doskonale nadaje się do sprzętowego dekodowania wideo. Pojawił się więc pomysł, aby uruchomić przeglądarkę z pulpitem nawigacyjnym gdzie indziej i przesłać gotowy strumień z wyrenderowanym obrazem do maliny.

Ponadto powinno to uprościć zarządzanie, ponieważ w tym przypadku cała konfiguracja zostanie przeprowadzona na jednej maszynie wirtualnej, co jest łatwiejsze do aktualizacji i tworzenia kopii zapasowych.

Nie prędzej powiedziane niż zrobione.

Część serwerowa

Używamy gotowych Obraz w chmurze dla Ubuntu. Nie wymaga instalacji, zawiera wszystko, czego potrzebujesz, aby szybko wdrożyć maszynę wirtualną i Obsługa CloudInit pomaga błyskawicznie skonfigurować sieć, dodać klucze ssh i szybko uruchomić ją.

Wdrażamy nową maszynę wirtualną i przede wszystkim instalujemy ją na niej Xorg, nie m и pole topnika:

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

Uprzejmie użyjemy również konfiguracji dla Xorg nadany nas Diego Ongaro, dodając tylko nowe postanowienie 1920 × 1080, ponieważ będą go używać wszystkie nasze monitory:

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

Teraz zainstalujemy Firefoksa, uruchomimy go jako usługę systemową, więc po pierwsze napiszemy dla niego plik jednostkowy:

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

Potrzebujemy Xdotool, aby natychmiast uruchomić Firefoxa w trybie pełnoekranowym.
Korzystanie z parametru -url możesz określić dowolną stronę, aby otwierała się automatycznie po uruchomieniu przeglądarki.

Na tym etapie nasz kiosk jest gotowy, ale teraz musimy wyeksportować obraz przez sieć na inne monitory i urządzenia. Aby to zrobić, wykorzystamy możliwości Motion JPEG, format częściej używany do przesyłania strumieniowego wideo z większości kamer internetowych.

Do tego potrzebujemy dwóch rzeczy: FFmpeg z modułem x11 chwyć, do robienia zdjęć z X i strumieniowe oko, która będzie dystrybuować ją do naszych klientów:

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

Ponieważ nasze zdjęcie nie wymaga szybkiej aktualizacji, określiłem częstotliwość odświeżania: 1 klatka na sekundę (parametr -r 1) i jakość kompresji: 5 (parametr -q:v 5)

Teraz spróbujmy przejść do http://your-vm:8080/, w odpowiedzi zobaczysz stale aktualizowany zrzut ekranu pulpitu. Świetnie! — co było potrzebne.

Część klienta

Tutaj jest jeszcze łatwiej, tak jak mówiłem, użyjemy Raspberry Pi Model B+.

Przede wszystkim zainstalujmy go Ramię ArchLinux, za to podążamy instrukcje na oficjalnej stronie internetowej.

Będziemy również musieli przydzielić więcej pamięci dla naszego układu wideo, w tym celu będziemy edytować /boot/config.txt

gpu_mem=128

Uruchommy nasz nowy system i nie zapomnijmy zainicjować pęku kluczy pacmana, zainstalować Odtwarzacz OMX:

pacman -Sy omxplayer

Co ciekawe, OMXPlayer może działać bez x, więc wszystko, czego potrzebujemy, to napisać dla niego plik jednostkowy i uruchomić:

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

Jako parametr -b http://your-vm:8080/ przekazujemy adres URL z naszego serwera.

To wszystko, obraz z naszego serwera powinien natychmiast pojawić się na podłączonym ekranie. W przypadku jakichkolwiek problemów strumień zostanie automatycznie uruchomiony ponownie, a klienci ponownie się z nim połączą.

Jako bonus możesz zainstalować powstały obraz jako wygaszacz ekranu na wszystkich komputerach w biurze. Do tego będziesz potrzebować 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

Teraz Twoi koledzy będą bardzo zadowoleni 🙂

Źródło: www.habr.com

Dodaj komentarz