web-dev-qa-db-ja.com

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

問題:

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のアイデアを台無しにすることを意味するのでしょうか?

[〜#〜] notes [〜#〜]

エンドユーザーのUXが低いため、Flashは私のニーズに対応していません。

解決策(実際にはない)

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

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

[〜#〜] suggestions [〜#〜]

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

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

ただし、非常に単純なソリューションがあり、非常にうまく機能します。WebRTCゲートウェイと呼ばれるテスト済みです。 ヤヌス は良い例です。完全にオープンソースです( github repo here )。

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

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

これは、ブロードキャスター(B)がストリームをJanusに一度しかアップロードしないため、うまく機能します。これで、Janusは独自のキーを使用してデータをデコードし、生データ(RTPパケット)にアクセスし、それらのパケットを各参加者に送り返すことができます(Janusが暗号化を処理します)また、Janusをサーバーに配置すると、アップロード帯域幅が大きくなるため、多くのピアにストリーミングできます。

そのため、はい、それはdoesサーバーを含みますが、そのサーバーはWebRTCを話し、あなたはそれを「所有」します。データの破損や中間者を心配する必要があります。もちろん、サーバーが危険にさらされない限り。しかし、できることはたくさんあります。

使い方が簡単であることを示すため、Janusにはincoming_rtp()(およびincoming_rtcp())という関数を呼び出して呼び出すことができ、rt(c )pパケット。その後、それを各出席者に送信できます(これらはsessionsに保存され、Janusが非常に使いやすくなっています)。 incoming_rtp()関数の実装の1つをご覧ください以下の2、3行 すべての出席者にパケットを送信する方法がわかります こちら rtpパケットを中継する実際の機能を見ることができます。

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

楽しんで!お役に立てば幸いです。

50
nschoe

@MuazKhanが上記のように:

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

クロムで動作し、音声放送はまだありませんが、それは最初の解決策のようです。

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

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

enter image description here

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

9
rubo77

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

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

7
Tom

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

6
Angel Genchev

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

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

5
flavioribeiro

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

ライブブロードキャストについて具体的に説明している場合、次のようになります。

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

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

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

5
shacharz

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

このアーキテクチャは、待ち時間や接続タイムアウトがない場合に機能します。理論的には正しいですが、実際にはそうではありません。

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

2
igorpavlov

WebRTCスケーラブルソリューションの市場には、いくつかのソリューションがあります。低遅延でスケーラブルなwebrtcストリーミングを提供します。以下にサンプルを示します。 JanusJitsiWowzaRed5proAnt Media Server

私は Ant Media Server の開発者です。AndroidおよびiOS SDKも含めて、コミュニティエディションとエンタープライズエディションの両方を提供しています。

2
faraway

この問題にはいくつかの解決策があります。低レイテンシと超低レイテンシの両方を提供します。

これを確認してください 中程度の投稿

スケーラブルな超低レイテンシを実現するには、 ant media server

1
faraway

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

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

お役に立てば幸いです。

0
imalice

Peer1はgetUserMedia()を呼び出すピアのみであるため、つまりpeer1はルームを作成します。

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

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

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

最後に、含まれている上記のすべては Link からの参照です。

0
susan097

1対多の要件でWebRTCを使用して説明しています。 WebRTCはピアツーピアストリーミング用に設計されていますが、多くの視聴者にビデオを配信しながらWebRTCの低遅延の恩恵を受けることができる構成があります。

トリックは、すべての視聴者にストリーミングクライアントに負担をかけず、前述のように「リレー」メディアサーバーを用意することです。これは自分で作成できますが、正直なところ、Wowzaの WebRTC Streaming product のようなものを使用することが最善の解決策です。

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

0
videoking