WebRTCに関する疑問
最近、Chromeのdev版およびCanary版にWebRTC関連のAPIが実装され話題になっています。(実は、去年すでにWebRTCを実装しているブラウザーが存在しているみたい。)
私も、興味を持ってWebRTCのことを調べ始めているところです。
恥ずかしながらWebRTCを調べて初めて知ったのがSTUNというもの。
このSTUNがどういうものかを調べてみました。
参考資料
STUNはサーバーを設置して、そのサーバーにリクエストを投げるとリクエストを投げた端末のグローバルIPを返します。あとは他の端末からそのグローバルIPで接続を行えばP2P通信が行えるというものらしいです。
"らしいです"というのはすでにこの時点で理解ができなくなっているからです。
そうなってくると、どうやってP2P接続を開始するのでしょうか? つまり、相手にどうやってグローバルIPを教えるのでしょうか? 逆に相手のグローバルIPアドレスをどうやって取得するのでしょうか?
また、IPアドレスなどの管理を行うために別のサーバーを用意しないといけないのでしょうか?となってくると、なんかWebSocketより色々と用意しないといけなくなりますね。
そもそもこのような疑問を持ったきっかけは、サンプルコードが
となると自分で試したい場合はIPアドレスを1つだけしか割り当てられないレンタルサーバーの場合はSTUNサーバーを立てることができないのでしょうか?
あと、以降の疑問はまだ時期尚早と思われますが気になっているのでちょっと取り上げます。
WebRTCではこういったテキストやバイナリデータ(特に対戦ゲームを行なっている時のコントローラー入力情報など))はP2Pで送受信できないのでしょうか?
一応、WebKitGTK+というブラウザーに実装されたWebRTCの解説を見るとPeerConnectionオブジェクトにはSendメソッドがあり、このメソッドでメッセージを送信できるようなことが書かれています。しかし、W3CのWebRTC仕様のページにはPeerConnectionにはsendメソッドがありませんし、Chromeに実装されたwebkitPeerConnectionオブジェクトにもsendメソッドがありませんでした。
認識できたものの共通点としてKsproxyドライバを使用しているところです。(たぶん出力フォーマットが大いに関係していると思われます。YUVフォーマット対応のもの)
認識出来なかったもの 認識できたもの
これは、P2Pではないにせよ、WebSocketを使用して映像などをやり取りできるということだと思うのですが、私がすぐに思いついたのは、Media Source APIを使用した方法です。
Media Source APIはチャンクを次々に送信し、クライアントは受信したチャンクをSourceAppendメソッドで追加していくというものです。
しかし、こちらではこのMedia Source APIを使用していません。
ソース(wow_feature.js)を見てみたいものですが、アップされていないようで見ることができませんでした。
WebSocketをつかった映像のやり取りはどのようなコードとなるのでしょうか?
私も、興味を持ってWebRTCのことを調べ始めているところです。
恥ずかしながらWebRTCを調べて初めて知ったのがSTUNというもの。
このSTUNがどういうものかを調べてみました。
参考資料
- STUNサーバーの簡単な説明:http://www.3cx.jp/voip-sip/stun-server.php
- STUNのちょっと詳しい説明(Chromeでは画像が表示されないため他のブラウザーでアクセスしてください):
http://www.ekouhou.net/%EF%BC%A9%EF%BC%B0%E9%80%9A%E4%BF%A1%E8%A3%85%E7%BD%AE%E3%80%81%E9%80%9A%E4%BF%A1%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%80%81%E5%88%A4%E5%AE%9A%E6%96%B9%E6%B3%95%E3%81%8A%E3%82%88%E3%81%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/disp-A,2010-287982.html - STUNサーバーは基本的にポート番号は3478を使用する。
STUNはサーバーを設置して、そのサーバーにリクエストを投げるとリクエストを投げた端末のグローバルIPを返します。あとは他の端末からそのグローバルIPで接続を行えばP2P通信が行えるというものらしいです。
"らしいです"というのはすでにこの時点で理解ができなくなっているからです。
疑問その1 相手にどうやってグローバルIPアドレスを教えるのか、逆に相手のグローバルIPアドレスをどうやって取得するのか?
STUNサーバーがIPアドレスを管理してくれるのでしたら(いわゆるスーパーノード)少しは理解できるのですけど、調べてみるとSTUNサーバーの役目は単にグローバルIPアドレスを教えるためだけみたいですね。そうなってくると、どうやってP2P接続を開始するのでしょうか? つまり、相手にどうやってグローバルIPを教えるのでしょうか? 逆に相手のグローバルIPアドレスをどうやって取得するのでしょうか?
また、IPアドレスなどの管理を行うために別のサーバーを用意しないといけないのでしょうか?となってくると、なんかWebSocketより色々と用意しないといけなくなりますね。
そもそもこのような疑問を持ったきっかけは、サンプルコードが
pc = new webkitPeerConnection("STUN stun.l.google.com:19302", onSignalingMessage); pc.onaddstream = onAddStream; pc.onremovestream = onRemoveStream;と言った感じとなっており、アドレスといったものはSTUNサーバーと思われるアドレスだけだからです。 もし、STUNのことに詳しい方がいっらっしゃればどうかご教授のほどよろしくお願いします。
疑問その2 レンタルサーバーにSTUNサーバーを立てるのは無理?
STUNサーバーはその仕組みにより、(NATの種類がフルコーンじゃない場合はIPアドレスを変えて接続を行うため)IPアドレスを2つ持つ必要があるそうです。となると自分で試したい場合はIPアドレスを1つだけしか割り当てられないレンタルサーバーの場合はSTUNサーバーを立てることができないのでしょうか?
あと、以降の疑問はまだ時期尚早と思われますが気になっているのでちょっと取り上げます。
疑問その3 WebRTCではVIDEOやAUDIOなど以外のデータはP2Pでやり取りできない?
WebRTCのサンプルコードを見てみるとメッセージ(チャット)の送受信はXHRを使用しています(相手からのメッセージ取得は、XHRのタイムアウトのコールバックで再度、メッセージ取得リクエストを投げるという方法をとっているようです)。WebRTCではこういったテキストやバイナリデータ(特に対戦ゲームを行なっている時のコントローラー入力情報など))はP2Pで送受信できないのでしょうか?
一応、WebKitGTK+というブラウザーに実装されたWebRTCの解説を見るとPeerConnectionオブジェクトにはSendメソッドがあり、このメソッドでメッセージを送信できるようなことが書かれています。しかし、W3CのWebRTC仕様のページにはPeerConnectionにはsendメソッドがありませんし、Chromeに実装されたwebkitPeerConnectionオブジェクトにもsendメソッドがありませんでした。
疑問その4 デバイスは選択できない?
今のところ仮想カメラ+ノートカメラでしか試していないのですが、複数のデバイスが接続されている場合は選択ダイアログを出して欲しいのですけどね。将来実装する予定で今はまだ実装されていないのだと期待しましょう。疑問その5 デバイスによって認識されない?。
これはとても気になるところなんですが、色々と試したところ以下のとおりとなりました。(同様に仮想カメラ+ノートカメラでしか試していません)認識できたものの共通点としてKsproxyドライバを使用しているところです。(たぶん出力フォーマットが大いに関係していると思われます。YUVフォーマット対応のもの)
認識出来なかったもの 認識できたもの
疑問その6 WebSocketを使用したWebRTC
前日開催された東北デベロッパーズカンファレンスで、@agektmrさんが、WebSocketを使用したWebRTC?をちょこっと言っていました。これは、P2Pではないにせよ、WebSocketを使用して映像などをやり取りできるということだと思うのですが、私がすぐに思いついたのは、Media Source APIを使用した方法です。
Media Source APIはチャンクを次々に送信し、クライアントは受信したチャンクをSourceAppendメソッドで追加していくというものです。
しかし、こちらではこのMedia Source APIを使用していません。
ソース(wow_feature.js)を見てみたいものですが、アップされていないようで見ることができませんでした。
WebSocketをつかった映像のやり取りはどのようなコードとなるのでしょうか?