ネットワーク経由で画面を複数のデバイスにストリーミングします







オフィスの複数の画面に監視付きのダッシュボードを表示する必要がありました。 いくつかの古いRaspberry Pi Model B +と、ほぼ無制限のリソースを持つハイパーバイザーがあります。







どうやら、Raspberry Pi Model B +には、ブラウザーを常に実行し続け、その中に大量のグラフィックを描画するのに十分なランダム性がないため、ページが部分的にバグがあり、多くの場合クラッシュします。







かなりシンプルでエレガントなソリューションがありました。それを皆さんと共有したいと思います。







ご存知のように、すべてのRaspberryにはかなり強力なビデオプロセッサが搭載されており、ハードウェアビデオデコードに最適です。 そこで、ダッシュボードを別の場所に配置したブラウザーを起動し、レンダリングされた画像を含む完成したストリームをラズベリーに転送するというアイデアが生まれました。







このすべてに加えて、管理を簡素化することになっています。この場合、すべての構成が1つの仮想マシンで実行されるため、更新とバックアップが容易になります。







すぐに言ってやった。







サーバー側



Ubuntu用の既製のCloud Imageを使用します。 インストールすることなく、仮想マシンを迅速に展開するために必要なすべてが含まれます。Cloud-Initサポートにより、ネットワークを即座に構成し、sshキーを追加して、すぐに運用できるようになります。







新しい仮想マシンをデプロイし、まずXorgnodmおよびfluxboxをインストールします:







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





また、Diego Ongaro から親切に提供されたXorg構成も使用します。すべてのモニターが使用するため、新しい解像度1920x1080のみを追加します。







 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



パラメーターを使用すると、ブラウザーの起動時に自動的に開くように、任意のページを指定できます。







この段階で、キオスクの準備ができましたが、ネットワーク経由で他のモニターやデバイスに画像をエクスポートする必要があります。 これを行うために、ほとんどのWebカメラからのビデオのストリーミングに最もよく使用される形式であるMotion JPEGの機能を使用します。







これを行うには、 X11から画像をキャプチャするためのx11grabモジュールを備えたFFmpegと、クライアントに配信するstreamEyeの 2つが必要です。







 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 -r 1 -i :0 -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 +を使用します。







まず、 Arch Linux ARMをインストールします。そのためには、公式Webサイトの指示に従います。







また、ビデオチップにより多くのメモリを割り当てる必要があります。このため、/ /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を渡します。







それだけです。サーバーの画像が接続された画面にすぐに表示されるはずです。 問題が発生した場合、ストリームは自動的に再起動され、クライアントはそれに再接続します。







ボーナスとして、結果の画像をオフィス内のすべてのコンピューターのスクリーンセーバーとして設定できます。 これを行うには、 MPVXScreenSaverが必要です。







 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\
      
      





今、あなたの同僚はとても幸せになります:)








All Articles