WebRTCでマルチパーティ接続(多人数接続)

こんにちは、ベーコン婆男です。

WebRTCを使って、ビデオ通話アプリを作る場合に、1対1での接続か、複数人での接続かによって検討のポイントが大きく変わってきます。1対1であれば、端末同士で直接ストリーミングデータのやり取りをしても問題ありませんが、多対多の場合、端末同士で直接やり取りしようとすると必要なネットワークの帯域が大きくなってしまいます。そのため、それぞれの構成のメリット、デメリットを理解したうえで、構成を検討する必要があります。今回は、Kurentoを利用して、複数端末で接続するケース(マルチパーティ接続)について紹介します。

マルチパーティ接続の形態

複数端末で接続する場合、フルメッシュ型、SFU型、MCU型の3つのパターンがあります。

メッシュ型(P2P型)は、各端末は、他の全ての端末にストリームデータを送信します。そのため、端末数が増えると、送信量が比例して大きくなってしまいます。

SFU型は、サーバを介してストリームデータを送信します。このとき、サーバは受信したストリームデータを接続されている他の全ての端末に送信します。そのため、各端末の送信量は端末数が増えても変わらないというメリットがある一方、受信量は、端末数に比例して大きくなります。ADSLなどの回線では、上り帯域が狭く、下り帯域は広いので、メッシュ型と比較して、SFU型の方が大幅に通信が安定します。

MCU型は、SFU型と同様にサーバを介してストリームデータを送信しますが、SFU型と違って、サーバでストリームデータを合成します。例えば、3拠点の映像を、サイズを縮小して、1枚の映像に合成します。また音声もミキシングして、他の2拠点の音声を1拠点分のデータ量に削減します。これにより、接続端末数が増えても、各端末の送受信量は変わらないというメリットが得られます。一方で、映像や音声の合成には、相当なCPU負荷がかかるため、端末の増加に伴い、サーバコストが大幅に大きくなるデメリットがあります。またサーバの処理能力が不足すると音声の乱れや遅延につながります。

 メッシュ型SFU型MCU型
概要端末間で直接ストリーミングデータを送受信する(P2P)。サーバを介してストリーミングデータを送受信。サーバは受信したデータを他の端末に転送する。サーバを介してストリーミングデータを送受信。サーバは各端末から受信したデータをミキシングして配信。
メリットサーバが不要
処理が単純
端末からの送信量は、端末数に関わらず一定。
MCU型と比較してサーバ負荷が圧倒的に低い。
接続端末数に関わらず、各端末のデータ送受信量が一定。(大規模な接続や、無線等、帯域が狭い回線の場合に特に有効。)
接続端末数が増えても端末の処理負荷が大きくならない。
デメリット端末数の増加に比例してストリーミングデータの送受信量が大きくなる。(特にADSL、無線等、帯域が狭い場合は通信が不安定)端末のデータ受信量は、端末数が増えると比例して増加。(特に無線等で下り帯域が狭い場合は通信が不安定)サーバの処理負荷が大きい。

Kurentoがサポートするマルチパーティ接続

Kurentoでは、サーバを立てるのが前提となりますので、メッシュ型は必然的に除外され、サポートしている接続形態は、SFU型とMCU型になります。

なお、Kurentoでは、マルチパーティ接続を簡単に実現できるように、Kurento Roomという専用のAPIが提供されています。このAPIを利用することで、複数人接続のシグナリングや、セッションの管理を簡単に実現できるようになっています。ただし、Kurento Roomでは、SFU型のみサポートしているため、MCU型を利用する場合は、ミキシングを行うためにComposite Media Elementを使って、映像と音声の合成を行う必要があります。

また、現在、Kurentoでは、マルチパーティ接続をより簡単にサポートするための、OpenViduというプロジェクトが進行しています。現在OpenViduもSFUのみをサポートしているようですが、将来的には、設定でMCUに切り替えられるように検討されているようです。

Kurento Roomの構成

今回は、Kurento Roomのデモアプリを使って多人数接続について紹介します。

Kurento Room Demoの構成は以下になります。

今まで紹介してきた、Kurento Media Serverの前段にKurento Room SDKが存在しています。このKurento Room SDKで、マルチパーティ接続を管理しています。またKurento Room SDKはJavaのAPIになり、クライアントとやり取りするためKurento Room Serverが仲介しています。Kurento Room Serverは、JSON-RPC形式で、WebSocketsでやり取りするようになっています。

