WebRTC が Firefox、Android、iOS に対応

ここ数週間で、WebRTC でさまざまな事象が発生しました。最新情報をお知らせします。

特に、WebRTC が複数のブラウザやプラットフォームに登場したことを大変うれしく思います。

getUserMedia は現在、フラグなしの Chrome、Opera、Firefox Nightly/Aurora でご利用いただけます(ただし、Firefox の場合は設定が必要です)。simpl.info/gum にある getUserMedia のクロスブラウザ デモをご覧ください。また、ウェブ オーディオの入力として getUserMedia を使用する Chris Wilson の素晴らしい例をご覧ください。

webkitRTCPeerConnection が Chrome 安定版になり、フラグレスになりました。TURN サーバーのサポートは Chrome 24 以降で利用できます。Chrome の RTCPeerConnection 実装の非常にシンプルなデモが simpl.info/pc で、優れたビデオチャット アプリケーションは apprtc.appspot.com で公開されています(名前に関する説明は、何度か繰り返すと webkitRTCPeerConnection になりました)。その他の名前と実装は非推奨になりました。標準プロセスが安定すると、webkit 接頭辞は削除されます)。

WebRTC は、パソコン向けに Firefox Nightly と Aurora に実装され、iOS と Android には Ericsson Bowser ブラウザを介して実装されました。

DataChannel

DataChannel は、任意のデータの高パフォーマンス、低レイテンシのピアツーピア通信を実現する WebRTC API です。API は WebSocket に似ていますが、通信はブラウザ間で直接行われるため、DataChannel は WebSocket よりもはるかに高速です。これは、ファイアウォールや NAT に対処するための「ホール パンチ」が失敗した場合に、リレー(TURN)サーバーが必要な場合でも同様です。

DataChannel はバージョン 25 でリリースされる予定ですが、このバージョンを見逃す可能性があります。これはあくまでも試験運用であり、完全には機能しない可能性があり、Firefox の実装では通信できない可能性があります。今後のバージョンの DataChannel は安定性が高く、Firefox で DataChannel とやり取りできるように実装される予定です。

Firefox Nightly/Aurora は mozGetUserMediamozRTCPeerConnectionDataChannel に対応しています(ただし、about:config 設定を忘れずに設定してください)。

以下は、Firefox で実行されている DataChannel のスクリーンショットです。

Firefox DataChannel のスクリーンショット

このデモは http://mozilla.github.com/webrtc-landing/data_test.html にあります。コード スニペットは次のとおりです。

pc1.onconnection = function() {
    log("pc1 onConnection ");
    dc1 = pc1.createDataChannel("This is pc1",{}); // reliable (TCP-like)
    dc1 = pc1.createDataChannel("This is pc1",{outOfOrderAllowed: true, maxRetransmitNum: 0}); // unreliable (UDP-like)
    log("pc1 created channel " + dc1 + " binarytype = " + dc1.binaryType);
    channel = dc1;
    channel.binaryType = "blob";
    log("pc1 new binarytype = " + dc1.binaryType);

    // Since we create the datachannel, don't wait for onDataChannel!
    channel.onmessage = function(evt) {
    if (evt.data instanceof Blob) {
        fancy_log("*** pc2 sent Blob: " + evt.data + ", length=" + evt.data.size,"blue");
    } else {
        fancy_log('pc2 said: ' + evt.data, "blue");
    }
    }
    channel.onopen = function() {
    log("pc1 onopen fired for " + channel);
    channel.send("pc1 says Hello...");
    log("pc1 state: " + channel.state);
    }
    channel.onclose = function() {
    log("pc1 onclose fired");
    };
    log("pc1 state:" + channel.readyState);
        }

Firefox の実装に関する詳細情報やデモについては、hacks.mozilla.org ブログをご覧ください。WebRTC の基本的なサポートは、2013 年の初めに Firefox 18 でリリースされる予定です。また、getUserMedia、createOffer/Answer 制約、TURN(ファイアウォールの内側のブラウザ間の通信を許可する)など、追加機能のサポートが計画されています。

WebRTC について詳しくは、WebRTC スタートガイドをご覧ください。WebRTC の書籍も用意されており、紙媒体と複数の電子書籍形式があります。

解決の制約

制約は Chrome 24 以降に実装されています。これらを使用して、getUserMedia() と RTCPeerConnection の addStream() 呼び出しの動画解像度の値を設定できます。

simpl.info/getusermedia/constraints で例を参照してください。ブレークポイントを設定し、値を微調整して、さまざまな制約を試します。

問題点1 つのブラウザタブで設定された getUserMedia の制約は、それ以降に開くすべてのタブの制約に影響します。制約に許可されていない値を設定すると、難解なエラー メッセージが表示されます。

navigator.getUserMedia error:  NavigatorUserMediaError {code: 1, PERMISSION_DENIED: 1}

同様に、サーバーではなくローカル ファイル システムから getUserMedia を使用しようとすると、このエラーが発生します。

ストリーミング画面キャプチャ

タブのキャプチャが Chrome Dev チャンネルで利用できるようになりました。これにより、タブの表示領域をストリームとしてキャプチャできます。ストリームは、ローカルで使用することも、RTCPeerConnection の addStream() でも使用できます。シーンの作成やウェブページの共有に非常に便利です。詳しくは、WebRTC タブのコンテンツ キャプチャの提案をご覧ください。

この更新についてコメントをお寄せください。これらの API の活用事例をぜひお聞かせください。

...バグを見つけた場合は、chromiumbugs.appspot.com まで報告してください。