通过网络将屏幕流式传输到多个设备

通过网络将屏幕流式传输到多个设备

我需要在办公室的多个屏幕上显示一个带有监控功能的仪表板。 有几个旧的 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 您可以指定任何页面,以便它在浏览器启动时自动打开。

在此阶段,我们的信息亭已准备就绪,但现在我们需要通过网络将图像导出到其他监视器和设备。 为此,我们将使用可能性 动态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

现在你的同事会很高兴🙂

来源: habr.com

添加评论