WebRTC-スケーラブルなライブストリームブロードキャスト/マルチキャスト


114

問題:

WebRTCは、ピアツーピアのビデオ/オーディオ接続を提供します。p2p通話、ハングアウトに最適です。しかし、ブロードキャストについてはどうでしょう(1対多、たとえば1から10000)。

放送局「B」と2人の参加者「A1」、「A2」があるとします。もちろん、解決できるようです。BをA1に接続し、次にBをA2に接続するだけです。したがって、Bはビデオ/オーディオストリームを直接A1に送信し、別のストリームをA2に送信します。Bはストリームを2回送信します。

次に、A1、A2、...、A10000の出席者が10000人いるとします。これは、Bが10000ストリームを送信する必要があることを意味します。各ストリームは〜40KB / sです。つまり、Bはこのブロードキャストを維持するために400MB / sの発信インターネット速度を必要とします。受け入れられない。

元の質問(廃止)

どういうわけかこれを解決することは可能ですか?Bはいくつかのサーバーで1つのストリームのみを送信し、出席者はこのサーバーからこのストリームをプルするだけですか?はい、これはこのサーバーの発信速度が高速でなければならないことを意味しますが、私はそれを維持できます。

あるいは、これはWebRTCのアイデアを台無しにすることを意味しますか?

ノート

エンドユーザーの貧弱なUXによると、Flashは私のニーズに対応していません。

ソリューション(実際にはない)

26.05.2015-現在、メディアサーバーをまったく使用しないWebRTCのスケーラブルなブロードキャストのソリューションはありません。サーバーサイドソリューションだけでなく、ハイブリッド(さまざまな条件に応じてp2p +サーバーサイド)が市場に出ています。

https://github.com/muaz-khan/WebRTC-Scalable-Broadcastのようないくつかの有望な技術がありますが、それらは考えられる問題に答える必要があります:遅延、ネットワーク接続の全体的な安定性、スケーラビリティの公式(おそらく無限にスケーラブルではありません) )。

提案

  1. オーディオコーデックとビデオコーデックの両方を調整して、CPU /帯域幅を減らします。
  2. メディアサーバーを取得します。

3
「スケーラブルなアプリを構築する唯一の方法は、サーバー側のソリューションを使用することです。」それはかなり明らかなようです... WebRTCに関しては、それは大規模な放送を意図したものではありませんでした。ISPはマルチキャストをルーティングしないため、そのためにマルチキャストをサポートするものを使用するか、インターネットを経由する必要がある場合はサーバーベースの1対1接続を使用します。
Dark Falcon

1
クライアントからサーバーにWebRTCを使用しないのはなぜですか?問題は配布にあります。クライアントの接続がそれを処理できないため、1つのストリームをサーバーに送信し、そこからクライアントにストリーミングします。帯域幅は高額になりますが、各ユーザーに単一のストリームを送信したり、ユーザーに他のユーザーにストリームを送信させることはできません。
Dark Falcon

1
私が知っている、少なくとも2つの会社がwebrtcベースのp2pビデオ配信を試みていることを知っています。affovi.com/ rtcplayer.html-ほとんどがライブビデオです。およびpeer5.com-主にVOD向け。
スベトリンムラデノフ2013

1
@igorpavlov確認したい場合があります:github.com/muaz-khan/WebRTC-Scalable-Broadcastクロムでのみ機能しますが、オーディオブロードキャストはまだ機能しません。
Muaz Khan

4
なんらかのMCUがなければ、そのスケーラビリティに到達する方法はありません。WebRTCはピアツーピアになるように設計されています。ブロードキャスターを完全に非難することなく、そこからブロードキャストすることはできません(インターンされる各ストリームに一意のピア接続があり、これはエンコードされる別のストリームです)。ピアツーピアからメディアを中継することは可能ですが、もちろん、これにより、後でストリームに追加されるすべてのピアに対して追加のレイテンシが発生します。品質とスケーラビリティのために、webrtc MCUサーバーを持つことが唯一の現実的なソリューションです。
ベンジャミントレント

回答:


66

ここではかなり取り上げたので、ここでやろうとしていることは、単純な昔ながらのWebRTC(厳密にはピアツーピア)では不可能です。前述のとおり、WebRTC接続では、セッションごとに暗号化キーを再ネゴシエートしてデータを暗号化します。したがって、放送局(B)は実際に、出席者の数だけストリームをアップロードする必要があります。

ただし、非常に簡単に実行できる非常にシンプルなソリューションがあります。私はそれをテストしました。これはWebRTCゲートウェイと呼ばれています。ヤヌスは良い例です。完全にオープンソースです(github repo here)。

