范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

WebRTC学习笔记三MeshSFU开源实现方案

  一、Mesh方案
  即多个终端之间两两进行连接,形成一个网状结构。比如 A、B、C 三个终端进行多对多通信,当 A 想要共享媒体(比如音频、视频)时,它需要分别向 B 和 C 发送数据。同样的道理,B 想要共享媒体,就需要分别向 A、C 发送数据,依次类推。这种方案对各终端的带宽要求比较高。
  当某个浏览器想要共享它的音视频流时,它会将共享的媒体流分别发送给其他 3 个浏览器,这样就实现了多人通信。 1.优势:不需要服务器中转数据,STUN/TUTN 只是负责 NAT 穿越,这样利用现有 WebRTC 通信模型就可以实现,而不需要开发媒体服务器。 充分利用了客户端的带宽资源。 节省了服务器资源,由于服务器带宽往往是专线,价格昂贵,这种方案可以很好地控制成本。 2.劣势:共享端共享媒体流的时候,需要给每一个参与人都转发一份媒体流,这样对上行带宽的占用很大。参与人越多,占用的带宽就越大。除此之外,对 CPU、Memory 等资源也是极大的考验。一般来说,客户端的机器资源、带宽资源往往是有限的,资源占用和参与人数是线性相关的。这样导致多人通信的规模非常有限,通过实践来看,这种方案在 超过 4 个人时,就会有非常大的问题 。 另一方面,在多人通信时,如果有部分人不能实现 NAT 穿越,但还想让这些人与其他人互通,就显得很麻烦,需要做出更多的可靠性设计。 二、MCU 方案(MultiPoint Control Unit)
  MCU 主要的处理逻辑是:接收每个共享端的音视频流,经过解码、与其他解码后的音视频进行混流、重新编码,之后再将混好的音视频流发送给房间里的所有人,也叫Mixer模式。
  MCU 技术在视频会议领域出现得非常早,目前技术也非常成熟,主要用在硬件视频会议领域。不过我们今天讨论的是软件 MCU,它与硬件 MCU 的模型是一致的,只不过一个是通过硬件实现的,另一个是通过软件实现的罢了。MCU 方案的模型是一个星形结构,如下图所示:
  我们来假设一个条件,B1 与 B2 同时共享音视频流,它们首先将流推送给 MCU 服务器,MCU 服务器收到两路流后,分别将两路流进行解码,之后将解码后的两路流进行混流,然后再编码,编码后的流数据再分发给 B3 和 B4。
  对于 B1 来说,因为它是其中的一个共享者,所以 MCU 给它推的是没有混合它的共享流的媒体流,在这个例子中就是直接推 B2 的流给它。同理,对于 B2 来说 MCU 给它发的是 B1 的共享流。但如果有更多的人共享音视频流,那情况就更加复杂。
  【腾讯文档】FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高级开发-资料领取:FFmpegWebRTCRTMPRTSPHLSRTP鎾斁鍣�-闊宠棰戞祦濯掍綋楂樼骇寮€鍙�-璧勬枡棰嗗彇
  MCU 主要的处理逻辑如下图所示:
  接收共享端发送的音视频流。 将接收到的音视频流进行解码。 对于视频流,要进行重新布局,混合处理。 对于音频流,要进行混音、重采样处理。 将混合后的音视频进行重新编码。 发送给接收客户端。 1.优点技术非常成熟,在硬件视频会议中应用非常广泛 作为音视频网关,通过解码、再编码可以屏蔽不同编解码设备的差异化,满足更多客户的集成需求,提升用户体验和产品竞争力。 将多路视频混合成一路,所有参与人看到的是相同的画面,客户体验非常好。 2.缺点重新解码、编码、混流,需要大量的运算,对 CPU 资源的消耗很大。 重新解码、编码、混流还会带来延迟。 MCU服务器的压力较大,需要较高的配置。
  大家都知道现今直播的发展要得益于CDN分发体系,CDN主要通过RTMP协议进行传输,而WebRTC的传输协议是RTP/RTCP,所以如果我们需要使用CDN网络进行分发,就需要在服务器中将RTP/RTCP转成RTMP。在WebRTC中,编码格式是OPUS,而RTMP协议对应的编解码格式一般是AAC,通常这两种编码格式之间的转换也是非常现实的需求。同时,在MCU模型中,我们还可以在服务器中增加录制、混流的功能,在直播连麦的情况下,通过混流的方式可以大大减少下行的带宽。
  除了实现以上功能外,由于如今的直播中美颜、滤镜几乎成为了标配,所以实现这种附加功能也是市场普遍的需求。虽然在WebRTC中并没有提供实现美颜、滤镜的接口,但是我们可以在服务器端实现类似的附加功能。根据实际的业务需求,通过MCU多点控制单元,可以实现这类附加功能。 三、SFU(Selective Forwarding Unit)
  SFU 像是一个媒体流路由器,接收终端的音视频流,根据需要转发给其他终端,也叫Router模式。SFU 在音视频会议中应用非常广泛,尤其是 WebRTC 普及以后。支持 WebRTC 多方通信的媒体服务器基本都是 SFU 结构。SFU 的拓扑机构和功能模型如下图:
  在上图中,B1、B2、B3、B4 分别代表 4 个浏览器,每一个浏览器都会共享一路流发给 SFU,SFU 会将每一路流转发给共享者之外的 3 个浏览器。
  下面这张图是从 SFU 服务器的角度展示的功能示意图:
  相比 MCU,SFU 在结构上显得简单很多,只是接收流然后转发给其他人。然而,这个简单结构也给音视频传输带来了很多便利。比如,SFU 可以根据终端下行网络状况做一些流控,可以根据当前带宽情况、网络延时情况,选择性地丢弃一些媒体数据,保证通信的连续性。
  目前许多 SFU 实现都支持 SVC 模式和 Simulcast 模式,用于适配 WiFi、4G 等不同网络状况,以及 Phone、Pad、PC 等不同终端设备。 1.优点由于是数据包直接转发,不需要编码、解码,对 CPU 资源消耗很小 直接转发也极大地降低了延迟,提高了实时性。 带来了很大的灵活性,能够更好地适应不同的网络状况和终端类型。 2.缺点由于是数据包直接转发,参与人观看多路视频的时候可能会出现不同步;相同的视频流,不同的参与人看到的画面也可能不一致。 参与人同时观看多路视频,在多路视频窗口显示、渲染等会带来很多麻烦,尤其对多人实时通信进行录制,多路流也会带来很多回放的困难。总之,整体在通用性、一致性方面比较差。 每个端需要建立一个连接用于上传自己的视频,同时还要有N-1个连接用于下载其它参与方的视频信息,消耗的带宽也是最大的(带宽比较烧钱) 3.Simulcast 模式
  所谓 Simulcast 模式就是指视频的共享者可以同时向 SFU 发送多路不同分辨率的视频流(一般为三路,如 1080P、720P、360P)。而 SFU 可以将接收到的三路流根据各终端的情况而选择其中某一路发送出去。例如,由于 PC 端网络特别好,给 PC 端发送 1080P 分辨率的视频;而移动网络较差,就给 Phone 发送 360P 分辨率的视频。
  Simulcast 模式对移动端的终端类型非常有用,它可以灵活而又智能地适应不同的网络环境。下图就是 Simulcast 模式的示意图:
  4.SVC 模式
  SVC 是可伸缩的视频编码模式。与 Simulcast 模式的同时传多路流不同,SVC 模式是在视频编码时做"手脚"。
  它在视频编码时将视频分成多层——核心层、中间层和扩展层。上层依赖于底层,而且越上层越清晰,越底层越模糊。在带宽不好的情况下,可以只传输底层,即核心层,在带宽充足的情况下,可以将三层全部传输过去。
  同一路流,分成了多具层,核心层,护展层和边缘层,当带宽不足时,由上层逐渐丢弃!
  如下图所示,PC1 共享的是一路视频流,编码使用 SVC 分为三层发送给 SFU。SFU 根据接收端的情况,发现 PC2 网络状况不错,于是将 0、1、2 三层都发给 PC2;发现 Phone 网络不好,则只将 0 层发给 Phone。这样就可以适应不同的网络环境和终端类型了。
  要注意的是,simulcast和SVC不能混用。这两个相比,simulcast的操作更简单一些,实用性更高一些,国内的 声网 便使用的这种方式。SVC更复杂一些,国外的 zoom 、思科 的解决方案便采用的这种方式。 四、现状总结1.参考WebRTC 开发实践:为什么你需要 SFU 服务器
  SFU 服务器最核心的特点是把自己 "伪装" 成了一个 WebRTC 的 Peer 客户端,WebRTC 的其他客户端其实并不知道自己通过 P2P 连接过去的是一台真实的客户端还是一台服务器,我们通常把这种连接称之为 P2S,即:Peer to Server。除了 "伪装" 成一个 WebRTC 的 Peer 客户端外,SFU 服务器还有一个最重要的能力就是具备 one-to-many 的能力,即可以将一个 Client 端的数据转发到其他多个 Client 端。
  这种网络拓扑结构中,无论多少人同时进行视频通话,每个 WebRTC 的客户端只需要连接一个 SFU 服务器,上行一路数据即可,极大减少了多人视频通话场景下 Mesh 模型给客户端带来的上行带宽压力。
  SFU 服务器跟 TURN 服务器最大的不同是,TURN 服务器仅仅是为 WebRTC 客户端提供的一种辅助的数据转发通道,在 P2P 不通的时候进行透明的数据转发。而 SFU 是 "懂业务" 的, 它跟 WebRTC 客户端是平等的关系,甚至 "接管了" WebRTC 客户端的数据转发的申请和控制。
  从上述 SFU 的定义可以看到,SFU 这种网络拓扑模型,通过由 SFU Server 来实现 one-to-many ,减轻了多人视频通话场景下每个客户端的上行带宽压力,但是下行依然是多路流,随着通话人数的增大,下行带宽的压力依然会成比例的增大,那能否让下行也只剩一路流呢?—— 可以,通过在服务器端合流后再下发即可解决。这种网络拓扑结构,被称之为 MCU,它的特点是,由 MCU Server 将各路客户端上行的视频流合成为一路,再转发给其他客户端。这种模型相比于 SFU 降低了多人视频通话场景下客户端的下行带宽压力,但是由于合流需要转码操作,对服务器端压力比较大,而且下发给客户端的流是固定的合流画面,灵活性不是特别好。
  综上所述,纯 mesh 方案无法适应多人视频通话,也无法实现服务端的各种视频处理需求,最先排除在商业应用之外。
  SFU 相比于 MCU,服务器的压力更小(纯转发,无转码合流),灵活性更好(可选择性开关任意一路数据的上下行等),受到更广泛的欢迎和应用,常见的开源 SFU 服务器有:Licode,Janus,Jitsi,mediasoup,Medooze 等等,各有特点,大家可以去项目主页了解更详细的情况。
  当然,也可以组合使用 SFU + MCU 的混合方案,以灵活应对不同场景的应用需要。 2.SFU开源方案
  由于各方面限制,Mesh 架构在真实的应用场景中几乎没有人使用,一般刚学习 WebRTC 的才会考虑使用这种架构来实现多方通信。(可以简单了解下)
  MCU 架构是非常成熟的技术,在硬件视频会议中应用非常广泛。像很多做音视频会议的公司之前都会购买一套 MCU 设备,这样一套设备价格不菲,最低都要 50 万,但随着互联网的发展以及音视频技术越来越成熟,硬件 MCU 已经逐步被淘汰,当然现在也还有公司在使用软 MCU,比较有名的开源项目是 FreeSWITCH。
  SFU 是最近几年流行的新架构,目前 WebRTC 多方通信媒体服务器都是 SFU 架构。从上面的介绍中你也可以了解到 SFU 这种架构非常灵活,性能也非常高,再配上视频的 Simulcast 模式或 SVC 模式,则使它更加如虎添翼,因此SFU模式已经渐渐成为主流了。目前的实际应用中,使用Simulcast比使用SVC多,webRTC对两种都支持。
  下面就来探讨下常见的SFU开源解决方案,当然,你也可以自己实现 SFU 流媒体服务器,但自已实现流媒体服务器困难还是蛮多的,它里面至少要涉及到 DTLS 协议、ICE 协议、SRTP/SRTCP 协议等,光理解这些协议就要花不少的时间,更何况要实现它了。所以最常见的办法就是使用开源的实现。
  部分开源系统五、Licode
  Licode 既可以用作 SFU 类型的流媒体服务器,也可以用作 MCU 类型的流媒体服务器。一般情况下,它都被用于 SFU 类型的流媒体服务器。
  Licode 不仅仅是一个流媒体通信服务器,而且还是一个包括了媒体通信层、业务层、用户管理等功能的完整系统,并且该系统还支持分布式部署。
  Licode 是由 C++ 和 Node.js 语言实现。其中,媒体通信部分由 C++ 语言实现,而信令控制、用户管理、房间管理用 Node.js 实现。它的源码地址为:https://github.com/lynckia/licode ,Stars:2.6k。下面这张图是 Licode 的整体架构图:
  通过这张图你可以看出,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 ,stars:5.2k。
  Janus 的部署也十分简单,具体步骤详见文档,地址为:https://janus.conf.meetecho.com/docs/deploy.html 。
  从上面的架构图中,你可以看出 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/ ,stars:3.3k。 Mediasoup 由应用层和数据处理层组成。应用层是通过 Node.js 实现的;数据处理层由 C++ 语言实现,包括 DTLS 协议实现、ICE 协议实现、SRTP/SRTCP 协议实现、路由转发等。
  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,stars:820
  从大的方面来讲,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
  https://github.com/jitsi/jitsi,stars:3.3k https://github.com/jitsi/jitsi-meet,stars:15.6k 使用Java构建的服务端,底层也是使用c/c++,使用Java语言所以性能上没有使用c/c++的表现好。
  主要模块及实现语言: Jitsi Video-Bridge (Software video-bridge 实现语言java) Jitsi Jicofo (Component mandatory for jitsi conference 实现语言java) Prosody ( XMPP Server 实现语言lua) Nginx (Web Server) 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
  使用了GStreamer对WebRTC的实现。https://opensource.com/article/19/1/gstreamer 比如这些项目: https://janus.conf.meetecho.com/ https://www.kurento.org/kurento-architecture kurento是比较出名的了 https://github.com/Kurento/kurento-media-server,stars:2.3k Kurento和jitsi是一样,持续维护了很多年,经过了时间的检验。不同的是他是使用c++开发,有丰富的文档和示例库,对于开发者来说非常友好。
  GStreamer在Linux下有非常普遍的使用率,但它严重依赖大量第三方项目,比如glib,libice等,都存在跨平台编译问题,也存在API使用繁琐的问题。 十一、node-webrtc
  https://github.com/node-webrtc/node-webrtc,stars:2k 将开源项目Chromium内WebRTC的cpp原生实现集成到项目中使用。 原生WebRTC虽然有最好的功能实现,但复杂的编译环境,源码整合,API封装,工作量非常繁重 十二、 pion/webrtc
  https://github.com/pion/webrtc,stars:6.8k WebRTC API的Pure Go实现 十三、总结
  对流媒体服务器的选择,没有最好,只有最合适。每个开源实现都有其各自的特点,都可以应用到实际产品中,只不过作为开发人员都有自己独特的技术背景,你需要根据自身特点以及项目特点选一个最合适的。接下来,我就介绍一下我是如何对这些开源项目进行评判和选择的。 1.团队
  在一个团队中肯定会选择一种大家都比较熟悉的语言作为项目开发的语言,所以我们在选择开源项目时,就要选择使用这种语言开发的开源项目。 比如阿里系基本都用 Java 语言进行开发,所以它们在选择开源项目时,基本都会选择 Java 开发的开源项目; 而做音视频流媒体服务的开发人员,为了追求性能,所以一般都选择 C/C++ 语言开发的开源项目。 团队人手如果不充裕的情况下,尽量就不要选择特别复杂的,和文档比较少的开源技术。 2.适合业务
  要充分考虑到你的业务的用户量和用户群体,如果你的业务量很大,需要做分布式,那么你选择的开源技术一定要先去了解下他是否支持分布式部署,分布式部署采用那种方式。单机支持多少并发,最好自己用服务器实际测试下,官方数据会和实际测试数据多少都有出入。 项目功能也需要考虑,比如业务需要录制回放,开源技术并没有这样的功能,需要自己开发,时间成本很高,但选择已经做好录制回放功能的开源技术又不一样了。 3.二次开发
  Licode 是一个完整的系统,支持分布式集群部署,所以系统相对复杂,学习周期要长一些。它可以直接布署在生产环境,但是二次开发的灵活性不够。 Janus-gateway 是一个独立的服务,支持的信令协议很丰富,而且支持插件开发,易扩展,对于 Linux/C 背景的开发者是很不错的选择。 Medooze 和 Mediasoup 都是流媒体服务器库,对于需要将流媒体服务器集成到自己产品中的开发者来说,应该选择它们。 4.时间成本
  公司对于项目的时间计划和成本也要考量,因为使用开源技术或多或少都会遇到坑,有可能一个坑会卡很久,所以使用文档全,社区活跃的开源技术比较好。
  无论选择哪种开源技术,前期一定要做好调研,并实际自己搭建使用过在做决定,选择好后,为了弥补技术债,需要去深入开源技术的代码,不然还债的时候很疼苦。

