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

# 何をしたのか

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

# Janusとは

>Janus: the general purpose WebRTC Gateway

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

# 早速インストール

#### 実行環境

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

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

```bash
$ 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
```

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

```bash
$ sudo apt-get install doxygen graphviz
```

#### WebSocketを使う

```bash
$ 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のダウンロード、インストール

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

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

```bash
$ ./configure --help
```

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

#### コンパイル

```bash
$ 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をインストール

```bash
$ 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
```

#### 気を取り直して再挑戦

```bash
$ 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` で不足しているパッケージをインストール

#### 再々挑戦

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

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

# 動かしてみた

* Video Roomを動かしてみた。
* 設定ファイルの最後の行を以下のように変更した。

```text:/usr/local/etc/janus/janus.plugin.videoroom.cfg
record = true
rec_dir = /home/hoge/
```

* これで録画が有効になる

#### jsファイルの修正

```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";
```

```js:/janus-gateway/html/videoroom.js
var server = [
    "ws://" + window.location.hostname + ":8188",
    "/janus"
];
```

#### janus起動

```bash
$ /usr/local/bin/janus
```

* デーモンとして起動する場合

```bash
$ /usr/local/bin/janus -b --log-file=/var/log/janus.log --pid-file=/var/run/janus.pid
```

# 結果

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

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

```bash
$ /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人くらいで厳しくなってくる)