これは次のように機能します。ブロードキャスターは、WebRTCを話すゲートウェイ(Janus)に連絡します。したがって、重要なネゴシエーションがあります。Bは安全に(暗号化されたストリーム)をJanusに送信します。

これで、出席者が接続すると、Janusに再び接続されます。WebRTCネゴシエーション、セキュリティで保護されたキーなど。今後、Janusは各出席者にストリームを返します。

これは、放送局(B)がストリームをJanusに1回だけアップロードするため、うまく機能します。Janusは独自のキーを使用してデータをデコードし、生データ(つまり、RTPパケット)にアクセスし、それらのパケットを各出席者に送り返すことができます(Janusが暗号化を担当します)。そして、Janusをサーバーに配置したので、アップロードの帯域幅が大きいため、多くのピアにストリーミングできます。

つまり、サーバー関係しますが、そのサーバーはWebRTCを話し、それを「所有」します。Janusの部分を実装するので、データの破損や途中での人の心配はありません。もちろん、サーバーが危険にさらされない限り。しかし、あなたができることはたくさんあります。

使いやすさを示すために、Janusには、呼び出し可能なincoming_rtp()(およびincoming_rtcp())という関数があり、rt(c)pパケットへのポインターを提供します。その後、それを各出席者に送信できます(sessionsJanusを使用すると非常に使いやすくなります)。一つの実施のためにここを見てincoming_rtp()機能以下の行のカップルは、すべての参加者にパケットを送信する方法を見ることができ、ここで、あなたは、RTPパケットを中継するために、実際の機能を見ることができます。

それはすべてうまく機能し、ドキュメントはかなり読みやすく理解しやすいです。「エコーテスト」の例から始めることをお勧めします。これは最も簡単で、ヤヌスの内部の仕組みを理解できます。エコーテストファイルを編集して独自のコードを作成することをお勧めします。作成する冗長なコードがたくさんあるため、完全なファイルから開始することもできます。

楽しんで!私が助けてくれたことを願っています。


1
これが現在Safari(またはWebRTCをサポートしていないブラウザ)では機能しないと言っても本当ですか?WebRTCを使用してブラウザーからサーバーにブロードキャストし、ビデオをHLS / HDS(またはRTMP)にトランスコードして従来のブロードキャストシステムに適合させるハイブリッドソリューションを知っている人はいますか?
Ben

1
@Benはい、WebRTCをサポートしていないブラウザでは機能しません。昔(私がこれを書いたとき)、Safariは明らかにこれをサポートしていませんでした。今日はチェックしていません。しかし、私はまだそれらがWebRTCをサポートしていないと思います(ただし、確認される予定です)。ハイブリッドシステムでの使用については、これは完全に可能です。実際、これは私が働いていた会社のために私がやったことです。あなたが言ったように、私はブラウザーからサーバーにブロードキャストし、そこから、GStreamerパイプラインを構築してプラグインし、フィードをトランスコードしました。これも可能です!
nschoe

jitsiについて何か考えはありますか?ジチシも同じですか?
ishandutta2007 2017

@nschoeこれは、websocketを使用して同じことをするよりも優れていますか?
Navigateur

SFU(選択的転送ユニット)がどのように機能するかを実際に説明しています。mediasoup
Dirk V

11

@MuazKhanが前述したように:

https://github.com/muaz-khan/WebRTC-Scalable-Broadcast

クロムで動作し、オーディオブロードキャストはまだありませんが、これは最初のソリューションのようです。

スケーラブルなWebRTCピアツーピアブロードキャストデモ。

このモジュールは単にsocket.ioを初期化し、帯域幅/ CPU使用率の問題なしに無制限のユーザーを介して単一のブロードキャストを中継できるように構成します。すべてがピアツーピアで起こります!

ここに画像の説明を入力してください

これは間違いなく完了できるはずです。
他の人もこれを達成できますhttp : //www.streamroot.io/


1
これは私には少し時代遅れのようです。このアイデアに関する更新や考えはありますか?
igorpavlov

また、とにかくレイテンシの問題を解決しますか?たとえば、Peer1はPeer5と通信し、Peer2は最終的に接続を失います。または、このアーキテクチャはLANのみに適していますか?
igorpavlov

また、StreamrootはPeer5に似ていますか?
igorpavlov

7

私の知る限り、関連する成熟した唯一の現在の実装はAdobe Flash Playerであり、バージョン10.1以降、ピアツーピアビデオブロードキャスト用のp2pマルチキャストをサポートしています。

