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周りを引き続き調べていきたい.
この記事が気に入ったらサポートをしてみませんか?