Kurento (6.16.0)をインストールしてサンプルを動かす

Update: (2021.3.10) Kurento 6.16.0に対応

Ubuntu 18.04 LTS ServerをPCにセットアップして、Kurentoの2021年2月時点の最新版(v6.16.0)をインストールします。また、Mac上にKurento Clientのサンプルアプリケーションをインストールして動かしてみます。

## Kurentoについて

KurentoはオープンソースのWebRTCメディアサーバーです。ビデオ通話やテレビ会議などのメディアストリーミング機能を持つWebアプリケーションを構築する仕組みを提供しています。Kurento以外にも、このようなWebRTCメディアサーバーには色々とありますがKurentoの特徴の一つは、MCUによるビデオ会議アプケーションの構築ができることにあると思います。

### Kurentoの構成

Kurentoのシステムは、メディアストリームの処理を行うKurento Media Server(KMS)と、Kurento Media Serverの各種制御を行うKurento Clientから構成されます。

Kurento Media Serverは、メディアエレメントと呼ばれるオブジェクトをブロックのように数珠つなぎに接続して構成したメディアパイプラインを内部に作成します。個々のメディアエレメントは、WebRTCエンドポイント、オーディオ／ビデオミキサー、メディアレコーダーのような個別の機能を提供するモジュールです。Kurentoのメディアエレメントは、Gstreamerのエレメントがベースになっていて、独自のエレメントを作成して追加することも可能です。Kurento Media Serverは、エレメントやパイプラインの構築／制御などを行うAPIを提供していて、Kurento ClientからKurento Protocolと呼ばれるJSONメッセージにより制御することができます。

Kurento Media Server自体はC++/C言語で記述されますが、Kurento Clientは、JAVA、ブラウザ上のJavaScript、または、node.jsで記述されたサンプルが提供されています。

![Kurento_Architecure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189951/e4d23857-7f68-fe77-80fc-3dea26f87be4.png)


### Kurentoを動作させる環境

Kurento Media Serverは、Ubuntu上で動作します。Kurento 6.16.0は、Ubuntu16.04LTSと18.04LTSでの動作が保証されています。ホストPCにDockerやVirtual Boxを使ってUbuntuの仮想環境を作成し、その上でKurentoを動作させることも可能ですが、KurentoをMCUで動作させる場合はCPUで映像/音声ストリームのトランスコーディングや合成処理を行うことになるので、そこそこのマシンパワーを割り当てる必要があるでしょう。

今回は、物理PC上にUbuntuとKurento Media Serverを動作させ、Kurento ClientはMac上で動作させる方法を試します。
![Demo_Config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189951/0d13e1f4-6658-0e18-ac6a-064ff6b5b8bb.png)



## Kurento Media Serverのセットアップ

### Ubuntuのインストール

USBメモリにUbuntu 18.04 Server LTSをセットアップして動かす方法について説明します。詳細な手順は省いてポイントだけメモします。

1. USBメモリを準備
   - インストールメディア用USBメモリ (Server版Ubunutuなら1GBもあればよい。今回は4GBを使用 ) 
   - UbuntuをインストールするUSB (8GBもあればよさそう。今回は32GBを使用)

