Поточно предаване на екрана към множество устройства по мрежата

Поточно предаване на екрана към множество устройства по мрежата

Имах нужда да изведа табло с мониторинг на няколко екрана в офиса. Има няколко стари Raspberry Pi Model B + и хипервайзор с почти неограничено количество ресурси.

Явно Raspberry Pi Model B+ няма достатъчно произволност, за да поддържа браузъра постоянно работещ и рендиране на много графики в него, поради което се случва страницата да е частично бъги и често да се срива.

Имаше едно доста просто и елегантно решение, което искам да споделя с вас.

Както знаете, всички Raspberries имат доста мощен видео процесор, който е чудесен за хардуерно видео декодиране. Така се появи идеята да стартирам браузър с табло на друго място и да прехвърля готов поток с рендирана картина в малината.

Плюс това, това трябва да има опростено управление, тъй като в този случай цялата конфигурация ще се извършва на една виртуална машина, която е по-лесна за актуализиране и архивиране.

Не по-рано казано, отколкото направено.

Сървърна част

Използваме готови Облачно изображение за Ubuntu. Не изисква инсталация, той съдържа всичко необходимо за бързо разгръщане на виртуална машина и Поддръжка на CloudInit помага незабавно да настроите мрежа, да добавите ssh ключове и бързо да я пуснете в експлоатация.

Разполагаме нова виртуална машина и първо я инсталираме на нея Xorg, кимам и кутия за флюс:

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

Ще използваме и конфигурацията за Xorg, любезно предоставено ни Диего Онгаро, добавяйки само нова резолюция 1920 × 1080, тъй като всички наши монитори ще го използват:

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

Сега ще инсталираме Firefox, ще го стартираме като системна услуга, така че от една страна ще напишем единичен файл за него:

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, за да стартираме firefox веднага в режим на цял екран.
Използване на параметъра -url можете да посочите всяка страница, така че да се отваря автоматично при стартиране на браузъра.

На този етап нашият киоск е готов, но сега трябва да експортираме изображението през мрежата към други монитори и устройства. За целта ще използваме възможностите Motion JPEG, формат, използван по-често за поточно предаване на видео от повечето уеб камери.

За това имаме нужда от две неща: FFmpeg с модул x11граби, за заснемане на снимки от x и streamEye, която ще я разпространява до нашите клиенти:

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

Тъй като нашата картина не изисква бърза актуализация, посочих честотата на опресняване: 1 кадър в секунда (параметър -r 1) и качество на компресия: 5 (параметър -q:v 5)

Сега нека се опитаме да отидем на http://your-vm:8080/, в отговор ще видите постоянно актуализирана екранна снимка на работния плот. Страхотен! - това, което беше необходимо.

Клиентска страна

Тук все още е по-лесно, както казах, ще използваме Raspberry Pi Model B +.

Първо, нека го инсталираме ArchLinux ARM, за това следваме Directions на официалния сайт.

Също така ще трябва да отделим повече памет за нашия видео чип, за това ще редактираме /boot/config.txt

gpu_mem=128

Нека стартираме нашата нова система и не забравяйте да инициализирате ключодържателя на pacman, инсталирайте OMXPlayer:

pacman -Sy omxplayer

Забележително е, че OMXPlayer може да работи без x, така че всичко, от което се нуждаем, е да напишем единичен файл за него и да изпълним:

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

Като параметър -b http://your-vm:8080/ ние предаваме URL адреса от нашия сървър.

Това е всичко, картина от нашия сървър трябва веднага да се появи на свързания екран. В случай на проблеми, потокът автоматично ще се рестартира и клиентите ще се свържат отново с него.

Като бонус можете да инсталирате получената картина като скрийнсейвър на всички компютри в офиса. За това ще ви трябва 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

Сега вашите колеги ще бъдат много щастливи 🙂

Източник: www.habr.com

Добавяне на нов коментар