WebRTCとは
WebRTCはWebブラウザ間でP2P通信をするための仕様です。プラグインなしでビデオチャットが可能になることが一番注目されているところです。
詳しくは今年4月のイベントで吉川さんが発表した資料がすごくわかりやすいので、それを見てください。
NAT周りの話がよくわからなかったら、ちょっと古いですが、この記事「こてさきAjax:WebRTC事始め - livedoor Blog(ブログ)」を読むとよいと思います。
なお、上記資料ではData ChannelはまだStableでは使えないと書かれていますが、現在は既にChrome、FirefoxのStableバージョンで実装されています。オプションも変更せずに利用できます。
オープンソースのWebRTCライブラリがなんで必要か
1. ネイティブAPIは実装が面倒
WebRTCのネイティブAPIを使うとapprtc.appspot.comのような簡単なビデオチャットを実装するだけでも、main.js、adapter.jsのような長ったらしいコードになります。
ライブラリを使うとこんな簡単で済む。PeerJSの例
peerjs/examples/videochat/index.html at master · peers/peerjs
2. サーバーを用意しないといけない
上の資料を読むとわかりますが、P2Pなんだけど、以下の2種類のサーバーが必要になります。
- Signalingサーバー(ブローカーサーバーと言われたりもする)
- ICEサーバー(STUN+TRUNサーバー)
ICEサーバーがNAT越えのための情報を登録するサーバー、Signalingサーバーはその情報をクライアントPC同士で交換するためのサーバー(WebSocketで実装されることが多い)と理解しておけばだいたい合ってると思います。
多くのオープンソースWebRTCライブラリはSignalingサーバーも提供しています。
WebRTCのOSS一覧
名前 | 最終コミット | ドキュメント | Signalingサーバー | ライセンス | 備考 |
---|---|---|---|---|---|
PeerJS | 3日前 | 多い | 有 | MIT | SignalingサーバーをSaaSでも提供 |
EasyRTC | 4日前 | 多い | 有 | BSD2 | masterではなくalphaとbetaブランチで開発されているので注意。 |
XSockets | 19日前 | 多い | 有 | MIT | .NETだったのであまり見てない |
simpleWebRTC | 1ヶ月前 | 少ない | 別のOSSを使えと書かれている | MIT | デモはよくできているが、ソースは公開されていない。 |
Holla | 4ヶ月前 | 多い | 有 | MIT | |
webRTC.io | 7ヶ月前 | 少ない | 有 | MIT | クライアントサイドはライセンスの記載なし |
WebRTCは変化が速いのできちんとキャッチアップしているPeerJSとEasyRTCがよさそうです。
ただし、EasyRTCはなぜかサンプルのビデオチャットが真っ黒になってうまく動きませんでした。原因は調べていません。
ICEサーバー
上記のOSSにはICEサーバーは含まれておらず、だいたいstun.l.google.com:19302
というGoogleのSTUNサーバーをデフォルトで指定しています。
本番で動かすにはICEサーバーも自前で立てるのが望ましいです。
ICEサーバーは元々いろいろなOSSがあります。
表にまとめるのは力尽きたので、リストで。一番上のがいいんじゃないかなってなんとなく思っています。
- rfc5766-turn-server - High-performance free open source TURN and STUN Server implementation.
- STUN Client and Server | Free software downloads at SourceForge.net
- Stuntman - open source STUN server
- restund - Open Source STUN/TURN Server
- TurnServer - open-source TURN server implementation | Main / HomePage
- ReTurn Overview - reSIProcate
WebRTCのクラウドサービス
ここでは簡単に紹介するだけにしますが、WebRTCを簡単にアプリに組み込めるようにするクラウドサービスもたくさん出てきています。
代表的なのだけでも、以下のようなサービスがあります。
国内でもこれらを自社サービスに組み込んで提供しているところも出てきています。
ChatWorkはAddLiveを使っているし、オンライン音楽レッスンサービスのmutyはvLineを使っています。
これらのクラウドサービスの利点は大きく以下の2つかなと思います。
- iOS, Android向けなどSDKが豊富。
- 多人数同時ビデオチャットが可能。
実のところ2番目の問題がOSSでは解決するのが難しい壁です。
OSSで多人数同時を試すともう3人くらいでCPUが張り付いてファンがブオンブオン言います。
これは以下の問題があるからです。
マルチ参加者コール は、実装することがより困難である。1つのオプションは、各参加者が他のすべての参加者に接続するフルメッシュネットワークであるが、高CPUと高帯域幅の使うために、このアプローチは5-6人の参加者を超える拡張ができない。代替案は、すべてのストリームを集約し、それらを他の全ての参加者に、別々にあるいは単一のストリームにマージして、ブロードキャストする中間サーバーを使うことだ。
出典:議論多いWebRTC:リアルタイム通信の課題と機会
そして上記のクラウドサービスたちはこの問題を解決して、多人数同時ビデオチャットを可能にしています。OpenTokはMantisという独自のソフトウェアで解決し、vLineはMCUというハードでこれを解決しているらしいです。他は知りません。
Mantisと同等のことができるOSSで、Licodeというのがあるのですが、かなりのヘビーっぷりで運用するのは骨が折れそうです。
この辺りの説明はこの記事「Beyond one-to-one: multi-party WebRTC - HTML5 Rocks」にわかりやすく書かれています。
おわりに
OSSには上記のような課題もありますし、コスト的にクラウドサービスで問題ないなら使ってしまうのがいいと思います。
ビデオチャットが注目されていますが、WebRTCのDataChannelはテキストでもファイルでも何でも送れるのでいろいろと活用できると思います。WebRTCを活用したおもしろサービスが出てくるといいですね。
と長々とビデオチャット絡みのことを書いてきましたが、私はco-meetingという テキストだけでミーティングができちゃうほどリアルタイムなチームコミュニケーションツール を作っていますので、仕様・設計・実装の相談、トラブル時のやり取りなど開発チーム間のコミュニケーションによかったら試してみてください。
co-meeting