WebRTCで変わるWebの未来 2013/04/23 QCon Tokyo 2013 Toru Yoshikawa (@yoshikawa_̲t) Who? 吉川 徹 / Toru Yoshikawa @yoshikawa_̲t Google Developer Experts (Chrome) html5j.org/HTML5とか勉強会スタッフ ⽇日本jQuery Mobileユーザー会 管理理⼈人 Sublime Text 2 Japan Users Group 管理理⼈人 allWebクリエイター塾/jQuery Mobile担当講師 Blog: http://d.hatena.ne.jp/pikotea/ Agenda WebRTCとは? WebRTCのアーキテクチャ getUserMedia WebRTC その他のTips 今後の仕様策定と展望 WebRTCとは? WebRTC = Web Real-‐‑‒Time Communications WebRTC ブラウザ上でリアルタイムコミュニケーションを実現するための 仕様 双⽅方向性のあるコミュニケーションを必要とする様々なアプリケ ーションを開発できる ビデオ/⾳音声チャット テキストの共同編集 ゲーム etc... Demo https://apprtc.appspot.com/ WebSocketとWebRTC WebSocketは、リアルタイムな双⽅方向通信を実 現する仕様 Ajaxのように単⽅方向、単⼀一データのやり取りでは なく、⼀一度度コネクションを確⽴立立すれば⾃自由にデー タをやり取りできる WebSocketで既にリアルタイム双⽅方向通信は実 現しているが、WebRTCとの違いは何か? WebSocket WebRTC WebSocketとの違い WebRTCは、P2P通信を利利⽤用して端末間の相互接 続が可能 サーバーを経由しないため、⾼高速な通信ができる WebRTCでは、データ通信⽅方式がUDPのため品質 よりもリアルタイム性を重視したデータに適して いる(再送制御は可能なため、正確なデータ通信 ができないわけではない) WebRTCのアーキテクチャ Architecture WebRTCの2つの仕様 Media Capture and Streams(getUserMedia) WebRTC 1.0: Real-‐‑‒time Communication Between Browsers Media Capture and Streams (getUserMedia) Media Capture and Streams (getUserMedia) ローカルのカメラやマイクからストリームデータ を取得する仕様 通信時のストリームについても定義されている カメラから画像や⾳音声を取得して、加⼯工するだけ でもいろいろな応⽤用が可能 Demo http://webcamtoy.com/ja/ getUserMediaのサンプルコード navigator.webkitGetUserMedia({audio: true, video:true}, function(stream) { videoElement.src = webkitURL.createObjectURL(stream); }); ※Webkit(Chrome, Safari, Android)の記述 Canvasと連携して画像処理理 Web Audio APIと連携して⾳音声処理理 顔認識識、ジェスチャー etc... Demo http://www.movikantirevo.com/ WebRTC 1.0: Real-‐‑‒time Communication Between Browsers WebRTC 1.0: Real-‐‑‒time Communication Between Browsers 主にP2P通信のための仕様が定義されている 端末間の相互接続を開始するためのネゴシエーシ ョンを⾏行行う P2Pによるデータ通信(Data channel)などもあ る APIは、複雑で難解 ;-‐‑‒( Demo https://developer.mozilla.org/ja/demos/detail/bananabread WebRTCによるP2P通信を 始めるための事前準備 最初のネゴシエーションを仲介するためのサーバ ーを⽤用意しよう(WebサーバーでOK) NAT越えするためのICEサーバーを⽤用意しよう (公開されているものでもOK) Network構成 突然ですが、ネットワークに 関するお話です NAT traversal(NAT越え)の問題 P2P通信を開始するためには、お互いの端末のグロ ーバルアドレスを知る必要がある しかし、各端末の前にはファイアウォールなどがあ るので、⼀一筋縄ではいかない そのために必要なのが、ICEと呼ばれる仕組み ICEで取得したグローバルIPアドレスとポート番号 を通信するホスト間で交換する ICE Interactive Connectivity Establishment STUNやTURNなどのNAT越えの⼿手順をまとめた もの STUNで対応できないホストには、TURNを利利⽤用 する STUN Simple Traversal of UDP through NATs NAT越えの⽅方法のひとつ 通信するホストがSTUNサーバーにUDP接続を⾏行行 い、NATが割り当てたグローバルIPアドレスとポー ト番号を取得する STUNで対応できるNATは、フルコーン型、制限コ ーン型、ポート制限コーン型の3つ NATの種類 フルコーン型 1つのTCP/UDPポートを1台のPCに割り当て 制限コーン型 内部ホストがパケット送信した外部ホストのみと通信可能(UDPホール パンチングなどで対応) ポート制限コーン型 制限コーン型には、さらにポートの制限を加えたもの 対称型 外部ホストごとに別々のアドレス変換テーブルを持つ TURN Traversal Using Relay NAT NAT越えの⽅方法のひとつ 対称型や多段NATにも対応できる 要は、すべての通信をTURNを経由して⾏行行うの で、速度度的なメリットはほとんどない サーバー的にも⾼高負荷・⾼高コスト APIのほとんどがこの部分を解決す るためのネゴシエーション Sequence サンプルコードは参考程度度に デモ(http://rtcdc.komasshu.info) リポジトリ(https://github.com/KensakuKOMATSU/rtc_datachannel) RTCPeerConnection PeerConnection00は、Deprecatedなので利利⽤用 しないように Firefoxは、nightly以外は、about:configで media.peerconnection.enabledをtrueに設定す る new RTCPeerConnection() var pc = new RTCPeerConnection({ "iceServers": [ {"url": "STUNサーバーのアドレス"}, {"url": "TURNサーバーのアドレス"} ] }); stun:stun.l.google.com:19302 stun:23.21.150.121 addStream (local) // getUserMediaで取得したストリームデータを追加 pc.addStream(localStream); onicecandidate/addICECandidate pc.onicecandidate = function(e) { // リモートへICE候補を送信する sendMessage(JSON.stringify({ "candidate": e.candidate })); }; // リモートからのICE候補を受信した場合 function receiveMessage(message){ var candidate = new RTCIceCandidate({ "candidate": message.candidate }); pc.addICECandidate(candidate); } Send Offer // オファーを作成 pc.createOffer(function(description){ pc.setLocalDescription(description); // Send Offer sendMessage(JSON.stringify({ "sdp": description })); }); Send Answer function reciveMessage(message) { // RTCPeerConnectionを作成していなければ、作成しストリームデータを 追加しておく pc.setRemoteDescription(new RTCSessionDescription(message.sdp), function(){ if (pc.remoteDescription.type == "offer") { pc.createAnswer(function(description){ pc.setLocalDescription(description); // Send Answer sendMessage(JSON.stringify({ "sdp": description })); }); } }); } addStream (remote) pc.onaddstream = function(e) { video.src = URL.createObjectURL(e.stream); } Data Channel P2Pでバイナリ、テキストデータが送れる APIは、WebSocketとほぼ同じ Chrome 27より前は、起動オプションが必要 -‐‑‒-‐‑‒enable-‐‑‒data-‐‑‒channels Canary Buildは、現在v27なのでそのまま利利⽤用可能 Data Channel var channel = pc.createDataChannel("labelName"); channel.onopen = function(e) { // データチャネルオープン } channel.onmessage = function(e) { // テキストデータの受信 console.log(e.data); } channel.onclose = function(e) { // データチャネルクローズ } // テキストデータの送信 channel.send(message); APIの扱いは難しいので、簡単に 始めたい場合は、ライブラリを 利利⽤用しましょう WebRTCのライブラリ simpleWebRTC (https://github.com/ HenrikJoreteg/SimpleWebRTC) Peer.js (http://peerjs.com/) webRTC.io (https://github.com/webRTC/ webRTC.io) Peer.js Data Channelのみのサポート ブローカーサーバーが提供されている(API Key の申請が必要) connect()メソッドだけでP2Pのネゴシエーショ ンを完了了 その他のTips ブラウザ同⼠士でWebRTC Hello Chrome, itʼ’s Firefox calling! https://hacks.mozilla.org/2013/02/hello-‐‑‒chrome-‐‑‒its-‐‑‒firefox-‐‑‒calling/ http://blog.chromium.org/2013/02/hello-‐‑‒firefox-‐‑‒this-‐‑‒is-‐‑‒chrome-‐‑‒calling.html モバイルでWebRTC HTML5でテレビ電話、Chrome Beta for AndroidでWebRTCを試す http://d.hatena.ne.jp/jovi0608/20130307/1362645489 実装状況 機能 Chrome Firefox Opera Safari IE Media Capture ◯ ◯ ◯ − − Peer-‐‑‒to-‐‑‒peer connections ◯ ◯ − − − Data Channel △ △ − − − ※Operaは今後、Chromeと同様になります Microsoft WebRTC Proposal Microsoft pushes ahead with its own take on WebRTC (http://gigaom.com/2013/01/17/ microsoft-‐‑‒cu-‐‑‒webrtc-‐‑‒prototype/) Customizable, Ubiquitous Real-‐‑‒Time Communication (http:// html5labs.interoperabilitybridges.com/cu-‐‑‒rtc-‐‑‒ web/cu-‐‑‒rtc-‐‑‒web.htm) 今後の仕様策定と展望 今後の仕様策定 ストリームデータ以外でもテキストやバイナリデータを やり取りするためのData Channel APIが定義されてお り、既にChromeとFirefoxで実験的に実装されている その他、トーン信号(プッシュ信号)を送信するための DTMF(Dual-‐‑‒Tone Multi-‐‑‒Frequency)についても定義 されている 将来的には、ストリームのレコーディングも可能となる ⾒見見込み(Media Recording API) 商業化の流流れ TenHandsというベンチャー企業では、今年年に⼊入って WebRTCを利利⽤用したサービスの提供を開始 同じくベンチャー企業のPlivoは、WebRTCと既存の SIPラインと接続するためのSDKを提供しており、 WebRTCを固定電話と繋げることも可能になっている WebRTCには多くの企業が注⽬目しており、既に新たな サービスの創出や業界への参⼊入が活発化している まとめ これまでは、ビデオチャット(ビデオ会議)と⾔言えば、 専⽤用のネットワーク、専⽤用のハードウェアとソフトウェ アを利利⽤用するというプロプライエタリな環境だった WebRTCによって標準化され、オープンとなることで、 様々なネットワーク、デバイスが既存のインフラを含め てシームレスに接続するようになる 今後の新しいソリューションやビデオチャットに限ら ず、新しいサービスが産まれてくることが期待される 皆さんの⼿手で、新しいWeb の未来を作っていきましょう Thank you!! (@yoshikawa_̲t) Resources Community http://www.webrtc.org/ Sample Source https://code.google.com/p/webrtc-‐‑‒samples/source/ browse/trunk/apprtc/ Interoperability (Chrome and Firefox) https://code.google.com/p/webrtc-‐‑‒samples/source/ browse/trunk/apprtc/js/adapter.js Specifications W3C WebRTC 1.0: Real-‐‑‒time Communication Between Browsers (http://www.w3.org/TR/ webrtc/) Media Capture and Streams (http://www.w3.org/TR/mediacapture-‐‑‒streams/) Media Recoding API (http://lists.w3.org/Archives/Public/public-‐‑‒media-‐‑‒capture/2012Dec/ att-‐‑‒0159/RecordingProposal.html) IETF Web Real-‐‑‒Time Communication (WebRTC): Media Transport and Use of RTP (http:// tools.ietf.org/html/draft-‐‑‒ietf-‐‑‒rtcweb-‐‑‒rtp-‐‑‒usage) WebRTC Data Channel Protocol (http://tools.ietf.org/html/draft-‐‑‒jesup-‐‑‒rtcweb-‐‑‒data-‐‑‒ protocol) Javascript Session Establishment Protocol (http://tools.ietf.org/html/draft-‐‑‒ietf-‐‑‒rtcweb-‐‑‒ jsep) Communications W3C ML http://lists.w3.org/Archives/Public/public-‐‑‒webrtc/ IETF ML http://www.ietf.org/mail-‐‑‒archive/web/rtcweb/current/maillist.html Articles グループビデオチャットのTenHandsがChromeの WebRTCで実装–プラグイン不不要に (http:// jp.techcrunch.com/archives/20130205real-‐‑‒time-‐‑‒ communications-‐‑‒platform-‐‑‒tenhands-‐‑‒now-‐‑‒uses-‐‑‒ webrtc-‐‑‒on-‐‑‒chrome-‐‑‒for-‐‑‒plugin-‐‑‒free-‐‑‒video-‐‑‒chats/) WebRTCとSIPを結びつけるSDKをPlivoがローンチ…Web と固定電話の通話も可能に (http://jp.techcrunch.com/ archives/20130115plivo-‐‑‒launches-‐‑‒the-‐‑‒first-‐‑‒sdk-‐‑‒that-‐‑‒ lets-‐‑‒developers-‐‑‒connect-‐‑‒webrtc-‐‑‒and-‐‑‒sip/)
© Copyright 2024 Paperzz