HLS

Linux PCのデスクトップ画面をブラウザから監視する

やりたいこと

こんな感じでブラウザから外部のPC(Linux)のモニターに表示している内容をできる限りリアルタイムで表示したい。

f:id:segmentation-fault:20200226211949p:plain

HLS(HTTP Live Streaming)

HLS(HTTP Live Streaming)を使えば、多少遅延はあるがほぼリアルタイムの映像をみることができるようです。Youtubeとかで良くあるLive配信的なやつですね。

具体的には、ffmpegを使ってLinux PCのモニターの表示内容(X11)を録画 + HLS用ファイルとして出力 + Nginx等のWebサーバを立てて、HLS用ファイルにアクセス可能にします。

ただ、HLSはAppleが開発した仕組みであり、現時点で標準サポートしているブラウザSafariだけっぽいです。

が、世の中には優秀な素晴らしい方々がおり、Video.jsを使えば他のブラウザでもLive Stremingの動画再生が可能になります(感謝)。

実施例

ここでは、Virtual-BOXにCentOS7(GUIモード) + WEBサーバ + HLSファイルの出力処理を構築 –> ホスト側のブラウザからCentOSのWEBサーバにアクセスし、CentOSのGUI画面を表示してみます。

事前準備

まずは必要なパッケージを取得します。

nginxのインストール

ffmpegのインストール

WEBサーバの設定

今回の例ではhttp://<IPアドレス>/hlsにアクセスした際に動画が見えるようにします。

必要なDirectoryを掘ります。

VideoJsを配置します。

index.htmlを作成します。

nginxのconfigを編集します。

ポート80番号を開放します。

nginxを起動します。

HLS開始

下記のコマンドでCentOSのGUI画面を録画しHLS形式のファイルで出力します。

実行結果

ChromeからHLS配信用サーバ(Virtual-BOX上のCentOS)にアクセスしてみます。
20秒〜30秒の遅延はありますが、いい感じに監視できていますね。
※動画は面倒なのでgif画像です。

f:id:segmentation-fault:20200226212522g:plain

その他の方法

遅延を避けるには、WebRTCといった技術を駆使すればできるらしいです。
ビデオチャットとかのイメージですね。

◆構成
仮想Webカメラ(v4l2loopback) + シグナリングサーバ

◆内容
監視対象のPCに仮想的なWebカメラ(v4l2loopback)導入する、そしてWebカメラにffmpegで映像を流し込み、Webカメラで撮影している内容をシグナリングサーバに送信する。
監視を行うクライアントはブラウザからシグナリングサーバにアクセスして映像を見る。

…みたいな構成を組めばできるようです。Node.JsやWebSocket等の知識が必要になります
ちょっとばかり調べてみましたが、何言ってるか良く分からなかったので断念しました…

参考
https://medium.com/@alexcambose/webcam-live-streaming-with-websockets-and-base64-64b1b4992db8
https://github.com/umlaeute/v4l2loopback

リンク

https://tools.ietf.org/html/rfc8216
https://videojs.com