热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

这么多流媒体服务器?你怎么技术选型?

在上一篇文章里我们介绍了我们介绍了MCU和SFU的优缺点,webRTC通信方案SFU和MCU的区别?下面就来探讨下常见的SFU开源解决方案,当然,你也可以自己实现SFU流媒体服务器



在上一篇文章里我们介绍了我们介绍了MCU和SFU的优缺点,webRTC通信方案SFU和MCU的区别?

下面就来探讨下常见的SFU开源解决方案,当然,你也可以自己实现 SFU 流媒体服务器,但自已实现流媒体服务器困难还是蛮多的,它里面至少要涉及到 DTLS 协议、ICE 协议、SRTP/SRTCP 协议等,光理解这些协议就要花不少的时间,更何况要实现它了。


前言

所以最常见的办法就是使用开源的实现。但是这里我也想给大家说一定,用了开源的解决方案,能快速的搭建起业务,但是无疑也欠下了技术债,因为开源的解决方案肯定没有自己实现的要熟悉,因为不熟悉很多时候出现了问题,并不能马上解决,甚至解决不了,导致业务受到影响。而且熟悉开源解决方案都是需要一个时间和过程的,而一般领导会不会给你这个时间就两说了。

但如果你要快速的搭建起音视频系统的话,无疑使用开源技术解决方案是最快,最能节省人力成本的。下面我们就来分析下常见的SFU开源解决方案的优缺点,以便你选择合适的开源解决方案。


Licode

Licode 既可以用作 SFU 类型的流媒体服务器,也可以用作 MCU 类型的流媒体服务器。一般情况下,它都被用于 SFU 类型的流媒体服务器。

Licode 不仅仅是一个流媒体通信服务器,而且还是一个包括了媒体通信层、业务层、用户管理等功能的完整系统,并且该系统还支持分布式部署。

Licode 是由 C++ 和 Node.js 语言实现。其中,媒体通信部分由 C++ 语言实现,而信令控制、用户管理、房间管理用 Node.js 实现。它的源码地址为:https://github.com/lynckia/licode 。下面这张图是 Licode 的整体架构图:

avatar

通过这张图你可以看出,Licode 从功能层面来讲分成三部分,即 Nuve 、ErizoController 和 ErizoAgent 三部分,它们之间通过消息队列进行通信。



  • Nuve 是一个 Web 服务,用于管理用户、房间、产生 token 以及房间的均衡负载等相关工作。它使用 MangoDB 存储房间和 token 信息,但不存储用户信息。

  • ErizoController,用于管理控制,信令和非音视频数据都通过它接收。它通过消息队列与 Nuve 进行通信,也就是说 Nuve 可以通过消息队列对 ErizoController 进行控制。

  • ErizoAgent,用于音视频流媒体数据的传输,可以分布式布署。ErizoAgent 与 ErizoController 的通信也是通过消息队列,信令消息通过 ErizoController 接收到后,再通过消息队列发给 ErizoAgent,从而实现对 ErizoAgent 进行控制。

Licode 不仅仅是一个 SFU 流媒体服务器,它还包括了与流媒体相关的业务管理系统、信令系统、流媒体服务器以及客户端 SDK 等等,可以说它是一个比较完善的产品。

如果你使用 Licode 作为流媒体服务器,基本上不需要做二次开发了,所以这样一套系统对于没有音视频积累的公司和个人具有非常大的诱惑力。目前 Intel CS 项目就是在 Licode 基础上研发出来的,已经为不少公司提供了服务。

官网提供学习demo,和文档。

但 Licode 也有以下一些缺点:



  • github star 2.4k issue和pr相当活跃,社区采用的是传统提问,及时沟通相对较差

  • 在 Linux 下目前只支持 Ubuntu 14.04 版本,在其他版本上很难编译通过。

  • Licode 不仅包括了 SFU,而且包括了 MCU,所以它的代码结构比较重,学习和掌握它要花不少的时间。

  • Licode 的性能一般, 如果你把流媒体服务器的性能排在第一位的话,那么 Licode 就不是特别理想的 SFU 流媒体服务器了。

  • 官方没有看到android和ios的SDK,有其他人实现,但是早已经不更新,如果你要考虑安卓和ios的话,可能自己会下功夫。