http://tomkrcha.com/?p=1526


1
人々は技術を殺しません。このテクノロジーは、特にマイク/カメラを許可する場合、非常に貧弱なUXを提供することで自殺しています。それがgetusermediaが勝つ場所です。
igorpavlov 2015

これ以上同意できませんでした。
トム

悪いuxは別として、これが解決策でしょうか?サーバーレス?
rubo77 2015年

6

「スケーラブル」なブロードキャストは、インターネットではIP UDPマルチキャストが許可されていないため、不可能です。しかし、理論的にはLANで可能です。
Websocketの問題は、設計上、RAW UDPにアクセスできず、許可されないことです。
WebRTCの問題は、データチャネルがSRTPの形式を使用することです。この場合、各セッションには独自の暗号化キーがあります。したがって、誰かが「発明」するか、APIがすべてのクライアント間で1つのセッションキーを共有する方法を許可しない限り、マルチキャストは役に立ちません。


1
しかし、チャットはすでにWebRTCで機能しているので、すべてのメッセージがすべての人に表示されるので、1
対多

@ rubo77テキストメッセージで送信されたデータは、ビデオストリームで送信されたデータのレートと量と比較してまったく何もありません。そのため、チャットには一度に多くのユーザーを簡単に含めることができます
Dirk V

5

ピアアシスト配信のソリューションがあります。つまり、アプローチはハイブリッドです。サーバーとピアの両方がリソースの配布に役立ちます。それが、peer5.compeercdn.comが採用したアプローチです

特にライブブロードキャストについて話している場合は、次のようになります。

  1. ブロードキャスターは、ライブビデオをサーバーに送信します。
  2. サーバーはビデオを保存します(通常は、すべての関連フォーマットにトランスコードします)。
  3. このライブストリームに関するメタデータが作成されており、HLSまたはHDSまたはMPEG_DASHと互換性があります
  4. 消費者は関連するライブストリームを閲覧し、そこでプレーヤーはメタデータを取得し、次に取得するビデオのチャンクを認識します。
  5. 同時に、コンシューマーは(WebRTCを介して)他のコンシューマーに接続されています
  6. 次に、プレーヤーは関連するチャンクをサーバーまたはピアから直接ダウンロードします。

このようなモデルに従うと、ライブストリームのビットレートと視聴者の共同アップリンクに応じて、サーバーの帯域幅を最大90%節約できます。

免責事項:著者はPeer5で働いています


ありがとうございました。私はpeer5について知っていますし、それはかなり魅力的なソリューションだと思います。ただし、この質問の目的は、完全にサーバーレスのソリューション(STUN / TURNのみが許可されている)を見つけることでした。
igorpavlov 2014年

5

私のマスターは、WebRTCを使用したハイブリッドcdn / p2pライブストリーミングプロトコルの開発に焦点を当てています。最初の結果をhttp://bem.tvで公開しました

すべてがオープンソースであり、私は貢献者を探しています!:-)


MCUのようなサーバー側のソフトウェアを使用していますか?
igorpavlov 2014年

私は実際にrtcioのサーバーサイドコンポーネントをいくつか使用しています:github.com/rtc-io
flavioribeiro

1
シグナリングにコンポーネントを使用しているようです。サーバー側のビデオストリーミングはどうですか?それともあなたの解決策は完全にP2Pですか?
igorpavlov 2014年

@igorpavlovへの回答が遅くなって申し訳ありません。EvoStreamを使用してビデオをセグメント化し、ビデオソースをループしてElementalエンコーダーを使用してEvoStreamをポイントしています。
flavioribeiro 2014

メディアサーバープロバイダーです。もっと効率的?恐らく。それは私が探しているものですか?いいえ
igorpavlov

2

Angel Genchevからの答えは正しいようですが、WebRTCを介した低遅延のブロードキャストを可能にする理論上のアーキテクチャがあります。B(ブロードキャスター)がA1(出席者1)にストリーミングすることを想像してください。次に、A2(出席者2)が接続します。A1は、BからA2にストリーミングする代わりに、BからA2に受信されるビデオのストリーミングを開始します。A1が切断すると、A2はBからの受信を開始します。

このアーキテクチャは、レイテンシと接続タイムアウトがない場合に機能します。したがって、理論的には正しいですが、実際的ではありません。

現時点では、サーバー側のソリューションを使用しています。


サーバー側ソリューションのストリーム速度はどうですか?共有してください。
user2003356 2014

