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

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

問題:

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

放送者「B」と 2 人の出席者「A1」、「A2」がいるとします。もちろん、これは解決できそうです。B を A1 に接続し、次に B を A2 に接続するだけです。すると、B はビデオ/オーディオ ストリームを直接 A1 に送信し、別のストリームを A2 に送信します。B はストリームを 2 回送信します。

ここで、参加者が 10,000 人 (A1、A2、...、A10,000) いると仮定します。つまり、B は 10,000 ストリームを送信する必要があります。各ストリームは ~40KB/s なので、このブロードキャストを維持するために、B は 400MB/s の送信インターネット速度を必要とします。これは許容できません。

元の質問(廃止)

これを何とか解決して、B がいずれかのサーバーに 1 つのストリームのみを送信し、参加者はこのサーバーからこのストリームをプルするだけでよいのでしょうか? はい、これはこのサーバーの送信速度が高くなければならないことを意味しますが、それを維持することは可能です。

それとも、これは WebRTC のアイデアを台無しにすることを意味するのでしょうか?

ノート

エンド カスタマーの UX が貧弱であるため、Flash は私のニーズを満たしていません。

解決策(実際はそうではない)

2015 年 5 月 26 日 - 現時点では、メディア サーバーをまったく使用しない WebRTC のスケーラブルなブロードキャストのソリューションはありません。市場には、サーバー側のソリューションとハイブリッド (さまざまな条件に応じて P2P + サーバー側) があります。

有望な技術もいくつかあるが、https://github.com/muaz-khan/WebRTC-スケーラブル-ブロードキャストしかし、レイテンシ、全体的なネットワーク接続の安定性、スケーラビリティの式(おそらく無限にスケーラブルではない)などの考えられる問題に答える必要があります。

提案

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

ベストアンサー1

ここでかなり説明されているように、ここでやろうとしていることは、単純な旧式の WebRTC (厳密にはピアツーピア) では不可能です。前に述べたように、WebRTC 接続はセッションごとにデータを暗号化するために暗号化キーを再ネゴシエートするためです。そのため、ブロードキャスター (B) は、参加者の数だけストリームをアップロードする必要があります。

ただし、非常にシンプルでうまく機能する解決策があります。私はそれをテストしましたが、それは WebRTC ゲートウェイと呼ばれます。ヤヌスは良い例です。完全にオープンソースです(githubリポジトリはこちら)。

これは次のように機能します。放送局がゲートウェイ(Janus)に接続します。WebRTCを話すつまり、鍵のネゴシエーションが行われ、B は安全に (暗号化されたストリームを) Janus に送信します。

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

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

そう、それはするサーバーが関係しますが、そのサーバーは WebRTC に対応しており、それを「所有」します。Janus 部分を実装するので、データの破損や中間者攻撃を心配する必要はありません。もちろん、サーバーが侵害されない限りは。しかし、できることはたくさんあります。

incoming_rtp()使い方が簡単であることを示すために、Janus には、と呼ばれる関数がありincoming_rtcp()、これを呼び出すと、rt(c)p パケットへのポインターが提供されます。その後、各出席者にそれを送信できます (それらはsessionsJanus で非常に使いやすくなっている に格納されています)。incoming_rtp()関数の実装例についてはこちらをご覧ください数行下パケットをすべての出席者に送信する方法を確認できます。ここRTP パケットを中継する実際の機能を確認できます。

すべてうまく機能し、ドキュメントも読みやすく理解しやすいです。「echotest」の例から始めることをお勧めします。これは最もシンプルで、Janus の内部動作を理解できます。echo test ファイルを編集して独自のファイルを作成することをお勧めします。冗長なコードが多数記述されるため、完全なファイルから始める方がよいでしょう。

楽しんでください!お役に立てれば幸いです。

おすすめ記事