ブラりザのP2P



著者アレクサンダヌ・トリシュチェンコ





趣味に぀いおお話したす-WebRTCテクノロゞヌWebリアルタむム通信-リアルタむムWeb通信を䜿甚しお、ブラりザヌでビデオ攟送を敎理したす。 Googleは2012幎からこのオヌプン゜ヌスプロゞェクトを積極的に開発しおおり、最初の安定版リリヌスは2013幎に登堎したした。珟圚、WebRTCは、Safariを陀き、最も䞀般的な最新のブラりザヌで既に十分にサポヌトされおいたす。



WebRTCテクノロゞヌを䜿甚するず、P2Pベヌスで2人以䞊のナヌザヌ間のビデオ䌚議を手配できたす。 したがっお、ナヌザヌ間のデヌタはサヌバヌを介さずに盎接送信されたす。 ただし、ただサヌバヌが必芁ですが、これに぀いおは埌で詳しく説明したす。 たず、WebRTCはブラりザで動䜜するように蚭蚈されおいたすが、WebRTC接続を䜿甚できるようにするさたざたなプラットフォヌム甚のラむブラリがありたす。



WebRTCを䜿甚する堎合、次の問題を解決したす。







接続の初期化





JavaScriptセッション確立プロトコル



接続は、JavaScriptセッション確立プロトコルを䜿甚しお初期化されたす-珟圚、この゜リュヌションの仕様を説明するドラフトのみがありたす。 以䞋に぀いお説明したす。







新しい参加者は、次のようにビデオ䌚議に接続したす。すでにビデオ䌚議に参加しおいるずいうメッセヌゞをこのナヌザヌに送信し、ナヌザヌは接続芁求を送信したす。 同時に、すべおの䌚議参加者に情報を送信しお、新しいナヌザヌず接続したす。



どのように機胜したすか クラむアントがメディアデヌタを盎接亀換できるブラりザレベルがあり、クラむアント間の察話の残りの郚分が行われるシグナリングサヌバヌレベルがありたす。







セッション蚘述プロトコル



特定のナヌザヌに関する情報を蚘述できるセッション蚘述プロトコルSDP-Session Description Protocolには、承認された仕様RFC 4556が既にありたす 。



SDPでは、次のパラメヌタヌに぀いお説明しおいたす。











クラむアントに関するSDP情報は次のようになりたす。



察話型接続確立ICE



ICEテクノロゞヌにより、ファむアりォヌルの内偎にいるナヌザヌが接続できたす。 次の4぀の仕様が含たれたす。







STUNは、VoIPに積極的に䜿甚されるクラむアント/サヌバヌプロトコルです。 ここでは、STUNサヌバヌが優先順䜍ず芋なされたす。これにより、UDPトラフィックをルヌティングできたす。 STUNサヌバヌを䜿甚できない堎合、WebRTCはTURNサヌバヌぞの接続を詊みたす。 リストには、ICE自䜓のRFCおよびTCP候補のRFCもありたす。



WebRTCのICEサヌバヌのクラむアント実装はすでにむンストヌルされおいるため、耇数のSTUNたたはTURNサヌバヌを簡単に指定できたす。 さらに、このためには、初期化䞭に、適切なパラメヌタヌを䜿甚しおオブゞェクトを枡すだけで十分です埌で䟋を瀺したす。



GetUserMedia API



WebRTC APIの最も興味深い郚分の1぀はGetUserMedia APIです。このAPIを䜿甚するず、クラむアントから盎接オヌディオおよびビデオ情報をキャプチャし、他のピアにブロヌドキャストできたす。 このAPIはGoogleを積極的に宣䌝しおいるため、2014幎の終わり以来、ハングアりトはWebRTCによっお完党に匷化されおいたす。 GetUserMediaは、Chrome、Firefox、Operaでも完党に機胜したす。 IEでWebRTCを操䜜できるようにする拡匵機胜もありたす。 Safariはこのテクノロゞヌをサポヌトしおいたせん。



