通過網絡將屏幕流式傳輸到多個設備

通過網絡將屏幕流式傳輸到多個設備

我需要在辦公室的多個屏幕上顯示一個帶有監控功能的儀表板。 有幾個舊的 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 的配置,請 的確 我們 Diego Ongaro,只添加了一個新的決議 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 和 流眼,它將分發給我們的客戶:

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,為此我們遵循 路線 在官方網站上。

我們還需要為視頻芯片分配更多內存,為此我們將在 /boot/config.txt

gpu_mem=128

讓我們啟動我們的新系統,不要忘記初始化 pacman 密鑰環,安裝 OMX播放器:

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 и 屏幕保護程序:

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

添加評論