10. Trickle ICE 方式によるシグナリング

前項までのビデオチャットプログラムは、P2P通信しようとする相手にSDPを送信する方法として、Vanilla ICE 方式と呼ばれる「ICE candidate の収集の完了後に、収集したICE candidateを保持するSDPを相手に送信する」という方法を採用していました。
本項では、Trickle ICE 方式と呼ばれる「SDPを作成直後にすぐに相手に送信し、ICE candidateを見つけるごとに相手に送信する」という方法の処理を構築します。

解説

Trickle ICE 方式によるシグナリングですべきことは、以下です。

Trickle ICE 方式は、Vanilla ICE 方式に比べて、処理の手続きが多少複雑になりますが、ICE Candidate の収集の完了を待たないため、接続が確立するまでの時間が早くなるという利点があります。

Vanillaには、「簡素な」「地味な」という意味があります。また、コンピューター用語においては、「改変が行われていない」「カスタマイズされていない」という意味があります。
Trickleには、「(液体が)少しづつ流れる」「(涙・汗・雨などが)したたり落ちる」「(人が)少しづつ来る」という意味があります。

準備

09. STUN Serverへの対応」を実施していない場合は、実施します。

サーバー側の処理

変更なし。

ウェブページ

変更なし。

クライアント側の処理

「public/client.js」ファイルを編集します。

「OfferSDPの作成」および「OfferSDPの設定とAnswerSDPの作成」

OfferSDPおよびAnswerSDPを作成直後にすぐに相手に送信するようにします。

「RTCPeerConnection関連の関数」コード部の「OfferSDPの作成」および「OfferSDPの設定とAnswerSDPの作成」の関数の処理を変更します。

ICE candidate イベントが発生したときのイベントハンドラ

ICE candidateを見つかるごとに相手に送信するようにします。

「RTCPeerConnection関連の関数」コード部の「RTCPeerConnectionオブジェクトのイベントハンドラの構築」の「ICE candidate イベントが発生したときのイベントハンドラ」の処理を変更します。

サーバーからのメッセージ受信に対する処理

「Socket.IO関連の関数」コード部の「サーバーからのメッセージ受信に対する処理」を変更します。

ICE candidateの追加関数

「RTCPeerConnection関連の関数」コード部に、「ICE candidateの追加」の関数を追加します。

「ICE gathering state change イベントが発生したときのイベントハンドラ

Trickle ICE 方式においては、ICE candidateを見つけるごとに相手に送信します。Vanilla ICE 方式の「ICE candidate の収集の完了後に、収集したICE candidateを保持するSDPを相手に送信する」処理をコメントアウトします。

「RTCPeerConnection関連の関数」コード部の「RTCPeerConnectionオブジェクトのイベントハンドラの構築」の「ICE gathering state change イベントが発生したときのイベントハンドラ」の処理を変更します。

動作確認

動作に関しては、前項と本項は変わりません。
(接続が確立するまでの時間が多少早くなりますが、体感できるほどではないかもしれません。)

ダウンロード

サンプルプログラム

デモ

デモ(Google App Engine) : https://my-video-chat.appspot.com/app10/index.html
デモ(Heroku) : https://myvideochat1234.herokuapp.com/app10/index.html

関連ページ

前項目 : 09. STUN Serverへの対応

次項目 : 11. 独自データの送受信