WebRTC - 可扩展的直播流广播/多播

问题描述 投票:101回答:12

问题:

WebRTC为我们提供点对点视频/音频连接。它非常适合p2p通话,环聊。但是广播怎么样(一对多,例如,1到10000)?

假设我们有一个广播员“B”和两个参加者“A1”,“A2”。当然它似乎是可以解决的:我们只用B连接B,然后用A2连接B.因此B将视频/音频流直接发送到A1,将另一个流发送到A2。 B发送两次流。

现在让我们想象有10000名与会者:A1,A2,...,A10000。这意味着B必须发送10000个流。每个流约为40KB / s,这意味着B需要400MB / s的外出网速来维持这种广播。不能接受的。

原始问题(已废除)

是否有可能以某种方式解决这个问题,所以B只在某个服务器上发送一个流,而与会者只是从这个服务器中提取这个流?是的,这意味着此服务器上的传出速度必须很高,但我可以保持它。

或者这可能意味着毁掉WebRTC的想法?

笔记

根据最终客户的不良用户体验,Flash无法满足我的需求。

解决方案(不是真的)

26.05.2015 - 目前没有针对WebRTC的可扩展广播的解决方案,您根本不使用媒体服务器。市场上有服务器端解决方案以及混合(p2p +服务器端,具体取决于不同的条件)。

有一些有前途的技术,但像https://github.com/muaz-khan/WebRTC-Scalable-Broadcast,但他们需要回答这些可能的问题:延迟,整体网络连接稳定性,可扩展性公式(它们可能不是无限可扩展)。

几点建议

  1. 通过调整音频和视频编解码器来降低CPU /带宽;
  2. 获取媒体服务器。
javascript video webrtc scalability broadcast
12个回答
50
投票

由于这里几乎涵盖了这一点,因此无法使用普通的,老式的WebRTC(严格的点对点)来实现您在这里所要做的。因为如前所述,WebRTC连接重新协商加密密钥以加密每个会话的数据。因此,您的广播公司(B)确实需要像参加者一样多次上传其流。

但是,有一个非常简单的解决方案,它运行得很好:我测试过它,它被称为WebRTC网关。 Janus就是一个很好的例子。它是完全开源的(github repo here)。

其工作原理如下:您的广播公司联系了WebRTC的网关(Janus)。所以有一个关键的协商:B安全地(加密流)传输给Janus。

现在,当与会者连接时,他们再次连接到Janus:WebRTC协商,安全密钥等。从现在开始,Janus将向每个与会者发回流。

这很有效,因为广播公司(B)只将其流一次上传到Janus。现在,Janus使用自己的密钥对数据进行解码,并可以访问原始数据(即RTP数据包),并可以将这些数据包发回给每个与会者(Janus负责为您加密)。由于您将Janus放在服务器上,它具有很好的上传带宽,因此您可以流式传输到许多对等端。

所以是的,它确实涉及服务器,但该服务器会说WebRTC,并且您“拥有”它:您实现Janus部分,因此您不必担心数据损坏或中间人。当然,除非您的服务器受到损害。但是你可以做很多事情。

为了向您展示使用它是多么容易,在Janus中,您可以调用一个名为incoming_rtp()(和incoming_rtcp())的函数,它可以为您提供指向rt(c)p数据包的指针。然后,您可以将其发送给每个与会者(它们存储在Janus非常容易使用的sessions中)。 Look here for one implementation of the incoming_rtp() functiona couple of lines below你可以看到如何将数据包传输给所有与会者和here你可以看到实际的功能来中继rtp数据包。

这一切都很好,文档相当容易阅读和理解。我建议你从“回声”的例子开始,它是最简单的,你可以理解Janus的内部运作。我建议你编辑echo测试文件来制作你自己的,因为有很多冗余的代码要编写,所以你不妨从一个完整的文件开始。

玩得开心!希望我帮忙。


0
投票

由于peer1只是调用getUserMedia()的对等方,即peer1创建一个房间。

  1. 因此,peer1捕获媒体并开始发布空间。
  2. peer2加入会议室并从peer1获取流(数据),并打开名为“peer2-connection”的并行连接
  3. 当peer3加入会议室并从peer2获取流(数据)并打开名为'peer3-connection'的并行连接时,依此类推。

随着许多对等体彼此连接,此过程持续进行。