サーバー側のソリューションはどういう意味ですか?何を使いましたか?それは私の研究に役立つでしょう。共有してください。ありがとう。
user2003356 '19

サーバー側のソリューションは、Opentok by Tokboxを意味します。私はそれらを宣伝しません、市場にはそのような解決策がたくさんありますが、私はこれに固執します。メディアサーバーのように動作しています。PSマルチパーティ通信とはどういう意味ですか?わかりません。
igorpavlov 2014

@igorpavlovサーバー側のwebrtcを提供する企業のリストを教えていただけますか?私はFlashphonerとOpentokしか知りません。ありがとう
Ramil Amerzyanov 2014

これが実際に拡大するかどうか知りたいです。巨大なグループ(1000以上)のレイテンシに関するスケーリングの問題は確かにありますが、5〜10しかない場合、それは非常にうまく機能すると想像しますが、ピア "チェーン"の真ん中に誰かがいる場合、いくつかの派手な足の作業が必要になります"単一のチェーンである場合、後続のすべてのピアを離れて再接続すると、オーバーヘッドが非常に大きくなります。2進/ 3進ツリー構造を使用した方がよい場合があります。
ベンジャミントレント

2

WebRTCスケーラブルソリューションの市場で利用可能ないくつかのソリューションがあります。低レイテンシでスケーラブルなwebrtcストリーミングを提供します。ここにいくつかのサンプルがあります。 JanusJitsiWowzaRed5proAnt Media Server

私はAnt Media Serverの開発者です。AndroidとiOS SDKを含むコミュニティエディションとエンタープライズエディションの両方を提供しています。なんとかお手伝いできるかどうかお知らせください。


1

1対多の要件を持つWebRTCの使用について説明しています。WebRTCはピアツーピアストリーミング用に設計されていますが、多くの視聴者にビデオを配信しながら、WebRTCの低レイテンシを活用できる構成もあります。

トリックは、すべてのビューアでストリーミングクライアントに負担をかけないことであり、あなたが言ったように、「リレー」メディアサーバーを持っています。これは自分で作成できますが、正直なところ、多くの場合、WowzaのWebRTCストリーミング製品などを使用するのが最善の解決策です

電話から効率的にストリーミングするには、WowzaのGoCoder SDKを使用できますが、私の経験では、StreamGearsのようなより高度なSDKが最適です。


1

Kurento Media Serverを使用してWebRTC放送システムを開発しています。Kurentoは、RTSP、WebRTC、HLSなどの数種類のストリーミングプロトコルをサポートしています。リアルタイムとスケーリングの観点からも同様に機能します。

そのため、Kuretoは現在YouTubeまたはTwitchで使用されているRTMPをサポートしていません。私の問題の1つは、これと同時に使用しているユーザーの数です。

お役に立てば幸いです。


0

peer1はgetUserMedia()を呼び出すピアのみなので、peer1はルームを作成します。

  1. したがって、peer1はメディアをキャプチャし、部屋を開始します。
  2. peer2はルームに参加し、peer1からストリーム(データ)を取得し、「peer2-connection」という名前の並列接続を開きます
  3. peer3がルームに参加し、peer2からstream(data)を取得し、「peer3-connection」という名前の並列接続を開く場合など。

このプロセスは、多くのピアが相互に接続されると継続します。

したがって、これにより、帯域幅/ CPU使用率の問題なしに、単一のブロードキャストを無制限のユーザーに転送できます。

最後に、上記のすべてはLinkからの参照です。


1
このアプローチはすでに説明されていますが、実際には機能しない可能性があります。Peer3として、Peer2の帯域幅パフォーマンスを気にする必要があるのはなぜですか?もちろん、Peer2がチェーンを離れた場合、Peer3はPeer1にフォールバックする可能性がありますが、ストリームの中断、再接続などが大量に発生します。ええ、そうです、LANで動作するかもしれませんが、おそらくそれだけです。
igorpavlov

パラレルブロードキャストは帯域幅を処理しません。peer3からpeer1への接続がpeer2を介して確立され、peer2がフォールバックした場合、peer3はpeer1に接続されたままになります。
susan097

よくわかりません。私は実際にはリンクを参照していなかったので、ここで参照させてください。このリンクgithub.com/muaz-khan/WebRTC-Scalable-Broadcastの「How it works?」に画像があります。セクション。この画像は、Peer5が切断され、Peer8、9、および10がブロードキャストから切断されたとしましょう。Peer2またはPeer6に接続する必要がありますが、遅延が発生します。また、このプロジェクトには貢献者も活動もありません。
igorpavlov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.