一文了解 Kurento:开源WebRTC流媒体服务器

本文用简单的语言为商务人士和对技术不感兴趣的人介绍 Kurento。

想象一下,一位程序员找到你,说他需要一个媒体服务器用于开发,并推荐你使用 Kurento。你怎么知道这是否是最佳选择?有很多信息,但消化起来可能会很困难,因为这些都是深层次的技术问题。

我们将尽力提供足够的信息,以便你决定是否在视频应用程序中使用 Kurento。我们将告诉你媒体服务器的重要性、许可证、架构、使用 Kurento 开发的主要功能(即模块)。最后,我们将总结何时最好使用 Kurento 等底层媒体服务器,何时最好使用开箱即用的解决方案。

WebRTC 以及我们为什么需要媒体服务器

Kurento 是一个开源 WebRTC 流媒体服务器,内置许多视频会议模块,以 Apache 许可发布。WebRTC 是一种标准化、低延迟、实时、浏览器到浏览器的传输方式,无需第三方插件或扩展。WebRTC 是一种完全的客户端技术,为什么我们需要媒体服务器呢?

主要原因是大量参与者给客户端带来的负担。参与者之间的连接数会呈指数增长,同时视频质量会下降,流量和系统资源的负荷也会增加。根据我们的经验,WebRTC 可用作 2-6 人之间的普通点对点通信,但如果有更多参与者,则使用媒体服务器更有意义。此外,如果我们需要将视频录像保存到单独的文件中,或以某种方式对其进行即时处理,也会遇到困难,因为所有工作都在客户端上进行。

Kurento 简史

Kurento 于 2010 年在马德里开发,是一个独立的开源项目。Kurento 使用的主要语言是 C++,这有助于优化系统资源。

该媒体服务器在 GitHub 上有 3000 多颗星,还有几百个分叉,它们是由社区支持的该项目的独立分支。

目前,Kurento 开发团队已加入 Twilio,Kurento 本身也有一些小版本和小补丁,但从文章《2023 年 WebRTC 100 大开源项目》的调查显示 Kurento 自 2022 年末起不再活跃。

Kurento 的许可证 Apache

Kurento 采用 Apache 许可证发布。它为开发者提供了使用代码的绝对自由。您只需说明您所做的更改以及第一作者是谁。

采用 Apache 许可证的软件产品可用于商业产品。您可以在您的产品中免费使用 Kurento,并从这些产品中获得收入。无需支付任何费用。

Kurento 架构: MCU 和 SFU

有两种主要的媒体服务器架构: MCU 和 SFU。

MCU(多点会议单元)是一种拼贴式视频架构。我们有多个用户流,这些用户流组成一个无缝大画面,每个项目的位置保持不变。MCU 从每个与会者那里获取一个输出视频流,然后由媒体服务器将所有视频流以固定的布局拼接成一个整体。因此,尽管会议有许多与会者,但每个客户端只接收一个输入流。这样可以节省客户端的 CPU 资源和流量消耗,但却增加了服务器本身的负载,并限制了视频聊天布局定制的可能性。使用 MCU,我们无法准确判断视频中的参与者。混合视频流需要大量的处理能力,增加了服务器的维护成本。这种架构主要适用于与会者人数较多(大于 40 人)的会议。如果需要通过服务器上的处理在手机等弱设备上获取视频流,MCU 也是一个不错的解决方案。

SFU(选择性转发单元)是现代 WebRTC 解决方案中的一种流行架构,它允许视频会议客户端只接收当前需要的视频流。SFU 更像是一个马赛克,你必须自己组装元素,但组装顺序由你决定。在 SFU 中,每个与会者都会向服务器发送自己的视频流,但其他视频流是单独发送的。这种架构能更好地分配服务器和客户端之间的负载,并能完全控制视频聊天界面的实现。与 MCU 不同,使用 SFU 的服务器无需对接收到的数据流进行解码和转码。这有助于大大减轻服务器 CPU 的负荷。由于 SFU 能够根据流的数量动态扩展系统,因此非常适合广播(一对多或单人流)。同时,这种类型的服务器需要更多的服务器带宽,因为它必须向客户端提供更多的流。

让我们以四人视频会议为例,比较这两种类型。

