草庐IT

WebRTC服务端工程实践和优化探索

ZEGO即构开发者 2023-03-28 原文

本文来自即构内部音视频框架设计的开发同学在 2020 年关于《WebRTC 服务端工程实践和优化探索》的技术分享;

希望本次分享能给大家在 WebRTC 服务端实现或者项目选型时带来一些思考。

接下来进入主题,今天的分享主要分为三个部分:

WebRTC 服务器架构介绍及设计思路;

开发 WebRTC 服务器所需的技术和面临的难点;

QoS 服务质量的实现及优化。

WebRTC 服务器架构介绍和设计思路

我们首先要想一下,为什么需要 WebRTC 服务器?WebRTC 服务器它的作用是什么?

在大家的认知里面,WebRTC 是谷歌开源的一个协议,是现在大家比较熟悉的一个点对点通讯方案。点对点通讯方案是指双方浏览器之间是直接互联的,如果在多方会议或多方通话的情况下,每个通话者之间都是直连的,没有经过第三方。

下面来看一下它的优劣势:

优势

第一,简单。这个模型非常简单,点对点,没有经过中间的一些服务器。

第二,延迟小。既然是直连的,我们可能理所当然地认为中间除了这些路由节点之外,就没有其他地方会增加延时了。但是我后面加了一个问号,也就是说未必是这样的。

熟悉我们国内运营商网络情况的都知道,联通,移动,电信之间的通信可能是不对称的,如果我是联通,你是移动,咱们直连的话,延迟未必是小的,这个就是我加了一个问号的原因。

第三,端对端带宽适应。这个指的是 WebRTC 可以根据会话者之间的网络情况、带宽情况进行适应。比如当你的接收带宽不够时,我可以降低上行编码码率来适应你,从而达到一个更好的通话效果。

劣势

第一,连通性能差。点对点之间,由于所有的网络不是在一个防火墙后,我们可能需要打洞,甚至有一些防火墙非常严格的话,我们连打洞都没办法完成,这会极大的影响服务的连通性。

我们首先要发现对方,然后要打洞,如果打洞不成功,还需要通过中转服务器来进行媒体的传输,这个过程可能会快则几秒钟,慢则几分钟。也就是说我们从会话开始到双方建立通信,整个过程是非常复杂、耗费非常长的时间。

第二,带宽占用高。所有的与会者是直连的,带来的一个问题是,如果我要看到其他所有人的视频,那么每个人都需要推一路流给我。同样的,其他人也是需要接收除他以外的所有流,这时候我的上行带宽占用是非常高的。在视频会议场景下,少则十几多则二十几个人,现在几百个人的会议也是很常见的。按照我们现行的带宽,是达不到的。

第三,编解码压力大。既然每个人的流要单独发送给其他与会者,那么也要单独编解码,要发送 N 路就要编 N 路,并且编解码压力是非常大的,不仅我们的移动端没办法承受,甚至我们的 PC 端也是没办法承受的,这是它很大的一个劣势。

在我们实际的应用场景上,如果没有服务器,那么我们也没办法进行录制,无法实现视频回播、鉴黄以及 CDN 分发等功能。综合考虑,我们就会发现点对点方案可能并没有很好的满足我们当前实际的应用需求。

所以这里就要引入一个服务器方案的架构,根据刚才提到的点对点三大劣势,我们来重点看看新方案是如何解决的。

连通性

通常我们的服务器都会架构在公网上,所以各个会话者是直接跟我们在公网上的服务器建立连接,省掉了打洞,直接一步到位。

网络带宽占用高

假设当前我们这个会议有四方会话,那我的与会者有三路,我只需发一路到服务器上,通过服务器把我这一路转发给其他三路的与会者就可以了,不需要再去多发两路,这样我的上行带宽就从原本的三路变成了一路了;而接收端,引入 MCU 的概念,为了节省下行带宽,我们可以将这三路混流,再转发给我,那么我的下行也只有一路。

编解码压力小

通过优化架构带宽,编解码从原来的 N 路变成一路,也同步缓解了编解码压力。

既然服务器能更好的满足我们的实际应用,那么 WebRTC 服务器应该怎么进行架构设计呢?开发 WebRTC 服务器需要哪些技术以及可能会面临哪些难点?以及 WebRTC 服务端 QoS(服务质量)的实现及优化有哪些重点要注意的?

篇幅关系,关于《WebRTC 服务端工程实践和优化探索》的完整内容,大家可以通过我们的活动资料包获取,资料包中还有视频回放、演讲 PPT 等资料。

有关WebRTC服务端工程实践和优化探索的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  7. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  8. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  9. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  10. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

随机推荐