Janus-gateway

Janus 是一个非常有名的 WebRTC 流媒体服务器,它是以 Linux 风格编写的服务程序,采用 C 语言实现,支持 Linux/MacOS 下编译、部署,但不支持 Windows 环境。

它是一个开源项目,其源码的编译、安装非常简单,只要按 GitHub 上的说明操作即可。源码及编译手册的地址为:https://github.com/meetecho/janus-gateway 。

Janus 的部署也十分简单,具体步骤详见文档,地址为:https://janus.conf.meetecho.com/docs/deploy.html 。

avatar

从上面的架构图中,你可以看出 Janus 分为两层,即应用层和传输层。

插件层又称为应用层,每个应用都是一个插件,可以根据用户的需要动态地加载或卸载掉某个应用。插件式架构方案是非常棒的一种设计方案,灵活、易扩展、容错性强,尤其适用于业务比较复杂的业务,但缺点是实现复杂,成本比较高。

在 Janus 中默认支持的插件包括以下几个。



  • SIP:这个插件使得 Janus 成了 SIP 用户的代理,从而允许 WebRTC 终端在 SIP 服务器(如 Asterisk)上注册,并向 SIP 服务器发送或接收音视频流。

  • TextRoom:该插件使用 DataChannel 实现了一个文本聊天室应用。

  • Streaming:它允许 WebRTC 终端观看 / 收听由其他工具生成的预先录制的文件或媒体。

  • VideoRoom:它实现了视频会议的 SFU 服务,实际就是一个音 / 视频路由器。

  • VideoCall:这是一个简单的视频呼叫的应用,允许两个 WebRTC 终端相互通信,它与 WebRTC 官网的例子相似(https://apprtc.appspot.com),不同点是这个插件要经过服务端进行音视频流中转,而 WebRTC 官网的例子走的是 P2P 直连。

  • RecordPlay:该插件有两个功能,一是将发送给 WebRTC 的数据录制下来,二是可以通过 WebRTC 进行回放。

传输层包括媒体数据传输和信令传输。媒体数据传输层主要实现了 WebRTC 中需要有流媒体协议及其相关协议,如 DTLS 协议、ICE 协议、SDP 协议、RTP 协议、SRTP 协议、SCTP 协议等。

信令传输层用于处理 Janus 的各种信令,它支持的传输协议包括 HTTP/HTTPS、WebSocket/WebSockets、NanoMsg、MQTT、PfUnix、RabbitMQ。不过需要注意的是,有些协议是可以通过编译选项来控制是否安装的,也就是说这些协议并不是默认全部安装的。另外,Janus 所有信令的格式都是采用 Json 格式。

Janus 整体架构采用了插件的方案,这种架构方案非常优秀,用户可以根据自己的需要非常方便地在上面编写自己的应用程序。

而且它目前支持的功能非常多,比如支持 SIP、 RTSP、音视频文件播放、录制等等,所以在与其他系统的融合性上有非常大的优势。

另外,它底层的代码是由 C 语言编写的,性能也非常强劲。Janus 的开发、部署手册也非常完善,因此它是一个非常棒的开源项目。

github star4.1k,并且处理issue和pr相对较快。

官方提供安卓和ios的sdk。

缺点:



  • 架构太复杂,不适合初学者,公司采用的话人力成本和事件成本会比较高

  • janus 底层没有使用 epoll 这类异步I/O事件处理机制,这应该说是它的一大缺陷

  • Janus还使用 glib 库,由于 glib 库对于国内的很多开发同学来说用的比较少,所以会有一定的学习成本


Mediasoup

Mediasoup 是推出时间不长的 WebRTC 流媒体服务器开源库,其地址为:https://github.com/versatica/mediasoup/ 。

Mediasoup 由应用层和数据处理层组成。应用层是通过 Node.js 实现的;数据处理层由 C++ 语言实现,包括 DTLS 协议实现、ICE 协议实现、SRTP/SRTCP 协议实现、路由转发等。

avatar

Mediasoup 把每个实例称为一个 Worker,在 Worker 内部有多个 Router,每个 Router 相当于一个房间。在每个房间里可以有多个用户或称为参与人,每个参与人在 Mediasoup 中由一个 Transport 代理。换句话说,对于房间(Router)来说,Transport 就相当于一个用户。

Transport 有三种类型,即 WebRtcTransport、PlainRtpTransport 和 PipeTransport。



  • WebRtcTransport 用于与 WebRTC 类型的客户端进行连接,如浏览器。

  • PlainRtpTransport 用于与传统的 RTP 类型的客户端连接,通过该 Transport 可以播放多媒体文件、FFmpeg 的推流等。

  • PipeTransport 用于 Router 之间的连接,也就是一个房间中的音视频流通过 PipeTransport 传到另一个房间。

在每个 Transport 中可以包括多个 Producer 和 Consumer。



  • Producer 表示媒体流的共享者,它又分为两种类型,即音频的共享者和视频的共享者。

  • Consumer 表示媒体流的消费者,它也分为两种类型,即音频的消费者和视频的消费者。

Mediasoup 的实现逻辑非常清晰,它不关心上层应用该如何做,只关心底层数据的传输,并将它做到极致。

Mediasoup 底层使用 C++ 开发,使用 libuv 作为其异步 IO 事件处理库,所以保证了其性能的高效性。同时它支持了几乎所有 WebRTC 为了实时传输做的各种优化,所以说它是一个特别优秀的 WebRTC SFU 流媒体服务器。

它与 Janus 相比,它更聚焦于数据传输的实时性、高效性、简洁性,而 Janus 相比 Mediasoup 做的事儿更多,架构和逻辑也更加复杂。

对于开发能力比较强的公司来说,根据自己的业务需要在 Mediasoup 上做二次开发也是非常值得推荐的技术方案。

手机端的话需要自己实现安卓和ios的SDK


Medooze

Medooze 是一款综合流媒体服务器,它不仅支持 WebRTC 协议栈,还支持很多其他协议,如 RTP、RTMP 等。其源码地址为:https://github.com/medooze/media-server

avatar

从大的方面来讲,Medooze 支持 RTP/RTCP、SRTP/SRCP 等相关协议,从而可以实现与 WebRTC 终端进行互联。除此之外,Medooze 还可以接入 RTP 流、RTMP 流等,因此你可以使用 GStreamer/FFmpeg 向 Medooze 推流,这样进入到同一个房间的其他 WebRTC 终端就可以看到 / 听到由 GStream/FFmpeg 推送上来的音视频流了。另外,Medooze 还支持录制功能,即上图中的 Recorder 模块的作用,可以通过它将房间内的音视频流录制下来,以便后期回放。

Medooze 的控制逻辑层是通过 Node.js 实现的,Medooze 通过 Node.js 对外提供了完整的控制逻辑操作相关的 API,通过这些 API 你可以很容易的控制 Medooze 的行为了。

Medooze 与 Mediasoup 相比,两者在核心层实现的功能都差不多,但 Medooze 的功能更强大,包括了录制、推 RTMP 流、播放 FLV 文件等相关的操作,而 Mediasoup 则没有这些功能。

Medooze 也有一些缺点,尽管 Medooze 也是 C++ 开发的流媒体服务务器,使用了异步 IO 事件处理机制,但它使用的异步 IO 事件处理的 API 是 poll,poll 在处理异步 IO 事件时,与 Linux 下最强劲的异步 IO 事件 API epoll 相比要逊色不少,这导致它在接收 / 发送音视频包时性能比 Mediasoup 要稍差一些。


jitsi

使用Java构建的服务端,底层也是使用c/c++,使用Java语言所以性能上没有使用c/c++的表现好。

主要模块及实现语言:



  1. Jitsi Video-Bridge (Software video-bridge 实现语言java)

  2. Jitsi Jicofo (Component mandatory for jitsi conference 实现语言java)

  3. Prosody ( XMPP Server 实现语言lua)

  4. Nginx (Web Server)

  5. Jitsi Meet (Web application – to which the end user will interact. 实现语言js)

优点:



  • github star12.3k,issue和pr处理快

  • 文档齐全

  • 官方提供安卓和ios SDK,也可以自行编译SDK,使用的是React Native

  • 官方提供web端的SDK,并提供使用electron进行桌面端打包(端很齐全)

  • 社区采用论坛方式沟通,活跃较高

  • 社区提供分布式解决方案,但是文档偏少。

  • 每周一维护团队在jitsi上进行视频会议,回答开发者的提问,沟通使用英文,国内时间好像是晚上。

  • 社区版本更新迭代较快


Kurento

Kurento和jitsi是一样,持续维护了很多年,经过了时间的检验。不同的是他是使用c++开发,有丰富的文档和示例裤,对于开发者来说非常友好。


pion/webrtc

WebRTC API的Pure Go实现,github上star4.7k,目前用的人较少,不建议使用生成环境,可以学习参考使用,建议长期关注。


总结:

对流媒体服务器的选择,没有最好,只有最合适。每个开源实现都有其各自的特点,都可以应用到实际产品中,只不过作为开发人员都有自己独特的技术背景,你需要根据自身特点以及项目特点选一个最合适的。接下来,我就介绍一下我是如何对这些开源项目进行评判和选择的。



  1. 团队

    在一个团队中肯定会选择一种大家都比较熟悉的语言作为项目开发的语言,所以我们在选择开源项目时,就要选择使用这种语言开发的开源项目。

    比如阿里系基本都用 Java 语言进行开发,所以它们在选择开源项目时,基本都会选择 Java 开发的开源项目;

    而做音视频流媒体服务的开发人员,为了追求性能,所以一般都选择 C/C++ 语言开发的开源项目。

    团队人手如果不充裕的情况下,尽量就不要选择特别复杂的,和文档比较少的开源技术。



  2. 适合业务

    要充分考虑到你的业务的用户量和用户群体,如果你的业务量很大,需要做分布式,那么你选择的开源技术一定要先去了解下他是否支持分布式部署,分布式部署采用那种方式。单机支持多少并发,最好自己用服务器实际测试下,官方数据会和实际测试数据多少都有出入。

    项目功能也需要考虑,比如业务需要录制回放,开源技术并没有这样的功能,需要自己开发,时间成本很高,但选择已经做好录制回放功能的开源技术又不一样了。



  3. 二次开发

    Licode 是一个完整的系统,支持分布式集群部署,所以系统相对复杂,学习周期要长一些。它可以直接布署在生产环境,但是二次开发的灵活性不够。

    Janus-gateway 是一个独立的服务,支持的信令协议很丰富,而且支持插件开发,易扩展,对于 Linux/C 背景的开发者是很不错的选择。

    Medooze 和 Mediasoup 都是流媒体服务器库,对于需要将流媒体服务器集成到自己产品中的开发者来说,应该选择它们。



  4. 时间成本

    公司对于项目的时间计划和成本也要考量,因为使用开源技术或多或少都会遇到坑,有可能一个坑会卡很久,所以使用文档全,社区活跃的开源技术比较好。



无论选择哪种开源技术,前期一定要做好调研,并实际自己搭建使用过在做决定,选择好后,为了弥补技术债,需要去深入开源技术的代码,不然还债的时候很疼苦。



推荐阅读
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Python开源库和第三方包的常用框架及库
    本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
支着儿traister_107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有