また、クライアント端末の方には、Kurento Room JavaScript ClientというJavaScriptのライブラリが提供されており、ブラウザやスマホでアプリを開発する場合は、このライブラリを利用して、マルチパーティ接続のWebRTCアプリが開発できるようになっています。

デモアプリでは、HTML、JQuery、AngularJSを使って、Single Server Pageのフレームワークで開発されています。そのため、デモアプリはブラウザでの動作になりますが、本デモアプリを参考に、AndroidやiOSで動作するWebRTCのハイブリッドアプリを開発することができます。

Kurento Roomのデモアプリのビルド

Kurento Roomのデモアプリのビルド方法について記載します。

チュートリアル1の繰り返しになりますが、以前投稿した「WebRTC Kurentoサーバの構築」の記事に従って、Kurento Media Serverのインストールとサービス起動をお願いします。

サービスが起動していないと、ビルド後にエラーが発生して動作しないため、必ずサービスを起動しておいてください。

まず、Kurento Roomのデモアプリのソースをダウンロードします。ダウンロードしたら最新のソースにチェックアウトします。

$ mkdir kurento-tutorial
$ cd kurento-tutorial
$ git clone https://github.com/Kurento/kurento-room.git
$ cd kurento-room 
$ git checkout $(git describe --abbrev=0 --tags)

次に、mnvでビルドします。本構成では、ビルドしたバイナリファイルがkurento-room-demoフォルダにZipアーカイブで作成されるようになっていますので解凍します。

$ mvn clean package -am -pl kurento-room-demo -DskipTests
$ cd kurento-room-demo/target
$ unzip kurento-room-demo-6.6.0.zip
$ cd kurento-room-demo-6.6.0

kurento-room-demoフォルダのfilesフォルダに設定変更用のコンフィグレーションファイルが保存されています。

SSL化を行う場合の、keystore.jksもこのフォルダに保存されています。SSL化を行う場合は、以前紹介したKurentoのSSL化の手順に従って作成したkeystore.jksファイルを、既存ファイルに上書きしてください。

Kurento Roomのデモアプリの起動

kurento-room-demo-6.6.0フォルダのbinフォルダのスクリプトを実行すると、サービスとして起動します。

$ cd kurento-room-demo-6.6.0
$ sudo ./bin/install.sh

なお、サービスの停止は、

$ sudo service kurento-room-demo stop

になります。

Kurento Room デモアプリの起動

パソコンでブラウザを立ち上げて、Kurentoが起動しているサーバ(ポート8443)をhttpsで開いてください。

https://(サーバアドレス):8443/

サーバに証明書が実装されていない場合は警告が表示されますが、無視して開いてください。

本デモアプリでは、ユーザ認証は行っておらず、指定したRoomに対して複数人が接続します。Usernameは、Roomに入った時に個人を特定するためのニックネームになります。Roomは任意の名称を指定することができ、同じRoomを指定したユーザが接続されます。なお、指定したRoomが存在していない場合は新規に作成されます。

本アプリではユーザ認証を行わないため、同じRoom名を指定してしまうと、知らない人が対話に入ってしまう問題がありますが、ユーザ登録や予約をしなくても、すぐに複数人での打合せができるメリットがあります。

UsernameとRoomに適当な名称を入力して、「JOIN ROOM」ボタンをクリックしてみてください。新規にRoomが作成され、自分のカメラ映像が表示されます。ここで他の人が同じRoom名で参加すると、複数の参加者のカメラ映像が表示されます。

 

なお、Kurentoの利用イメージを持ってもらうため、本デモアプリのサンプルサイトを以下に立ち上げました。

https://kurento-room.baconbabao.tk:8443/

本サンプルサイトは、NTT ComunicationsのCloudNを利用しています。なお、CloudNの最も低スペックのサーバ( 1 cpu, 0.5GBメモリ)を利用しているため、複数の同時アクセスが発生するとサーバの処理能力が不足すると思われます。また期間限定での公開となりますので、当方の都合で公開を取りやめる可能性がありますので、ご了承ください。

本プログでは、今後、Kurento Roomのデモアプリをベースに、ブラウザだけでなく、iOSやAndroidからもアクセス可能な、マルチパーティのWebRTCアプリを開発してみたいと思います。