基于mediasoup的多方通话研究(一)_敬我岁月无波澜-程序员宅基地

技术标签: 多人音视频  webrtc  SFU  mediasoup  nodejs  

mediasoup简介

mediasoup号称尖端的WebRTC的视频会议系统,官网为 https://mediasoup.org/.
安装极其简单:

npm install mediasoup
npm install mediasoup-client

ibc开发这套系统一直跟进到最新的版本,经历了V1到V2的变迁,api从webrtcortc的变更,一点一点的完善,目前好评度越来越高。

有没有兴趣跟我一起学习研究这个优秀的系统呢?

需要强调一点的是:希望大家能提前对ORTC有个大概的了解。

mediasoup的特性

脱颖而出mediasoup,可以用小而美来形容她:

  1. 支持目前主流的浏览器,chrome、Firefox、safari、Edge等等。
  2. 支持UnifiedPlanSdp和PlanBSdp两种方式;
  3. ORTC的api风格调用方式,避免了WebRTC的不足,使协议更简洁;
  4. json-rpc远程调用方法,协议清晰简洁。;
  5. 增加了支持simulcast;
  6. 编码简洁、结构清晰;

纵使她很让人喜欢,但也有不尽人意的地方:

  1. 上层接口是nodejs,这个根据我们情况集成可能有麻烦(后面我们讲讲怎么解决这个问题)。
  2. 功能比较简单,后续的开发较多;

安装mediasoup-demo

首先呢找一台linux服务器吧,推荐用ubuntu,安装最新版本的npm,快速安装可参考npm最新版本安装方法。另外网速不好的同学建议修改npm源npm源修改办法

  • 首先克隆项目:
$ git clone https://github.com/versatica/mediasoup-demo.git
$ cd mediasoup-demo
  • 安装server:
$ cd server
$ npm install
  • 复制 config.example.js 重命名 config.js 然后可以自定义设置,目前先不做修改:
$ cp config.example.js config.js
  • 安装浏览器端app:
$ cd app
$ npm install
  • 全局安装 gulp-cli (可能需要使用 sudo):
$ npm install -g gulp-cli

本地运行Demo

  • 首先打开一个终端,运行server :
$ cd server
$ node server.js
  • 在另外一个终端中打开启动app
$ cd app
$ gulp live
  • 接着就可以用浏览器浏览了。

server的配置文件

这里对于config.js 强调一点:

  • 设置rtcAnnouncedIPv4(同rtcAnnouncedIPv6)以支持公网访问,局域网访问默认不需要修改。
	//局域网访问:默认不需要修改
	rtcAnnouncedIPv4 : null,
	//公网可以访问:将rtcAnnouncedIPv4修改为公网的IP,重启server即可(仅限有公网IP的云服务器)。
	rtcAnnouncedIPv4 : '111.111.111.111',
  • 设置rtcMinPort和rtcMaxPort:如果需要公网访问,记得防火墙放行,局域网访问默认不需要修改。
	rtcMinPort       : 40000,
	rtcMaxPort       : 49999,

mediasoup的原理

下图举例三个Client (browser或者客户端)同时加入一个房间,每个app同时发布一路视频和一路音频,并且接受来自其他app的音视频流,mediasoup内部的结构如下:
在这里插入图片描述

  • 每个Client创建两个Peerconnection分别用于发送和接受媒体流,发送端用于发送承载本地videoTrack和audioTrack的localStream,接收端接受来自其他Client的remoteStream;
  • 同时Room会为每个Client创建一个Peer,Peer管理两个Transport用于接受Client的媒体流和向Client发送媒体流;
  • Peer为对应的Client发送的videoTrack和audioTrack分别创建一个Producer(共2个);
  • Peer为其他两个Client发送的videoTrack和audioTrack分别创建2个Consumer(共2个);
  • Producer将媒体数据发送给每一个订阅者Consumer。

到此为止,可能会有一个简单的了解了,这里不再细分,有兴趣的话可以私下找我交流。

扩展与展望

mediasoup作为一个SFU服务器,有着出色的性能和极小的开销,多进程负载均衡的方式让我们体会到它的强悍。美中不足的是它的信令只有nodejs接口,并不能满足所有人的胃口。庆幸的是出于对c++的情怀,我将所有的nodejs逻辑翻译成了c++版本,并且开发了对应的native客户端:

  • c++版本服务器,支持跨平台的编译;保持原有mediasoup-worker代码99.9%完整和不变;
  • c++版本客户端,Qt5+WebRTC68,支持windows、Mac OS、Linux的编译,且与mediasoup-demo互通;
  • 客户端增加Gpu Video Accelerator,支持H264的硬件encode/decode功能。

未来将加入的新功能

  • 客户端和服务器的音视频流录制功能;
  • rtsp和rtmp与meidasoup的互通功能;
  • H264硬件编解码的持续优化。

现献上效果图
server端(有没有熟悉的味道):
在这里插入图片描述
Windows Client:
在这里插入图片描述
Windows Client与Web互通:
在这里插入图片描述
**Demo下载地址: https://pan.baidu.com/s/18Nfnu_MAafFnkyzBrJnq1g 提取码: jbtu **

总结

  • Windows下面与mediasoup-worker的管道通讯遇到了好多问题,好在坚持不懈的解决了,毕竟Libuv文档稀有;
  • nodejs用了ES6新特性,如promise,考虑到维护原版的特性和结构,千辛万苦地用promise-cpp勉强解决了;
  • 很久没有更新博客了,是因为没有新的成果,mediasoup的研究让我又有了新的乐趣,希望能坚持下去;
  • 上面涉及的代码后期可能考虑开源。

