見出し画像

2020-07-24の開発

現役のエンジニアが毎日どんなことを学んで,どんな開発を行っているのか雑にアウトプットしてみる試みの12日目です.

WebRTC

以前読んでいた,WebRTC の本を軽く一通り読んだ.

WebRTCに登場する工程としては以下の感じ.

- デバイスのメディアにアクセスする
- シグナリング
- Peer Connection

デバイスのメディアにアクセスする

デバイスにアクセスするためには,getUserMedia というAPIが用意されているのでそれを利用する.

アクセスできるメディアとしては,video は スマホであれば,リアカメラ,フロントカメラなども利用できる.

// フロントカメラを選ぶ
const constraints = { audio: true, video: { facingMode: "user" } };

// リアカメラを選ぶ
const constraints = { audio: true, video: { facingMode: { exact: "environment" } } };

stream = await navigator.mediaDevices.getUserMedia(constraints);

シグナリング

シグナリングでやることとしては,P2Pで通信するために,お互いのデバイスの情報を交換しなければならない.
内容としては,メディアのタイプ(オーディオ,ビデオ,データ)や,使用するコーデックの情報や,帯域幅の情報などになる.
これらの情報がを定義しているのが,SDP というプロトコル.

つまり,SDPオブジェクトをPeer同士で交換するのが,シグナリングの役目になる.

ちなみに,WebRTC の仕様にシグナリングチャネルは含まれているが,具体的な手法は標準化されていないため, 独自で実装する必要がありそう.

nodeまた,お互いの候補アドレス (IP アドレスと,ポート番号の組)を交換するのもシグナリングチャネルの役割.(このあとのPeer Connection で利用する)

Peer Connection

P2P で通信するためには,NAT を超える必要がある.そのために必要なのが,STUN サーバーと,TURN サーバー.

STUN サーバーは,NATの内側にあるデバイスが,NATの一番外側のIPアドレス(とポート)を知るためにある.STUNサーバーが,鏡のように振る舞って,IPアドレスを教えてくれる.

STUN サーバーにより自身の 候補アドレスを取得したら,シグナリングチャネルなどを使って,通信相手に送ることでお互いのパブリックIPアドレスをしり通信ができるようになる.

しかし,中間のルーターやファイアウォールによってはそれでも通信ができないことがあり,そういった場合に間に入って2つの Peer の通信を経由させるためのものが TURN サーバー.

これらを用意した上で,PeerConnection の offer と answer を作成し,通信先の Peer に シグナリングチャネルを使って 送る.

offer と answer を交換した後に,お互いの接続性を確認して,メディアの通信が始まる.

この一連の流れを定義したプロトコルを,ICE (Interactive Connectivity Establishment) という.


とりあえず,WebRTCを用いて,P2P でひととおりの接続までの流れを理解することができた.ビデオ会議などの多人数での通信も興味があるので,SFU周りを引き続き調べていきたい.

この記事が気に入ったらサポートをしてみませんか?