在客户端:

一文了解 Kurento:开源WebRTC流媒体服务器

在服务器上:

一文了解 Kurento:开源WebRTC流媒体服务器

还有一些系统采用混合架构,根据当前的用户数量和特定客户端的需求实现最佳效果。例如,如果客户端是一个弱小的移动设备,它可以像 MCU 那样从媒体服务器接收单一的数据流。另一方面,浏览器用户将分别接收数据流,在这种情况下,有可能像 SFU 那样实现独特的元素网格化方式。另一种情况是与 SIP 设备(主要是 IP 电话)交互,在这种情况下只支持 MCU。当参与人数达到一定阈值时,一些混合系统可能会从 SFU 快速切换到 MCU。red5pro 的 XDN(体验交付网络)架构使用云技术来解决 WebRTC 的扩展问题。它的集群由不同类型的节点组成。其中包括源节点、中继节点和边缘节点。在这种拓扑结构中,任何源节点都会接收传入的数据流,并与多个边缘节点交换数据,以支持成千上万的参与者。在规模较大的情况下,源节点可以将数据流传递给中继节点,中继节点再将数据流传递给多个边缘节点,从而进一步扩大集群规模。

Kurento 允许这两种类型,默认情况下使用 SFU。MCU 架构可使用合成器元素实现。你可以混合使用 SFU 和 MCU,以获得混合类型。Kurento 默认使用 SFU。

Kurento 主要模块和功能说明

什么是模块:Kurento 设计的主要原则

Kurento 包含多个基本模块,不仅适用于 WebRTC,还适用于视频录制、计算机视觉和 AR 滤镜。如果想直接使用普通 WebRTC 而不使用额外的封装器,媒体服务器将是一个不错的选择。如果您想将视频聊天与原生 Android 和 iOS 应用程序集成,媒体服务器也会非常有用。Kurento 不包含信令机制,您可以根据自己的项目需求选择最适合自己的机制,如 WebSockets 或其他。由于 Kurento 是一个开源项目,这大大降低了使用媒体服务器的成本。

与现成的付费媒体服务器不同,Kurento 是一个相当低级的解决方案,允许你自定义管道中模块的交互。此外,与 Jitsi 等盒装解决方案和现成接口不同,Kurento 可以更容易地选择和实现你想要的接口。当然,你也可以编写自己的模块,扩展标准媒体服务器的功能。Kurento 架构设计的基础是模块化,每个媒体元素都是一个程序块,可以执行特定任务并与其他元素交互。用 Kurento 的行话来说,开发人员称之为媒体管道(Media Pipeline)和媒体元素(Media Elements)。媒体元素只是管道中相互连接的模块。但请注意,管道的拓扑结构由开发人员选择,并不一定是元素的线性序列。

现在我们来谈谈主要模块。

WebRTC 视频会议

Kurento 视频会议的基础是 WebRtcEndpoint。利用它,我们可以传输 WebRTC 流,并在单个管道中将它们互连起来。在视频会议中,管道通常被视为一个与其他类似房间隔离的房间。在这种情况下,WebRtcEndpoint 就是想要播放自己视频或观看他人视频的用户。

录制视频和音频

媒体服务器使用 RecorderEndpoint 进行录制。我们可以将 WebRTC 流连接到录制器,录制器会将结果录制到文件系统中。连接并启动视频后,只需调用记录器的 Kurento API 方法 “record “即可。我们可以在录制时指定限制条件:例如,我们可以只录制音频或视频。

播放第三方媒体

Kurento 内置的 PlayerEndpoint 模块允许您播放第三方音频和视频文件以及 RTMP 和 RTSP 流。这意味着您可以添加来自 IP 摄像机的流媒体,并将其广播给视频会议的其他与会者。您可以使用播放器为用户播放音乐,这对音乐平台、在线培训甚至文本到语音都很有帮助。由于管道的灵活性,不仅可以向所有与会者播放媒体,还可以根据需要向特定用户播放媒体。您只需创建一个新的播放器端点(PlayerEndpoint),并使用连接方法将其连接到所需的 WebRtcEndpoint 即可。一旦需要播放媒体文件,只需调用播放器的播放方法即可。

计算机视觉和过滤器