另外附上我的Github地址https://github.com/harvestsure欢迎互粉。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a345252622/article/details/83788934

智能推荐

深度学习 1.PyTorch入门_baiyucraft的博客-程序员宅基地

Author:baiyucraftBLog: baiyucraft’s Home原文:《动手学深度学习》一、深度学习简介1.深度学习  首先,我们得知道什么是深度学习:深度学习是一种特殊的机器学习,通过学习将世界使用嵌套的概念层次来表示并实现巨大的功能和灵活性,其中每个概念都定义为与简单概念相关联,而更为抽象的表示则以较不抽象的方式来计算。  其实目前来说我也不太清楚机器学习和深度学习具体的概念,所以这块留白,日后补充。2.PyTorch  在深度学习中,这里我们选择PyTorch作

css引入样式和权重_长脖子的鹿的博客-程序员宅基地

引入样式的四种方法:1、行间样式2、页面级css 在head标签中写style标签3、外部css样式 使用link标签4、导入样式<style>@import url("外部样式表的名称");</style>HTML中的代码:ID选择器在文档中使用一次与类不同,有且仅有一次css权重:!import infinity行间样...

SIP_iteye_11002的博客-程序员宅基地

SIPSIP, the session initiation protocol, is the IETF protocol for VOIP and other text and multimedia sessions, like instant messaging, video, online games and other services. Abstract from the R...

在Linux下安装和使用MySQL(ZT)_congliao6704的博客-程序员宅基地

一、引言  想使用Linux已经很长时间了,由于没有硬性任务一直也没有系统学习,近日由于工作需要必须使用Linux下的MySQL。本以为有Windows下使用SQL Server的经验,觉得在Linux下安装MySql应该是易如...

权限控制 —— 自定义指令directive_のsmile的博客-程序员宅基地_自定义指令控制权限

我们通常给一个元素添加 v-if / v-show 来做权限管理,但如果判断条件繁琐且多个地方需要判断,这种方式的代码不仅不优雅而且冗余。针对这种情况,我们可以通过全局自定义指令来处理:我们先在新建个 array.js 文件,用于存放与权限相关的全局函数:// array.jsexport function checkArray (key) { let arr = ['1', '2', '3', '4', 'demo'] let index = arr.indexOf(key) if (

linux做svn客户端吗,Linux中的svn客户端(TortoiseSVN 的替代者)_罗立子的博客-程序员宅基地

RabbitVCS : TortoiseSVN 的替代者我们都知道,自从svn出道以来,很多人都预言,cvs将会被其取代。就如同他们预言maven要取代ant一样。可见,svn的流行。在windows中,最常用到的开源免费的svn客户端就是TortoiseSVN(也就是我们看到的小乌龟)。在windows中,TortoiseSVN搭配VisualSvn Server(免费的svn server管理...

随便推点

iOS SceneDelegate应用_假装你是大灰狼的博客-程序员宅基地

Xcode 11 建新工程默认会创建通过UIScene管理多个UIWindow的应用,工程中除了AppDelegate外还会有一个SceneDelegate,这是为了实现iPadOS支持多窗口的结果。AppDelegate.h不再有window属性,window属性被定义在了SceneDelegate.h中,AppDelegate中有新增的关于scene的代理方法,SceneDelegate中也有相应的代理方法。因此,当我们用Xcode11针对不同版本的iOS开发应用时,就要做一些适配。创建好一个工程后,

ROS学习笔记(四):ROS主题_一把木剑的博客-程序员宅基地

一,准备工作1.运行roscore$ roscore2.运行小乌龟(新terminal)$ rosrun turtlesim turtlesim_node3.控制小乌龟(新terminal)$ rosrun turtlesim turtle_teleop_key这样我们就可以通过控制方向键来控制小乌龟的运动了。二,ROS主题初探    在上面的过程中,小乌龟程序是一个节点,方向键控

JavaScript 作用域(Scope)详解_weixin_30300523的博客-程序员宅基地

先对需要用到的名词解释一下,再通过例子深入理解一、什么是作用域(Scope)  [[scope]]:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供javascript引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。即作用域决定了代码区块中变量和其他资源的可见性。二...

反编译.NET程序之王-----LutZ Roeder’s .NET Reflector_天涯飘鸿的博客-程序员宅基地

反编译.NET程序之王-----LutZ Roeder’s .NET Reflector        想破解别人的软件?想看看别人dll中的秘密?别着急,Reflector可以帮你的忙,它可以反编译.EXE .DLL .MCL格式的文件。        它使用起来非常的方便,近似乎傻瓜式的操作让初学者非常容易上手。下面我就介绍一下,它的使用方法。        首

layui日历插件_IEVEl的博客-程序员宅基地_layui日历插件

layui日历插件修改页面初始化日期时,定义格式为:yyyy-MM-dd

第三篇:Java中Synchronized原理详解以及锁的升级_张孟浩_jay的博客-程序员宅基地

Java为了解决并发的原子性,提供了以下两个解决方案:1、Synchronized关键字2、Lock管程这篇文章我们先说一下Synchronized关键字,Lock管程等着下篇文章再说。1、Synchronized的三种用法package juc;public class TestSyn { static int x = 0; int y = 0; public static void main(String[] args) throws InterruptedExc

推荐文章

热门文章

相关标签