Open4

Pion/WebRTC

goforbrokegoforbroke

Pion

  • WebRTC APIに準拠したプロトコルスタック
  • 開発はコミュニティモデル

https://pion.ly/

アーキテクチャ

https://github.com/pion/webrtc/wiki/Architecture-WebRTC

PeerConnectionでメディアトラフィックとデータトラフィックをサポートしている.

                                         <---> pion/srtp ---> OnTrack
                                         |         ^
                                         |         | --------- AddTrack
pion/ice <----> pion/webrtc(internal/mux)
                                         |
                                         <---> pion/dtls <--> pion/sctp -> OnDataChannel
                                                                   ^
                                                                   |---- CreateDataChannel

pion/srtp

メディアトラフィックの暗号化/復号化を担当する

pion/dtls

データトラフィックの暗号化/復号化を担当する

pion/sctp

復号化されたデータトラフィックを処理する.
DTLSコネクションはsctp.Clientに渡され,新しいDataChannel毎にSCTPストリームが作成される.

pion/webrtc(internal/mux)

メディアトラフィック,データトラフィックを多重化/多重分離する.
全てのDTLSとSRPTのトラフィックを1つのストリームで取得して多重分離する.
多重分離したメディアをSRTPまたはSRTCPに渡す.

メディアストリームの処理

メディアストリームの処理は2つに分かれている.

  1. Offer/Answerの中で宣言されたSSRCによる明示的なストリーム
  2. SSRCが事前に分からないSimulCastのストリーム

データの送信

pion/datachannel はsctp.Clientをラップしてメッセージを送信する.
送信するデータは WriteDataChannel がエンコードしてSCTPサブシステムに送信する.

SCTPサブシステム -> pion/dtls -> pion/ice につながっていく.

pion/srtpWriteStreamSRTP を開くことができる.

goforbrokegoforbroke

接続の開始

Pionはトランスポートの集合体であり ICETransport, DTLSTransport and SCTPTransportを一つずつ持つ.そして,複数のRTPSenderとRTPSenderReceiverを持つ.

トランスポートは startTransports によって起動される.
トランスポートの起動にはリモートから最低限の詳細を知る必要がある.

  • DTLS Fingerprint
  • ICE User-fragment とパスワード
  • リモートはSCTPをサポートしているか
  • リモートが送信したいSSRC
  • コーデックのサポート

Offer/Answerの生成

PeerConnectionについてセッションに関するメディア・データ・接続の要件を生成するSDPを生成する.
SetRemoteDescriptionが呼び出された場合は generateMatchedSDP が使用される.

最初にセッションを始めるときは generateUnmatchedSDP が呼ばれる.