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

IT技术 javascript video webrtc scalability broadcast
2021-03-08 10:51:55

问题:

WebRTC 为我们提供了点对点的视频/音频连接。它非常适合 p2p 通话、环聊。但是广播呢(一对多,例如,1-to-10000)呢?

假设我们有一个广播公司“B”和两个与会者“A1”、“A2”。当然它似乎是可以解决的:我们只需将 B 与 A1 连接,然后将 B 与 A2 连接。因此 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. 获取媒体服务器。
6个回答

由于这里几乎涵盖了所有内容,因此您在这里尝试做的事情对于普通的老式 WebRTC(严格的点对点)是不可能的。因为如前所述,WebRTC 连接会为每个会话重新协商加密密钥以加密数据。因此,您的广播公司 (B) 确实需要根据与会者的数量上传其流。

但是,有一个非常简单的解决方案,效果很好:我已经对其进行了测试,它称为 WebRTC 网关。Janus就是一个很好的例子。它是完全开源的(这里github repo)。

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

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

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

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

为了向您展示它的易用性,在 Janus 中,您有一个名为incoming_rtp()(and incoming_rtcp())的函数,您可以调用它,它为您提供一个指向 rt(c)p 数据包的指针。然后,您可以将其发送给每位与会者(它们存储在sessionsJanus 中,非常易于使用)。在这里寻找一个实现的incoming_rtp()功能一对夫妇低于行的,你可以看到如何将数据包发送给所有与会者,并在这里你可以看到实际的功能中继的RTP包。

一切都很好,文档相当容易阅读和理解。我建议您从“echotest”示例开始,它是最简单的,您可以了解 Janus 的内部工作原理。建议你编辑一下echo test文件,制作自己的,因为有很多多余的代码要写,所以不妨从一个完整的文件开始。

玩得开心!希望我有所帮助。

说这在当前 Safari 中不起作用(或任何不支持 WebRTC 的浏览器?)是真的吗?有谁知道一种混合解决方案,您使用 WebRTC 从浏览器广播到服务器,然后将视频转码为 HLS/HDS(甚至 RTMP)以适应传统的广播系统?
2021-04-23 10:51:55
您实际上是在解释 SFU(选择性转发单元)的工作原理。你可以用mediasoup做同样的事情
2021-04-29 10:51:55
对jitsi有什么想法吗?jitisi 也一样吗?
2021-05-08 10:51:55
@nschoe 这比使用 websocket 做同样的事情更好吗?
2021-05-12 10:51:55
@Ben 是的,它不适用于不支持 WebRTC 的浏览器。回到过去(当我写这篇文章的时候)Safari 显然不支持这个。然而今天我没有检查。但我仍然认为他们不支持 WebRTC(不过有待确认)。至于在混合系统中使用它,这是完全可能的,实际上这是我为我工作的公司所做的;正如您所说,我从浏览器向服务器广播,然后从那里构建并插入 GStreamer 管道来对提要进行转码。您也可以这样做!
2021-05-18 10:51:55

正如@MuazKhan 上面提到的:

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

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

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

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

在此处输入图片说明

这绝对是可以完成的。
其他人也可以做到这一点:http : //www.streamroot.io/

另外,Streamroot 是否类似于 Peer5?
2021-05-14 10:51:55
这些东西对我来说似乎有点过时了。关于这个想法的任何更新或想法?
2021-05-17 10:51:55
此外,它是否解决了延迟问题?例如,Peer1 与 Peer5 对话,Peer2 最终失去连接。还是这种架构仅适用于 LAN?
2021-05-17 10:51:55

AFAIK 目前唯一相关且成熟的实现是 Adob​​e Flash Player,它从 10.1 版开始支持对等视频广播的 p2p 多播。

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

人们不会杀死技术。该技术通过提供非常糟糕的用户体验来杀死自己,尤其是在允许使用麦克风/摄像头时。这就是 getusermedia 获胜的地方。
2021-05-06 10:51:55
除了糟糕的用户体验,这会是解决方案吗?服务器少?
2021-05-16 10:51:55

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

但是聊天已经可以与 WebRTC 一起使用了,所以每个人都能看到每条消息,所以一对多也应该以某种方式适用于视频
2021-04-28 10:51:55
@rubo77 与视频流发送的数据速率和数据量相比,通过文本消息发送的数据根本不算什么。所以聊天可以很容易地一次包含更多的用户
2021-05-18 10:51:55

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

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

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

根据实时流的比特率和观众的协作上行链路,遵循这样的模型可以节省高达约 90% 的服务器带宽。

免责声明:作者在 Peer5 工作

谢谢你。我确实了解 peer5 并发现它是一个非常有吸引力的解决方案。然而,这个问题的目的是找到一个绝对无服务器的解决方案(只允许 STUN/TURN)。
2021-04-27 10:51:55