Pion/WebRTC
Pion
- WebRTC APIに準拠したプロトコルスタック
- 開発はコミュニティモデル
アーキテクチャ
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つに分かれている.
- Offer/Answerの中で宣言されたSSRCによる明示的なストリーム
- SSRCが事前に分からないSimulCastのストリーム
データの送信
pion/datachannel
はsctp.Clientをラップしてメッセージを送信する.
送信するデータは WriteDataChannel がエンコードしてSCTPサブシステムに送信する.
SCTPサブシステム -> pion/dtls
-> pion/ice
につながっていく.
pion/srtp
は WriteStreamSRTP を開くことができる.
接続の開始
Pionはトランスポートの集合体であり ICETransport, DTLSTransport and SCTPTransportを一つずつ持つ.そして,複数のRTPSenderとRTPSenderReceiverを持つ.
トランスポートは startTransports によって起動される.
トランスポートの起動にはリモートから最低限の詳細を知る必要がある.
- DTLS Fingerprint
- ICE User-fragment とパスワード
- リモートはSCTPをサポートしているか
- リモートが送信したいSSRC
- コーデックのサポート
Offer/Answerの生成
PeerConnectionについてセッションに関するメディア・データ・接続の要件を生成するSDPを生成する.
SetRemoteDescriptionが呼び出された場合は generateMatchedSDP が使用される.
最初にセッションを始めるときは generateUnmatchedSDP が呼ばれる.
v2 -> v3の変更点
v3.1.0
- PeerConnectionの多重化がUDP 1ポートで出来るようになった
- Firefox Simulcastのサポート