为什么不建议存大额存单?内行人主要有4大原因大额存单一度是不少银行的揽储神器,其利率一般比同银行同时限的定存还要高,因此不少储户想要借助存大额存单,到手更多利息。不过有种说法却是,并不建议一些人去存大额存单,内行人表示,这主佩洛西窜韩吃闭门羹?亲美尹锡悦为何头铁?原因不止一个佩洛西万万没想到,在哪哪都得到盛情接待的她,从台湾省出来以后竟然不受韩国的待见。我们要知道,韩国一向可是亲美不亲中的,尹锡悦用休假这个鬼都不信的理由,拒绝了接见这个八旬老太,尹锡悦四冲程割草机油封漏油和飞轮裂开的原因今天碰到一台油封漏油的割草机,发动机是146的,146发动机上市,到现在已经三年多了,现在配套体系可能还有一些瑕疵。146割草机这台割草机听用户说只用了半个多月,先是感觉到有一点点2019年,富婆宾利姐征婚,称结婚就送宾利车,如今她结婚了吗不花一分钱就能娶到老婆,还能得到价值500万的彩礼。你遇到过这样的好事吗?相信很多人会说,天上没有掉馅饼这回事。别说了,是真的。2019年,自称是江浙沪女首富的冯萍,在网上公开征婚台海军演应该常态化,既能震慑台独势力又能提升我军实战能力近日我国为了维护国家主权和领土完整,震慑台独势力和域外分裂势力,解放军在台湾周边举行了震惊世界的台海军演。我东部战区人民子弟兵驾驶着战机和战舰毅然决然地越过海峡中线,贴近台湾海岸线美方指责无效,我军延长台海军演中国的事咱自己说了算每天三五分钟,纵览国际风云!守望幸福家园,守望中国平安,守望世界和平。欢迎关注每日守望。据东部战区官方平台发布最新消息,8月8日,东部战区继续在台岛周边海空域进行实战化联合演训。按杨幂久违拍内衣大片,好惊艳!穿粉嫩的真丝睡衣,美得太浪漫了杨幂作为内衣品牌维多利亚的秘密的代言人,不久前她再次现身为品牌拍摄了一套内衣大片,而这次杨幂选择的内衣,更有了不少唯美浪漫的效果,浅淡的配色加上衣服的性感设计,也让杨幂这次的表现更A股本周方向上证指数已经止跌,科创板已经突破箱体,后续有望看高一线。周末消息涨幅榜看,清一色半导体,周五算是集体大爆发,漂亮国芯片法案即将落地,让整体压抑已久的半导体板块出现超预期报复性反弹,1954年毛主席到杭州,突然问公安厅长知道西湖边有多少座坟吗?建国后,北京之外的城市中,毛主席去的次数最多待的时间最久的地方是哪里?这个问题的答案可能会出乎很多人的意料之外,因为毛主席最常去的地方不是老家湖南,而是浙江杭州。之前,有人曾做过一卢克文言论翻车,被黄智贤指着鼻子怼,指责其轻浮,胡说八道嘿,这里是辣条没想到有一天卢克文也会因为言论翻车。其实想想也对,写文章的人在阐述观点的时候,极其容易加入主观臆断。就算是写史书的也不一定100的中正。这次卢克文言论翻车,其实吧,就统一台湾已箭在弦上,不得不发美国众议院议长佩洛西2日晚10时44分抵达松山机场,随即下榻台北君悦酒店,预计今日(3日)上午9时赴台立法院,10时30分前往台总统府与蔡英文见面,中午蔡英文在台北宾馆举行午宴接待
2022年111月中国SUV品牌销量排行榜TOP10中商情报网讯2022年112月,销量排名前十位的SUV品牌依次是ModelY宋DM哈弗H6CS75CRV元PLUS缤越X3别克昂科威和RAV4。前十个品牌共销售227。7万辆,占S郑明明的产品怎么样?郑明明红颜紧致柔肤面膜好用吗?外油内干是护肤领域常常提到的一个肌肤现象,指的是皮肤明明很油,在补水之后非但没有减轻油腻,反而越来越干。这种情况其实就是皮肤屏障受到了损伤,这种肌肤如果护肤的话,一定要找对护肤思路泰州苏王毛孔粗大有哪几种类型?毛孔粗大已经成为一个可以随时打开护肤话题的关键词了。毛孔并非是一个组织学的准确概念。我们能看见的部分是毛囊皮脂腺开口。含角栓的毛囊皮脂腺开口常分布于面颊鼻翼,只要毛孔存在,它们就不面部缺乏立体感?玻尿酸帮你重塑精致立体轮廓!23岁的胡小姐今天过来找我面诊,一坐下就开门见山地提出诉求柳医生,我觉得我的脸不是很立体,我来找你就是想让你帮我打造一个立体好看的脸型。简单询问几个问题后,我便开始仔细观察胡小姐的如何治疗面部白癜风?如何治疗面部白癜风?相信很多人都知道,白癜风是一种对患者的身体部位没有具体约束的疾病,它可能构成患者的所有身体部位,对患者的心灵会造成很大的伤害,尤其是面部白癜风的构成。有面部白癜云准推出10x单细胞FixedRNA服务,让您的样本不再受时空限制!目前,单细胞测序技术已经成为了科学家解锁生命奥秘的利器,广泛应用于肿瘤,免疫,神经,发育生物学以及药物研发,临床转化等研究领域。但是以往的单细胞测序,必须在拿到组织样本后立马进行单别再穿错内衣了!女性在不同年龄如何选择合适的内衣?不同年龄女性,如何正确选择文胸?脸需要护肤,胸型也要保养这样穿内衣更靠谱胸型更好看青春期背心式内衣青春期的乳房开始微微隆起,适合穿无钢圈的发育内衣。青春期的女生乳房开始渐渐有胸型,咳嗽最怕它!建议囤10斤,熬汤煮茶,阳了后每天喝,润喉养肺咳嗽最怕它!建议囤10斤,熬汤煮茶,阳了后每天喝,润喉养肺2022年最后一天了,也是我阳了之后第七天。据专家说,阳了后,一般7天也就好了,所以今天我出门了,天气也蛮好,晒晒太阳,很彻底治好头皮屑,恢复头发本来发质上海硫磺皂烦恼我近十年的头皮屑问题,居然被一块儿两块钱的上海硫磺皂,在一个礼拜的时间给解决了。自从好几年前,出现头皮屑问题,就开始用康王,用的时候是有效的,不用的话,一个礼拜头皮屑就又回来了逛屈臣氏发现这4款不起眼好物,建议不要错过,不贵又好用日常生活之中,我们经常需要购买很多护肤品进行护肤,现在市场上的护肤品很多,我们经常要面临很多选择。琳琅满目的产品很容易让我们产生消费冲动,让我们不知道如何做出选择。即使进入商店,也建议女人尽量少穿大衣配小黑裤,学陈数这样穿,时髦显瘦又高级对于绝大多数的女性而言,小黑裤的搭配好像非常的百搭,而且足够经典,以至于在冬季当中与大衣的搭配组合好像成为了非常固定而又稳定的搭配所存在了。但真的建议大家在搭配大衣的时候一定还是要