WebRTCのオープンソースソフトウェアまとめ

# WebRTCとは

WebRTCはWebブラウザ間でP2P通信をするための仕様です。プラグインなしでビデオチャットが可能になることが一番注目されているところです。
詳しくは今年4月のイベントで吉川さんが発表した資料がすごくわかりやすいので、それを見てください。

- スライド: [WebRTCで変わる未来（PDF）](http://www.qcontokyo.com/data_2013/ToruYoshikawa_QConTokyo2013.pdf)
- その記事: [HTML5で情報最適化／視覚化＆WebRTCで変わる未来～QCon Tokyo 2013レポート (2/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1305/30/news024_2.html)

NAT周りの話がよくわからなかったら、ちょっと古いですが、この記事「[こてさきAjax:WebRTC事始め - livedoor Blog（ブログ）](http://blog.livedoor.jp/kotesaki/archives/1794148.html)」を読むとよいと思います。

なお、上記資料ではData ChannelはまだStableでは使えないと書かれていますが、現在は既にChrome、FirefoxのStableバージョンで実装されています。オプションも変更せずに利用できます。

# オープンソースのWebRTCライブラリがなんで必要か

## 1. ネイティブAPIは実装が面倒

WebRTCの[ネイティブAPI](http://www.webrtc.org/reference/native-apis)を使うと[apprtc.appspot.com](https://apprtc.appspot.com/)のような簡単なビデオチャットを実装するだけでも、[main.js](https://code.google.com/p/webrtc/source/browse/trunk/samples/js/apprtc/js/main.js)、[adapter.js](https://code.google.com/p/webrtc/source/browse/trunk/samples/js/base/adapter.js)のような長ったらしいコードになります。

ライブラリを使うとこんな簡単で済む。PeerJSの例
[peerjs/examples/videochat/index.html at master · peers/peerjs](https://github.com/peers/peerjs/blob/master/examples/videochat/index.html)

## 2. サーバーを用意しないといけない

上の資料を読むとわかりますが、P2Pなんだけど、以下の2種類のサーバーが必要になります。

- Signalingサーバー（ブローカーサーバーと言われたりもする）
- ICEサーバー（STUN+TRUNサーバー）

ICEサーバーがNAT越えのための情報を登録するサーバー、Signalingサーバーはその情報をクライアントPC同士で交換するためのサーバー（WebSocketで実装されることが多い）と理解しておけばだいたい合ってると思います。
多くのオープンソースWebRTCライブラリはSignalingサーバーも提供しています。

# WebRTCのOSS一覧

| 名前 | 最終コミット | ドキュメント | Signalingサーバー | ライセンス | 備考 |
|-----------|------------|------------|------------|------------|------------|
| [PeerJS](http://peerjs.com/) | 3日前 | 多い | 有 | MIT | SignalingサーバーをSaaSでも提供 |
| [EasyRTC](http://easyrtc.com/) | 4日前 | 多い | 有 | BSD2 | masterではなく[alpha](https://github.com/priologic/easyrtc/tree/alpha)と[beta](https://github.com/priologic/easyrtc/tree/beta)ブランチで開発されているので注意。 |
| [XSockets](http://xsockets.net/) | 19日前 | 多い | 有 | MIT | .NETだったのであまり見てない |
| [simpleWebRTC](http://simplewebrtc.com/) | 1ヶ月前 | 少ない | 別の[OSS](https://github.com/andyet/signalmaster)を使えと書かれている | MIT | [デモ](https://talky.io/)はよくできているが、ソースは公開されていない。 |
| [Holla](http://wearefractal.com/holla/) | 4ヶ月前 | 多い | 有 | MIT |  |
| [webRTC.io](https://github.com/webRTC/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.](https://code.google.com/p/rfc5766-turn-server/)
* [STUN Client and Server | Free software downloads at SourceForge.net](http://sourceforge.net/projects/stun/)
* [Stuntman - open source STUN server](http://www.stunprotocol.org/)
* [restund - Open Source STUN/TURN Server](http://www.creytiv.com/restund.html)
* [TurnServer - open-source TURN server implementation | Main / HomePage](http://turnserver.sourceforge.net/)
* [ReTurn Overview - reSIProcate](http://www.resiprocate.org/ReTurn_Overview)

# WebRTCのクラウドサービス

ここでは簡単に紹介するだけにしますが、WebRTCを簡単にアプリに組み込めるようにするクラウドサービスもたくさん出てきています。
代表的なのだけでも、以下のようなサービスがあります。

- [vLine](https://vline.com/)
- [OpenTok](http://tokbox.com/)
- [AddLive](http://www.addlive.com/)
- [TenHands](https://tenhands.net/developer/index.htm)
- [Phono - WebRTC](http://phono.com/webrtc)
- [Weemo](http://www.weemo.com/)

国内でもこれらを自社サービスに組み込んで提供しているところも出てきています。
[ChatWork](http://www.chatwork.com/ja/)はAddLiveを使っているし、オンライン音楽レッスンサービスの[muty](http://muty.jp/)はvLineを使っています。

これらのクラウドサービスの利点は大きく以下の2つかなと思います。

- iOS, Android向けなどSDKが豊富。
- 多人数同時ビデオチャットが可能。

実のところ2番目の問題がOSSでは解決するのが難しい壁です。
OSSで多人数同時を試すともう3人くらいでCPUが張り付いてファンがブオンブオン言います。

これは以下の問題があるからです。

> マルチ参加者コール は、実装することがより困難である。1つのオプションは、各参加者が他のすべての参加者に接続するフルメッシュネットワークであるが、高CPUと高帯域幅の使うために、このアプローチは5-6人の参加者を超える拡張ができない。代替案は、すべてのストリームを集約し、それらを他の全ての参加者に、別々にあるいは単一のストリームにマージして、ブロードキャストする中間サーバーを使うことだ。
> 出典：[議論多いWebRTC：リアルタイム通信の課題と機会](http://www.infoq.com/jp/news/2013/06/wrangling-webrtc)

そして上記のクラウドサービスたちはこの問題を解決して、多人数同時ビデオチャットを可能にしています。OpenTokは[Mantis](http://www.tokbox.com/blog/mantis-next-generation-cloud-technology-for-webrtc/)という独自のソフトウェアで解決し、vLineはMCUというハードでこれを解決しているらしいです。他は知りません。

Mantisと同等のことができるOSSで、[Licode](http://lynckia.com/licode/)というのがあるのですが、かなりのヘビーっぷりで運用するのは骨が折れそうです。

この辺りの説明はこの記事「[Beyond one-to-one: multi-party WebRTC - HTML5 Rocks](http://www.html5rocks.com/en/tutorials/webrtc/infrastructure/#beyond-one-to-one-multi-party-webrtc)」にわかりやすく書かれています。

# おわりに

OSSには上記のような課題もありますし、コスト的にクラウドサービスで問題ないなら使ってしまうのがいいと思います。
ビデオチャットが注目されていますが、WebRTCのDataChannelはテキストでもファイルでも何でも送れるのでいろいろと活用できると思います。WebRTCを活用したおもしろサービスが出てくるといいですね。

と長々とビデオチャット絡みのことを書いてきましたが、私は[co-meeting](https://www.co-meeting.com/ja/)という **テキストだけでミーティングができちゃうほどリアルタイムなチームコミュニケーションツール** を作っていますので、仕様・設計・実装の相談、トラブル時のやり取りなど開発チーム間のコミュニケーションによかったら試してみてください。
[co-meeting](https://www.co-meeting.com/users/invitation/new)