JavaScript
WebRTC
janus-gateway

WebRTCゲートウェイ「Janus」を使ってみた

何をしたのか

  • WebRTCゲートウェイ「Janus」をインストールし、サンプルを動かしてみました。

Janusとは

Janus: the general purpose WebRTC Gateway

  • 汎用WebRTCゲートウェイ
  • ビデオ通話などの機能はプラグインとして提供されている
  • SFU/MCUなどもプラグインとして提供されている。

早速インストール

実行環境

  • さくらのVPS
    • CPU2コア
    • メモリ1GB
  • OS Ubuntu 16.04 LTS

依存パッケージをインストール

$ sudo apt-get install libmicrohttpd-dev libjansson-dev libnice-dev \
libssl-dev libsrtp-dev libsofia-sip-ua-dev libglib2.0-dev libopus-dev \
libogg-dev libcurl4-openssl-dev pkg-config gengetopt libtool automake

後述するドキュメントの生成を行うのであれば以下のパッケージもインストール

$ sudo apt-get install doxygen graphviz

WebSocketを使う

$ git clone https://github.com/warmcat/libwebsockets.git
$ cd libwebsockets
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
$ make && sudo make install

janusのダウンロード、インストール

$ git clone https://github.com/meetecho/janus-gateway.git
$ cd janus-gateway
$ sh autogen.sh

コンパイル時のオプションを見てみる

$ ./configure --help
オプション 意味
--enable-docs ドキュメントを生成
--enable-post-processing 録画時に生成されるファイルをwebmなどに変換するツールの有効化
--prefix インストールするディレクトリを設定

コンパイル

$ sudo ./configure --enable-post-processing --enable-docs --prefix=/usr/local

エラー発生

configure: error: Package requirements (
                                 libsrtp >= 1.5.0
                                 ) were not met:

No package 'libsrtp' found

libsrtp2.0.0をインストール

$ wget https://github.com/cisco/libsrtp/archive/v2.0.0.tar.gz
$ tar xfv v2.0.0.tar.gz
$ cd libsrtp-2.0.0
$ ./configure --prefix=/usr --enable-openssl
$ make shared_library && sudo make install

気を取り直して再挑戦

$ sudo ./configure --enable-post-processing --enable-docs --prefix=/usr/local

またエラーが発生

No package 'libavutil' found
No package 'libavcodec' found
No package 'libavformat' found

sudo apt-get install libavutil-dev libavformat-dev で不足しているパッケージをインストール

再々挑戦

$ sudo ./configure --enable-post-processing --enable-docs --prefix=/usr/local
$ sudo make
$ sudo make install
$ sudo make configs

これでインストールできました。

動かしてみた

  • Video Roomを動かしてみた。
  • 設定ファイルの最後の行を以下のように変更した。
/usr/local/etc/janus/janus.plugin.videoroom.cfg
record = true
rec_dir = /home/hoge/
  • これで録画が有効になる

jsファイルの修正

/janus-gateway/html/videoroom.js
if(window.location.protocol === 'http:')
        server = "http://" + window.location.hostname + ":8088/janus";
else
        server = "https://" + window.location.hostname + ":8089/janus";
/janus-gateway/html/videoroom.js
var server = [
    "ws://" + window.location.hostname + ":8188",
    "/janus"
];

janus起動

$ /usr/local/bin/janus
  • デーモンとして起動する場合
$ /usr/local/bin/janus -b --log-file=/var/log/janus.log --pid-file=/var/run/janus.pid

結果

  • 1:1で通信
  • 通信量は1人当たり約500kbps
  • サーバー側のCPU負荷は2%/人くらい

録画したファイルをwebmに変換

$ /usr/local/bin/janus-pp-rec /home/hoge/videoroom-1234-user-video.mjr /home/hoge/sample.webm
  • ファイルサイズは録画時間3分に対して、約4.6MBでした。

生成されたドキュメント

  • ドキュメントは、 janus-gateway/docs/html/ にhtmlファイルが生成されます。

まとめ

  • SFUはもう少し重いと思っていましたが、結構負荷は軽い印象でした。
  • 片方向の配信であれば、100人程度は余裕でできそうな感じです。
  • janusはかなり活発に開発が行われているうえ、slackの音声通話などでも利用されているらしいです。
  • 意外と簡単に動かせたので、WebRTCで多対多の通信をしたいときに使ってみるとよいかと思います。(P2Pだと4~5人くらいで厳しくなってくる)