WebRTCの概要①

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

WebRTCアプリを作成するためには、サーバの構築と、クライアントアプリの開発が必要です。

WebRTCでは、サーバには2つの役割があります。
1つは、クライアント同士が接続するための仲介処理(シグナリング)で、もう一つは、映像や音声などのストリーミングデータの集約・配信です。

WebRTCのクライアント間のストリーミングデータのやり取りでは、クライアント同士で直接データをやり取りするP2P方式と、サーバで一旦集約して配信するサーバ方式の2種類があります。

P2P方式では、データ容量が大きいストリーミングデータをクライアント間で直接やり取りするため、利用ユーザが増えてもサーバの負荷が増えないメリットがあります。しかし、1対1のやり取りであれば問題ありませんが、3クライアント以上でやり取りする場合、相手先の数だけストリーミングデータを送信する必要があるため、接続クライアント数に応じてネットワーク帯域が増大するデメリットがあります。

サーバ方式では、すべてのストリーミングデータがサーバに集約されるため、セッション数の増加に応じてサーバの負荷が大きくなるデメリットがあります。しかし、サーバで集約するため、複数のクライアントからのストリーミングデータを1つのストリーミングデータにまとめて配信することが可能になります。そのため、複数のクライアントでやり取りする場合に、ネットワーク帯域を抑えることが可能になります。

どちらの方式を選ぶか、また組み合わせるかは、開発者の意向によります。一般的には、2クライアント接続の場合はP2P方式にして、3クライアント以上で接続する場合はサーバ方式にするケースが多いです。

なお、P2P方式の場合でもサーバの構築が必要です。これは、冒頭で述べたクライアント間の接続を行うための仲介処理(シグナリング)を行う必要があるためです。相手にデータを送るためには、相手先のIPアドレスを知る必要があります。シグナリング処理では、相手先のIDを指定してコールすると、相手先のIDからIPアドレスを取得して、相手に着信を知らせ、相手が受話したことを受け取り、対話を開始する一連の処理を行います。

また、通常クライアントは、ルータを経由してインターネットに接続されていますが、インターネット側からルータを通過してクライアントに接続することができません。(インターネット上の誰かがあなたのパソコンに勝手にアクセスできるとすぐにハッキングできてしまいますよね?だから通常はインターネット側からのアクセスはブロックするようになっています。)WebRTCでは、シグナリング処理の中で、ICEという方式を使って、ルータを経由してもお互いに通信ができるように処理しています。

なお、WebRTCではシグナリング処理の手順が規定されていません。そのため各自で自由に決めることができますが、異なるWebRTCアプリ同士では接続できません。(個人的には、シグナリングも規定して、世界中のWebRTCアプリが相互接続できるようになるともっと便利だと思うのですが。)

さて、ここまでサーバの役割をお話ししましたが、WebRTCのサーバ構築、とっても難しそうではないですか?

実は、オープンソースのWebRTCサーバを使えば、自分で開発することなくWebRTCサーバを構築することができます。さらに、WebRTCのクラウドサービスを利用すれば、サーバ構築の手間さえも省くことができます。

日本国内では、NTT CommunicationsさんがSkyWayという無償のサービスを運営しています。

オープンソースのWebRTCサーバもたくさん出ており、代表的なものとしては、PeerJSEasyRTCJanusLicodeKurentoなどが挙げられます。(SkyWayも、PeerJSがベースになっています。)

参考) WebRTCサーバの比較

どのサーバを使うか選ぶのは大変難しく、WebRTC自体まだまだ進化中の技術のため、各オープンソースやサービスによって提供機能も違っており、細かい部分でカスタマイズできる内容も異なります。そのため実際に試してみないとわからないというのが正直なところです。

実は、ベーコン婆男も一番初めにSkyWayを使いました。ドキュメントも日本語で整っており、簡単にWebRTCのアプリを作ることができましたが、簡単にできる一方で制約も多く、ちょっと変わったことをしようとすると対応できない問題が出てきてしまいました。

それで、色々探した結果、Kurentoを利用することにしました。

Kurentoにした理由は、

  • フリーで利用できる(Apatch 2.0ライセンス)
  • サーバで録画可能
  • 複数クライアント接続(ルーム接続)に対応
  • 英語にはなるがドキュメントがそろっている
  • elasticRTCNUBOMEDIAといったKurentoをベースとしたクラウドサービスもあり、実績がある
  • サーバ側でOpenCVを使って画像処理ができる(例えば、顔認識など)
    (GStreamerのモジュールも開発可能)
  • IPカメラ(RTSP/RTP)とも接続可能

といったことです。WebRTCサーバとして、しっかりと基本的なことができて、さらにOpenCVなど使って色々なことができそうというのが採用の理由です。

実は、Kurentoは、2016年9月にTwillioに買収されました。買収後もKurentoの開発は継続するとのことですが、ちょっと心配ではあります。開発が継続することを期待してます。

次回は、クライアントサイドの開発について書く予定です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です