UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

WebRTCの現状 - STUN/TURN・シグナリングサーバーについて - (2/8)

v=0
o=- 7614219274584779017 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS
m=audio 1 RTP/SAVPF 111 103 104 0 8 107 106 105 13 126
c=IN IP4 0.0.0.0
a=rtcp:1 IN IP4 0.0.0.0
a=ice-ufrag:W2TGCZw2NZHuwlnf
a=ice-pwd:xdQEccP40E+P0L5qTyzDgfmW
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=mid:audio
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:9c1AHz27dZ9xPI91YNfSlI67/EMkjHHIHORiClQe
a=rtpmap:111 opus/48000/2
…

このちんぷんかんぷんなSDPにどんな意味があるのか 知りたい? それならばIETFの例を見てほしい。

肝に銘じて欲しいのは、WebRTCは、SDPの値を編集することで、ローカルとリモートの詳細が設定される前に、要求または答えが調節されるようにデザインされているということだ。

たとえば、apprtc.appspot.comではpreferAudioCodec() 関数 がデフォルトのコーデックとビットレイトを設定するために利用されている。

SDPはJavaScriptで扱うには少々骨が折れるので、将来のWebRTCではJSONを代わりに利用するべきだという議論がある。

しかしそれでもSDPにこだわる理由がいくつかある。

RTCPeerConnection + signaling: オファー、アンサーとキャンディデート

RTCPeerConnectionはWebRTCアプリケーションがピア間で音声や動画を交換するために利用するAPIのことだ。

このRTCPeerConnectionのプロセスを初期化するためには2つのタスクがある。  

  • ローカルのメディアの状態を確認する必要がある。たとえば解像度やコーデックの容量のことだ。これは要求と答えのためのメタデータとして利用される。

  • 「キャンディデート」として知られるアプリケーションのホストのための潜在的ネットワークアドレスを取得すること

一度ローカルデータを確認したら、それはシグナリング機構を介して、リモートピアと交換されなければならない。

アリスがイブに電話をかけるとしてみよう。ここではオファー・アンサーのメカニズムの全貌が見えてくる。

  1. アリスは RTCPeerConnectionオブジェクトを生成する。

  2. アリスはRTCPeerConnectionのオファーをcreateOffer()関数で生成する。

  3. アリスはsetLocalDescription()関数でオファーを相手に送信する準備をする。

  4. アリスはオファーをイブにシグナリング機構を利用して送信する。

  5. イブはsetRemoteDescription()でアリスのオファーに返信する。これでRTCPeerConnectionはアリスの設定の詳細を確認することができる。

  6. イブは createAnswer()を呼び出して、通信が成功したことを伝えるコールバックを発信する。

  7. イブはsetLocalDescription()を呼び出すことでlocal descriptionとしてアンサーを設定する。

  8. イブはシグナリング機構を利用してアリスにアンサーを送信する。

  9. アリスはsetRemoteDescription()でイブのアンサーをリモートセッションの詳細としてセットする。

アリスもイブもネットワーク情報を交換する必要がある。キャンディデートを発見することを表現するのに ICE の枠組みを利用してネットワークのインターフェイスとポートを発見するプロセスを参照する。

  1. アリスはRTCPeerConnectionObjectをonicecandidate handlerと一緒に作成する。

  2. onicecandidate handlerはネットワークのキャンディデートが利用可能になったときに呼ばれる。

  3. onicecandidate handler 内部でアリスはシグナリングチャンネルを経由してキャンディデートデータをイブに送信する。

  4. イブがアリスからキャンディデートメッセージを受信したら、addIceCandidate()関数を呼び出してそのキャンディデートをリモートピアの詳細に追加する。

JSEPがサポートするのはICE Candidate Tricklingで、それは呼び出しをした側が呼び出しの対象に対して最初のオファーの後にキャンディデートを提供することを段階的に許可し、かつ呼び出しの対象に通信を開始し、すべてのキャンディデートが到着するのを待つことなく、コネクションを確立することを可能にする。

2/8