2. Ubuntuのダウンロード
   - [KDDI研究所](http://www.ftp.ne.jp/Linux/packages/ubuntu/releases-cd/)からダウンロードUbuntu 18.04.05 Serverの[ISOイメージ](http://www.ftp.ne.jp/Linux/packages/ubuntu/releases-cd/18.04.5/ubuntu-18.04.5-live-server-amd64.iso)をダウンロードします。（約10分）

3. ダウンロードしたISOイメージを書き込んだインストールメディア用USBを作成
   - Macで作成したので、書き込みにはbalenaEtcherを使いました。（約３分）
4. インストールメディア用USBからPCを起動
   - 念の為、SSDやHDDに誤って書き込んでしまわないように、PCのBIOS設定で内蔵のSSD/HDDをDisableしてから作業しました。
   - SSHをEnableにしてGithubからpublic keyをインストールすると、起動後にSSHでリモートからログインが可能になります。ここでSSHを設定しない場合は、起動後に適宜SSHをインストールします
5. インストールする
   - インストール終了後、インストールメディア用USBを抜いてPCを再起動（約５分）

6. Ubuntuの初期設定

   - SSHでリモートからログインできるようにする(インストール時に設定されていれば不要です)

   - プロンプトを整える

   - など

     

### Kurento-media-serverのインストール

ここからは、Ubuntu Serverにログインしての作業になります。

[Kurento Doc](https://doc-kurento.readthedocs.io/en/latest/index.html) > [Installation Guide](https://doc-kurento.readthedocs.io/en/latest/user/installation.html) > [Local Installation](https://doc-kurento.readthedocs.io/en/latest/user/installation.html#local-installation)に手順の記載されていますので、ここの手順通りにインストールを行っていきます。

インストールされてなければGnuPGをインストールします。

```bash
sudo apt-get update && sudo apt-get install --no-install-recommends --yes \
    gnupg
```

Kurentoのリポジトリをシステムに追加します。今回は6.16.0をインストールするのでリポジトリとして、`http://ubuntu.openvidu.io/6.16.0`を追加しています。

```bash
# Import the Kurento repository signing key
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83

# Get Ubuntu version definitions
source /etc/upstream-release/lsb-release 2>/dev/null || source /etc/lsb-release

# Add the repository to Apt
sudo tee "/etc/apt/sources.list.d/kurento.list" >/dev/null <<EOF
# Kurento Media Server - Release packages
deb [arch=amd64] http://ubuntu.openvidu.io/6.16.0 $DISTRIB_CODENAME kms6
EOF

```

kurento-media-serverをインストールします。

```bash
sudo apt-get update && sudo apt-get install --no-install-recommends --yes \
    kurento-media-server
```

以上で、kurento-media-serverのインストールは終了です。このインストール方法はシステムへの初回のインストール時にのみ有効です。Kurentoバージョンアップを行う場合は、一旦今インストールされているkurento-media-serverを削除してから新たにインストールする必要があります。



### kurento-media-serverの起動と停止

kurento-media-serverをインストールすると、システムサービスに登録されて自動起動されるようになっています。

```bash
ps -fC kurento-media-server
UID        PID  PPID  C STIME TTY          TIME CMD
kurento   6415     1  0 Feb02 ?        00:00:00 /usr/bin/kurento-media-server
```

プロセスを停止するときは、

```bash
sudo service kurento-media-server stop
```

プロセスを再開するときは、

```bash
sudo service kurento-media-server start
```

リブート後の自動起動を停止する場合は、

```bash
sudo systemctl disable kurento-media-server
```

自動起動を再設定する場合は、

```bash
sudo systemctl enable kurento-media-server
```

kurento-media-serverそのものをカスタマイズしたい場合は、自動起動とプロセスを停止して、手動で起動するようにしましょう。



### kurento-media-serverのバージョン表示

kurento-media-serverを`-v`オプション付きで起動すると、バージョンを表示することができます。

```bash
$ kurento-media-server -v
Kurento Media Server version: 6.16.0
Found modules:
	'core' version 6.16.0
	'elements' version 6.16.0
	'filters' version 6.16.0
```

起動するときに読み込むmoduleのバージョンも表示されます。デフォルトでは'core'、'element'、'filters'というモジュールを読み込んで起動することがわかります。



## MacにKurento Clientをセットアップする

Kurento Clientとして、Kurento Tutorialのアプリケーションを動作させます。公式の[ページ](https://doc-kurento.readthedocs.io/en/latest/user/tutorials.html#) では、Ubuntuを前提にKurentoのTutorialを動作させていますが、Macでもほぼ同様の操作で動くようです。 

KurentoのTutorialには、JAVA版、Browser JavaScript版、Node.js版の３種類がありますが、ここではサポートするサンプルアプリケーションの種類が多いJAVA版を動作させてみます。

### JAVA版Tutorialのインストール

はじめに、Java JDKとMavenをインストールしておきます。入ってなければ、gitもインストールが必要です。

```sh
brew update
brew upgrade 
brew install openjdk maven
```

次にJava版のTutorialのソースコードをダウンロードします。

```sh
git clone https://github.com/Kurento/kurento-tutorial-java.git
cd kurento-tutorial-java
git checkout master
```

`kurento-tutorial-java`フォルダには、"Hello World"をなど数種類のサンプルコードがそれぞれのフォルダに収められています。

### サンプルのHello Worldを動かしてみる

Hello Worldサンプルは、Kurentoを使ってブラウザからメディアトラフィックのループバックを試すサンプルアプリケーションです。

```sh
cd kurento-hello-world
mvn -U clean spring-boot:run \
    -Dspring-boot.run.jvmArguments="-Dkms.url=ws://<Host Address>:8888/kurento"
```

`<Host Address>`のところに、kurento-media-serverが動作するホストのIPアドレスまたはホスト名を記述します。初回だけ各種ライブラリをダウンロードするのでしばらく時間がかかります。

アプリケーションがエラーで終了してしまう場合は、kurento-media-serverとの通信がうまく行っていない可能性があります。ホストアドレスが正しいか、ホストとの通信ができるか、ホスト上でkurento-media-serverが動作しているかを確認してください。

次にブラウザ(chromeを推奨)をひらいて、`https://localhost:8443`にアクセスします。途中、ブラウザからセキュリティ警告がでますが、無視してアクセスしてください。

真ん中にある緑のStartボタンを押すと、ループバック処理が開始されます。


![スクリーンショット 2021-02-04 16.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189951/38eb37be-7d10-70d0-39d2-a8e46718b3fc.png)


### 次のサンプルであるmagic mirrorを動かそうとしてみる

Kurentoの公式Tutorialでは、次のサンプル・アプリケーションして"WebRTC ｍagic mirror"というサンプルアプリが紹介されています。結論からすると、このサンプルアプリはUbuntu 18.04LTSにkurentoをインストールしたときは、うまく実行できません。動作させるには、KurentoをUbuntu 16.04LTS上で動作させる必要があります。

やってみようとすると、こうなります。動かし方はHello worldのときと同じで、サンプルアプリのフォルダに移動して、mvnコマンドで起動します。

```sh
cd ..
cd kurento-magic-mirror
mvn -U clean spring-boot:run \
    -Dspring-boot.run.jvmArguments="-Dkms.url=ws://<Host Address>:8888/kurento"
```

ここまでは、問題なく動作するのですが、ブラウザから`https://localhost:8443`にアクセスしてStartボタンを押しても映像が帰ってきません。こういうときは、kurento-media-serverのログを見て、何が起こっているかを確認してみましょう。

#### Kurentoのデバッグログを見る方法

kurento-media-serverはデフォルトでは、/var/log/kurento-media-server/ フォルダにログを出力します。一連の操作が完了してからここに記録されたログを参照してもよいのですが、kurento-media-serverをコンソールから起動すると、リアルタイムにログ情報が標準出力に出力されます。ログのレベルは環境変数`GST_DEBUG`に記述して変更することができます。

一旦、service で起動しているkurento-media-serverを停止させて、環境変数の設定後にGST_DEBUGで設定できます。kurento-media-serverのホストにログインして以下を実行します。

```bash
# Ubuntuにログインして実行
sudo service kurento-media-server stop
export GST_DEBUG="1,Kurento*:5"
kurento-media-server
```

このようにデバッグレベルを指定してから起動するとKurento Protocol上での通信も含めてコンソールにログ情報が表示されます。もう一度、Macからmvnコマンドでサンプルアプリを起動して。ブラウザで`https://localhost:8443`を開いてStartボタンを押します。ログを読むと以下のログが見つけられるでしょう。

```
OpenCV Error: Unspecified error (The node does not represent a user object (unknown type?)) in cvRead, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/core/src/persistence.cpp, line 6628
```

原因は、Kurentoが古いUbuntuにのみ実装されたOpenCVの機能を使おうとしていてエラーになっているからのようです。（詳細は、こちらの[議論](https://groups.google.com/g/kurento/c/1VOK0c2O4b4/discussion)を参照。）これを正常に動作させるためには、今のところ、古いUbuntuにKurentoをインストールし直すしかないようです。

正常に動くと[このように](https://doc-kurento.readthedocs.io/en/latest/tutorials/java/tutorial-magicmirror.html#understanding-this-example)、人の顔を認識して頭の上に帽子の映像を重ね合わせてからループバックしてくれます。

### ビデオ通話のサンプルを動かす

最後に1対1のビデオ通話のサンプルを動かしてみましょう。サンプルアプリは、`kurento-one2one-call`フォルダの中にあります。起動の方法は同じです。

```sh
cd ..
cd kurento-one2one-call
mvn -U clean spring-boot:run \
    -Dspring-boot.run.jvmArguments="-Dkms.url=ws://<Host Address>:8888/kurento"
```

ブラウザを２つ起動して、それぞれ、`https://localhost:8443`にアクセスします。

それぞれのブラウザで名前を登録してから、通話したい相手の名前を入れて'Call'するとビデオ通話ができます。

また、同じLAN上の別のPCでブラウザを開いてKurento Clientが動作するホストIPアドレスを指定して、`https://<ip address>:8443` にアクセスしてCallすると、離れたPCとのビデオ通話が可能です。

## まとめ

UbuntuをセットアップしたPCにKurento Meida Serverをインストールしました。また、MacにKurentoクライアントのサンプルコードをインストールして動作させることができました。次回はKurentoの特徴であるMCUを使ったビデオ会議のサンプルを作成してみます。