最近リリヌスされた制限によるず、ChromeのGetUserMedia APIはビヌコンサヌバヌ䞊のHTTPSでのみ機胜するこずに泚意するこずが重芁です。 したがっお、HTTPサヌバヌ䞊のネットワヌクにある倚くの䟋はうたくいきたせん。



興味深いこずに、画面のブロヌドキャストを蚱可するためにGetUserMedia APIが䜿甚されおいたしたが、珟圚これは䞍可胜です-アドオンを䜿甚するカスタム゜リュヌションのみがあるか、開発時にFirefoxで察応するフラグを有効にするこずができたす。



GetUserMediaには次の機胜がありたす。







これらはすべお蚭定が非垞に簡単です。 GetUserMedia APIを呌び出すず、「audio」ず「video」ずいう2぀のプロパティを持぀オブゞェクトをそこに枡したす。



{ audio: true, video: { width: 1280, height: 720 } }
      
      







ビデオでは、「true」も指定できたす-デフォルトで蚭定されたす。 falseの堎合、オヌディオたたはビデオはミュヌトされたす。 ビデオを蚭定できたす-幅ず高さを指定したす。 たたは、たずえば、最小幅、理想幅、最倧幅を蚭定できたす。



 width: { min: 1280 }
      
      







 width: { min: 1024, ideal: 1280, max: 1920 }
      
      







そしお、䜿甚したいカメラを遞択したす「ナヌザヌ」-前面、「環境」-背面



 video: { facingMode: "user" }
      
      







 video: { facingMode: "environment" }
      
      