媒体服务器允许你使用许多过滤器。例如,ZBarFilter 可用于识别二维码;FaceOverlayFilter 可识别视频流中的人脸并实时突出显示。有了 GStreamerFilter,你还可以创建自己的自定义过滤器。此外,Kurento 还有几个实验性模块,包括单独安装的过滤器。kms-crowddetector 可以检测人群,kms-platedetector 可以检测车牌号。

不支持不同分辨率的多流媒体

不支持 Simulcast(以不同质量发送同一数据流的多个副本)和 SVC(以低质量发送数据流,并可在需要时添加附加层以提高质量)。

有一个解决方案。您可以创建多个流,请求不同分辨率的视频。根据数据包丢失情况在视频流之间进行切换。不过,这种解决方案并不理想,因为它会给服务器带来巨大的负载。所以我们还是实话实说吧:没有一种解决方案本身是好的。

Kurento 的编解码器支持

为了通过网络传输流媒体,计算机需要使用编解码器。编解码器是可以执行数据或信号编码的程序。它们能将视频或音频压缩到可接受的大小,以便进行网络流媒体播放和回放。

Kurento Media Server 支持 H.264、VP8/9 等视频编解码器和 OPUS 等音频编解码器。它们可在保持高质量的同时实现视频流的高度压缩。这些编解码器是当前的 WebRTC 标准。不支持 AV1 和 H.265。这些都是最新的标准,可以降低比特率以获得与旧标准相同的质量。媒体服务器本身会将接收到的视频流压缩到与客户端当时带宽相匹配的质量,如有必要,还会将视频流转码为客户端需要的编解码器。

API、文档、Typescript 支持

Kurento API 可通过 kurento-client 库和各种附加库(如 kurento-utils)访问。您可以在 Kurento 官方网站上找到详细的文档,包括每个模块的说明以及 Java 和 Javascript 的使用示例。该网站不仅提供媒体服务器本身的信息,还提供相关 WebRTC 主题的信息,例如配置 TURN(使用中继 NAT 的遍历)服务器,这是绕过对称 NAT 后面用户的通信限制所必需的。通过 TURN 协议,您可以获得在 NAT 限制下建立 WebRTC 连接所需的 IP 地址和端口。对称 NAT 还能防止传输数据被篡改。对称 NAT 表还会存储 2 个参数–远程主机的 IP 和端口。来自外部网络的数据包会因为源数据与表中记录的数据不匹配而被丢弃。客户端库支持 Typescript 类型。

OpenVidu

OpenVidu 框架是在 Kurento 的基础上设计的,如果你不需要简单的视频会议以外的其他功能,该框架可以简化开发。无需使用服务器与框架通信,只需连接客户端库即可。该库为所有流行的前端框架以及 Android 和 iOS 提供了许多封装程序。

OpenVidu是一款免费解决方案,但也有付费版本,可为监控和扩展 WebRTC 平台提供额外功能。未来还计划提供 Simulcast 和 SVC 功能,以及在 1-1 情况下自动切换到 P2P 会话的功能。

视频会议的参与人数

Kurento 开发人员有自己的基准来确定一台机器上的最大会话数。虽然它最初是为 OpenVidu 设计的,但也适用于 Kurento。下面是 AWS 上不同机器的表格。

一文了解 Kurento:开源WebRTC流媒体服务器

例如,一个拥有两个 CPU 内核和 4 GB 内存的 AWS c5.large 实例可以处理 4 个有 7 名与会者的群组会议。在每次会议中,用户都会显示和观看彼此的流媒体(多对多)。

总结:什么时候适合用Kurento?

  • 视频会议平台
  • 与 AR 集成
  • 用于视频录制
  • 为与会者播放媒体文件
  • 用于纯 RTP,例如直播流媒体。

Kurento 是一个底层媒体服务器。如果使用 Kurento,开发时间可能会比开箱即用的解决方案长一些。如果你的开发人员不是专门从事 Kurento 开发的话,就会出现这种情况。

不过,Kurento 允许您实现任何想要的功能。在现成的解决方案中,经常会出现这样的情况:客户要求创建其他功能,但该功能不支持。

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/webrtc/34145.html

(0)

相关推荐

发表回复

登录后才能评论