草庐IT

基于webrtc多人音视频的研究(一)

音视频开发老马 2023-09-06 原文

众所周知,WebRTC非常适合点对点(即一对一)的音视频会话。然而,当我们的客户要求超越一对一,即一对多、多对一设置多对多的解决方案或者服务,那么问题就来了:“我们应该采用什么样的架构?” 。简单的呢有人会考虑copy多个p2p就完成了多人之间的会话,可并没有考虑到到来的问题:cpu、内存、尤其是流量问题;传统的解决方案是MCU服务器,利用服务器硬件的能力去mix音视频,然后传给各个参与者,这能到达预想的,这个亦能到达我们的需求;使用基于网状拓扑结构的结构可能是前两者的折中之选。

尽管能实现WebRTC多人音视频的方案,该技术的最流行的用途不局限于多方视频会议场景。不要以为只是传统的音视频会议室,更多的情况包括:智能硬件、ipcamera、在线课堂,实时直播等。在每一种情况下,服务器的能力是能够从多个源的媒体流分发到多个客户端。所以...如果你是一个服务供应商如何才能在实现支持WebRTC的多方拓扑结构?

有几种不同的架构根据您的要求,可能是合适的。这些架构基本上他们围绕二点:

§ 集中VS对等网络(P2P)

§ 混合VS路由。

我将在这里介绍最流行的解决方案。如果你需要去深入到协议的影响和实施细则的架构,你可以找到所有的相关信息,RTP拓扑IETF文档。

Mesh解决方案

Mesh方法是最简单的解决方案。因为它不需要假设任何服务器,而且直接使用成熟的WebRTC传输方案。该体系结构基于从每一个发送者创建多个一对一的数据流到每一个接收端。

即使它看起来像一个低效的解决方案,在实践中是非常有效的,并且延迟最低,每个接收端都会根据实际情况产生不同的比特率。

唯一的问题是,这种解决方案需要大量的上行带宽将媒体流同时发送至所有目的地,现有的设备实现所需的CPU功率会显著上升。

Mixer解决方案

Mixer的做法是多人视频会议的传统解决方案,并且使用多年取得了巨大成功。这一成功可以归功于它需要客户端更少消耗这一事实。该架构基于具有中心点保持与每个参与者一对一的流的特性。中心元件接收并混合每个传入的音频流和视频流,以合成一个单一的流出到每一个参加者。在视频会议行业对于这些集中元件的一个常见术语是多点控制单元(MCU)。在实践中,使用一个MCU的通常是指一个混合器容器。

混频器是供传统设备操作间很好的解决方案。它们还允许全位速率适配,因为混频器可以产生不同的输出流,所以每个接收器有不同的品质。混合器解决方案的另一个优点是它可以利用硬件设备编解码。

主要缺点是在MCU的基础设施成本高。此外,由于混合需要解码和再编码,这引入额外的延迟和质量的损失。最后,转码和组合物可在理论上导致对应用程序的用户界面的弹性较小(尽管有此问题的解决方法)。

Router解决方案

Router(或中继)的办法使得H.264 SVC基础设施普及,这也正是广泛应用的。该架构基于具有中心点从每个发送器接收一个流并发送出一个流到每一个参与者。这个中心点只做数据包检测和转发,而不是昂贵的编码和实际的媒体的解码。常见术语是SFU。

Router提供一个便宜的可扩展的多方传输,具有较好的延迟性、与传统的mixer解决方案相比没有质量劣化。

这种方案非常适合大并发的事实会议和直播。目前较成熟的服务提供商就是声网

来一张各个解决方案的流量图?

我应该使用哪种架构?

这个就需要根据自己的项目的需要了。其实,商业解决方案,包括上述所有方案,往往需要根据客户的实际应用场景选择对于的方法。不过,也有经验,你可以使用一些通用规则。

1、如果您仅是提供P2P音视频传输的服务,Mesh架构可能是最适合你的。另外,如果基础设施的成本不是问题,并且参与者具有异构连接,这可以是一个很好的解决方案。

2、假设你提供企业级服务,且有较好的宽带和高效的硬件(即一个企业内部服务),参加人数是有限的,那么你非常适合Mixer方案。

3、一般来说,如果你提供大规模服务的,应优先考虑到Router的方法。Router传输接近把情报在网络的边界,构建最终用户应用程序时,以达到更好的可扩展性和灵活性的网络的范例。

————————————————

作者::敬我岁月无波澜

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

有关基于webrtc多人音视频的研究(一)的更多相关文章

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

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

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  4. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  5. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  6. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  7. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  8. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

  9. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  10. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

随机推荐