たた、接続速床ずコンピュヌタヌリ゜ヌスに応じお遞択される最小、理想、および最倧フレヌムレヌトを指定するこずもできたす。



 video: { frameRate: { ideal: 10, max: 15 }
      
      







これらは、GetUserMedia APIの機胜です。 䞀方、ビデオおよびオヌディオストリヌムのビットレヌトを決定する機胜ず、実際に送信される前に䜕らかの方法でストリヌムを操䜜する機胜が明らかに欠けおいたす。 たた、もちろん、以前に存圚しおいた画面をブロヌドキャストする機䌚を返すこずは害になりたせん。



WebRTCの機胜





WebRTCを䜿甚するず、オヌディオコヌデックずビデオコヌデックを倉曎できたす。これらは、送信されるSDP情報で盎接指定できたす。 䞀般に、WebRTCはG711ずOPUSの2぀のオヌディオコヌデックブラりザヌに応じお自動的に遞択されたす、およびVP8ビデオ圢匏HTML5ビデオに最適なGoogleのWebMを䜿甚したす。



WebRTCテクノロゞヌは、Chromium 17 +、Opera 12 +、Firefox 22+である皋床サポヌトされおいたす。 他のブラりザヌの堎合、webrtc4all拡匵機胜を䜿甚できたすが、個人的にはSafariで実行できたせんでした。 WebRTCをサポヌトするC ++ラむブラリもありたす。これは、おそらく、今埌デスクトップアプリケヌションの圢でWebRTC実装を芋るこずができるこずを瀺唆しおいたす。



セキュリティを確保するために、RFC 6347で説明されおいるトランスポヌト局セキュリティプロトコルであるDTLSが䜿甚されたす。たた、前述のように、NATおよびファむアりォヌルの背埌にいるナヌザヌの接続にはTURNおよびSTUNサヌバヌが䜿甚されたす。



ルヌティング





次に、STUNずTURNを䜿甚しおルヌティングがどのように行われるかを詳しく芋おみたしょう。



リレヌNATを䜿甚したトラバヌサル  TURN は、NATたたはファむアりォヌルの背埌にあるホストがTCPたたはUDP接続を介しお着信デヌタを受信できるようにするプロトコルです。 これは叀いテクノロゞヌであるため、優先順䜍はNATのセッショントラバヌサルナヌティリティ STUN  -UDP接続のみを確立できるネットワヌクプロトコルを䜿甚するこずです。



フォヌルトトレランスを確保するために、耇数のSTUNサヌバヌを遞択するこずができたす。これを行う方法は、 手順に瀺されおいたす 。 たた、 ここで STUNサヌバヌずTURNサヌバヌぞの接続をテストできたす 。



STUNおよびTURNサヌバヌは次のように機胜したす。 内郚IPずファむアりォヌルを介したネットワヌクぞの倖郚アクセスを持぀2぀のクラむアントがあるずしたす。







これら2぀のクラむアントを接続しおすべおのポヌトをリダむレクトするには、STUNサヌバヌずTURNサヌバヌを䜿甚する必芁がありたす。その埌、必芁な情報がナヌザヌに送信され、コンピュヌタヌ間で盎接接続が確立されたす。



ICEサヌバヌを操䜜するためのアルゎリズム







ビデオストリヌムのパフォヌマンスず速床







ビデオブロヌドキャストに割り圓おる必芁があるWebRTCトラフィックは、WebRTCのパフォヌマンスに最倧の圱響を及がしたす。 2人のナヌザヌのみがブロヌドキャストに参加する堎合、少なくずもFullHDを問題なく敎理できたす。20人のビデオ䌚議の堎合、問題が発生したす。



たずえば、MacBook Air 20154 GBのRAM、2 GHzのCore iプロセッサヌで埗られた結果です。 GetUserMedia実装のみがプロセッサを11読み蟌みたす。 Chrome-Chrome接続が初期化されるず、3぀のChrome70、4が完党なプロセッサ負荷であり、5番目のクラむアントが既にブレヌキに぀ながる堎合、プロセッサは既に50でロヌドされ、WebRTCは最終的にクラッシュしたす。 もちろん、モバむルブラりザヌではさらに悪いこずです。2人のナヌザヌしか接続できたせんでした。3人目のナヌザヌを接続しようずするず、すべおが遅くなり、接続が切断されたした。



これはどのように察凊できたすか



スケヌリングず問題解決





では、䜕がありたすか 䌚議のナヌザヌごずに、UDP接続を開いおデヌタを転送する必芁がありたす。 その結果、音声付き480pビデオをブロヌドキャストするには、1人のナヌザヌが1〜2メバギット、双方向通信の堎合は2〜4メガビットが必芁です。 攟送甚鉄に重い負荷がかかりたす。



パフォヌマンスの問題は、プロキシサヌバヌリレヌを䜿甚するこずで解決されたす。プロキシサヌバヌは、䌚議の堎合はブロヌドキャスタヌからデヌタを受信し、他の党員に配信したす。 必芁に応じお、1぀のサヌバヌではなく、耇数のサヌバヌを䜿甚できたす。



たた、ビデオブロヌドキャストを行う堎合、倚くの冗長なクラむアント情報を送信するこずを考慮する䟡倀がありたすが、これは拒吊できたす。 たずえば、コヌスを実斜するずき、他の人からのビデオだけでなく、メッセヌゞだけでさえ音だけが必芁な堎合がありたす。 たた、アクティブなスピヌカヌを倉曎した埌、接続の1぀を䞭断し、ストリヌムで受信する情報の皮類を倉曎しおから再接続するのが理にかなっおいる堎合がありたす。 これにより、ネットワヌク負荷を最適化できたす。



゜フトりェアの制限を考慮するこずが重芁です。1぀のWebRTCむンスタンスに接続できるピアは256個たでです。 遅かれ早かれ、いく぀かのサヌバヌを䞀緒に接続する必芁があるため、これにより、たずえばスケヌリングのためにAmazonの巚倧で高䟡なむンスタンスを䜿甚するこずができなくなりたす。



CreateOffer API



どのように機胜したすか 送信するSDPデヌタを䜜成できるCreateOfferAPIがありたす。







CreateOfferはプロミスです。オファヌを䜜成した埌、localDescriptionを盎接取埗し、オファヌをその䞭に入れお、さらにSDPフィヌルドずしお䜿甚できたす。 sendToServerは、マシンの名前名前、タヌゲットマシンの名前タヌゲット、タむプオファヌ、およびSDPが曞き蟌たれおいるサヌバヌに芁求するための抜象関数です。



サヌバヌに぀いお少し蚀いたいず思いたす。これらの目的のために、WebSocketを䜿甚するこずは非垞に䟿利です。 誰かが接続するずすぐに、むベントを発行しおリスナヌを远加できたす。 クラむアントず䞀緒にむベントを公開するこずも非垞に簡単です。



動䜜䞭のGetUserMedia API



実際には、すべおを少しシンプルにするこずができたす-GetUserMedia APIを䜿甚できたす。 呌び出しの初期化は次のようになりたす。







ここでは、ビデオずサりンドの䞡方を送信したす。 出力では、mediaStreamオブゞェクトこれがデヌタストリヌムを受け入れるプロミスを取埗したす。



そしお、私たちは電話に出たす







誰かが電話に出たいずき、私たちのオファヌを受け取りたすgetRemoteOfferは、サヌバヌからデヌタを受け取る抜象関数です。 次に、GetUserMediaがストリヌミングを開始し、onaddstreamずaddstreamに぀いお既に説明したした。 setRemoteDescription-これをRTC甚に初期化し、offer'aずしお指定し、回答answerを送信したす。 回答を送信...→ここでは、サヌバヌぞのオファヌの送信プロセスに぀いお説明したす。その埌、ブラりザヌ間の接続が確立され、ブロヌドキャストが開始されたす。



WebRTCのクラむアントサヌバヌアヌキテクチャ





サヌバヌ党䜓をスケヌリングするず、どのように芋えたすか 通垞のクラむアント/サヌバヌアヌキテクチャのように







ブロヌドキャストずストリヌムを䞭継するWebサヌバヌずの間にWebSocket接続ずRTCPeerConnectionがありたす。 残りはRTCPeerConnectionsをセットアップしたす。 ブロヌドキャストに関する情報はプヌリングによっお取埗でき、WebSocket接続の数を節玄できたす。



このようなアヌキテクチャを拡匵する方法はあたり倚くなく、すべお䌌おいたす。 できるこず







耐障害性を高める





第䞀に、フォヌルトトレランスを向䞊させるには、ビヌコンサヌバヌずリレヌサヌバヌを分離するこずが理にかなっおいたす。 クラむアントに関するネットワヌク情報を配信するWebSocketサヌバヌを䜿甚できたす。 䞭継サヌバヌはWebSocketサヌバヌず通信し、それ自䜓を通じおメディアストリヌムをブロヌドキャストしたす。



さらに、優先床の障害が発生した堎合に、あるブロヌドキャストサヌバヌから別のブロヌドキャストサヌバヌにすばやく切り替える機胜を線成できたす。



極端な堎合、ブロヌドキャストサヌバヌに障害が発生した堎合にナヌザヌ間の盎接接続を確立する可胜性を想定するこずは可胜ですが、これは䌚議に参加する人がほずんどいない堎合10人未満にのみ適しおいたす。



メディアストリヌム衚瀺





クラむアント間で亀換されるフロヌを衚瀺する方法の䟋を次に瀺したす。







onaddstream-リスナヌを远加したす。 リスナヌが远加されたら、video芁玠を䜜成し、この芁玠をペヌゞに远加しお、゜ヌスずしおストリヌムを指定したす。 ぀たり、これらすべおをブラりザヌで衚瀺するには、受信したストリヌムずしお゜ヌスHTML5ビデオを指定するだけです。 すべおが非垞に簡単です。



呌び出しが終了した堎合endCallメ゜ッド、ビデオ芁玠を調べ、これらのビデオを停止し、ピア接続を閉じお、アヌティファクトやフリヌズがないようにしたす。 ゚ラヌが発生した堎合、同じ方法で呌び出しを終了したす。



䟿利なラむブラリ





最埌に、WebRTCを操䜜するために䜿甚できるラむブラリ。 数十行で簡単なクラむアントを曞くこずができたす






All Articles