因此,通过这种方式,可以在无限制的用户上传输单个广播,而不会出现任何带宽/ CPU使用问题。

最后,以上所有内容均来自Link


0
投票

您正在描述使用具有一对多要求的WebRTC。 WebRTC专为点对点流媒体而设计,但有些配置可让您在向许多观众提供视频的同时,从WebRTC的低延迟中受益。

诀窍是不向每个观众征税流媒体客户端,就像你提到的那样,有一个“中继”媒体服务器。您可以自己构建,但老实说,最好的解决方案通常是使用像Wowza的WebRTC Streaming product这样的东西。

要从手机中高效流式传输,您可以使用Wowza的GoCoder SDK,但根据我的经验,像StreamGears这样的更高级的SDK效果最佳。


0
投票

我正在使用Kurento Media Server开发WebRTC广播系统。 Kurento支持多种流协议,如RTSP,WebRTC,HLS。它在实时和缩放方面也很有效。

因此,Kurento不支持现在在Youtube或Twitch中使用的RTMP。我的一个问题是用户并发的数量。

希望它有所帮助。


9
投票

正如@MuazKhan所说:

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

在Chrome中工作,还没有音频广播,但它似乎是第一个解决方案。

可扩展的WebRTC点对点广播演示。

该模块简单地初始化socket.io并以一种方式对其进行配置,即单个广播可以通过无限用户进行中继,而不会出现任何带宽/ CPU使用问题。一切都发生在点对点!

绝对可以完成。 其他人也能够实现这一目标:http://www.streamroot.io/


7
投票

AFAIK是目前唯一相关且成熟的实施方案,是Adobe Flash Player,自10.1版以来支持p2p多播用于点对点视频广播。

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


6
投票

互联网上无法实现“可扩展”广播,因为那里不允许进行IP UDP多播。但从理论上讲,它可以在局域网上实现。 Websockets的问题在于您无法通过设计访问RAW UDP,因此不允许这样做。 WebRTC的问题在于它的数据通道使用一种SRTP形式,其中每个会话都有自己的加密密钥。因此,除非有人“发明”或API允许在所有客户端之间共享一个会话密钥,否则多播是无用的。


5
投票

有同伴辅助交付的解决方案,这意味着该方法是混合的。服务器和对等方都帮助分发资源。这就是peer5.compeercdn.com采取的方法。

如果我们专门谈论直播,它看起来像这样:

  1. Broadcaster将实时视频发送到服务器。
  2. 服务器保存视频(通常还将其转码为所有相关格式)。
  3. 正在创建有关此实时流的元数据,与HLS或HDS或MPEG_DASH兼容
  4. 消费者浏览相关的直播流,玩家获取元数据并知道接下来要播放的视频块。
  5. 与此同时,消费者正在与其他消费者建立联系(通过WebRTC)
  6. 然后,播放器直接从服务器或从对等端下载相关的块。

遵循这样的模型可以节省高达服务器带宽的约90%,这取决于直播的比特率和观众的协作上行链路。

免责声明:作者正在Peer5工作


5
投票

我的主人专注于使用WebRTC开发混合cdn / p2p直播流协议。我在http://bem.tv发表了我的第一个成绩

一切都是开源的,我正在寻找贡献者! :-)


2
投票

Angel Genchev的答案似乎是正确的,然而,有一种理论架构,允许通过WebRTC进行低延迟广播。想象一下B(广播公司)流到A1(与会者1)。然后A2(与会者2)连接。 A1开始将从B接收的视频流传输到A2,而不是从B流式传输到A2。如果A1断开,则A2开始从B接收。

如果没有延迟和连接超时,此架构可以工作。所以理论上它是正确的,但不是实际的。

目前我正在使用服务器端解决方案。


2
投票

WebRTC可扩展解决方案市场上有一些解决方案。它们提供低延迟,可扩展的webrtc流。这是一些样本。 JanusJitsiWowzaRed5proAnt Media Server

我是Ant Media Server的开发人员,我们提供社区和企业版,包括android和iOS SDK。如果我们能以某种方式帮助您,请告诉我们。


1
投票

这个问题有几种解决方案。它提供低延迟和超低延迟。

检查这个medium post

要获得可扩展的超低延迟,您可以尝试使用ant media server

© www.soinside.com 2019 - 2024. All rights reserved.