基于mediasoup的多方通话研究(一)_敬我岁月无波澜-程序员宅基地_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

智能推荐

基于mediasoup的多方通话研究(一)

基于mediasoup的多方通话研究mediasoup简介mediasoup的特性安装mediasoup-demo环境本地跑一跑吧关于server的配置文件下面我们来了解下mediasoup的原理吧如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片...

程序员的第一次相亲,还没开始,就已经结束了

点赞再看,养成习惯,微信搜索【三太子敖丙】关注这个被微信官方推荐过的逗比 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也...今天上着班我妈突然给我发来语音,让我发几张...

windows 10安装tensorflow_gpu-1.8.0-cp36-cp36m-win_amd64.whl + CUDA9.2 + cuDNN v7.1.4 +python3.6...

过程中遇到各种各样的问题,慢慢从坑中爬出来 ——好东西要分享给大家,如果这个 网盘资源分享不了,请私信给我,我再重新发新的链接给你,好像NVDIA要注册才能下载cuDNN的,根本不翻墙是不能下载的。 弄了一晚上...

一个java程序员的非全日制软工硕士之路

念头起 全日制和非全介绍 辞职考研 调剂非全 研一 研二

程序员生存定律--细论影响人生成绩的四个要素(2)

程序员生存定律这系列的目录在这里:程序员生存定律--目录喜欢从头瞄的,可以移步。----------------------------------------------------------------------------------------------定律要素之三:自身价值的稀缺...

九年程序员生涯,我的一些经验教训

本文是来自一位国外资深程序员 托马斯·阿科米 工作数年的几点感悟。一篇很有趣也很真实的文章,颇有感触,也希望能够帮到你。

程序人生-35岁程序员的纠结

2012年的时候写过一篇叫《程序算法与人生选择》的文章,我用算法来类比如何做选择,说白了就是怎么去计算,但是并没有讲程序员可以发展的方向有哪些。 所以,就算是有这些所谓的方法论,我们可能对自己的发展还是会...

一个中年程序员遇到突发情况的一些胡言乱语

5月11日我发了一篇文章 可能要暂时停更一段时间,希望时间不会太长,我的初衷是不想无声无息地就停止更文,得给这个号的关注者们有个简短的交代。没想到文章发出来之后很多朋友在文章下留言,以及直接在微信上...

《冬月集:自渡》 一个会写诗的程序员

一个会写诗的程序员 2019.2 冬至 ,昼与惆怅最短,夜与思念最长,愿你一切都好。 任何年龄的爱情都是合情合理的。心灵的爱情在腰部以上,肉体的爱情在腰部往下。任何年龄段的女人,都有她在那个年龄阶段所呈现出来的...

从程序员到产品经理

一直以来我都觉得自己是个典型性程序员。 比如出门时候我总是穿格子衫、牛仔裤,戴着黑框眼镜背个双肩包; 比如休闲时候我是个死宅,喜欢玩游戏和看小说;...就这样波澜不惊的工作了几年以后,突然有一天我不想...

刷爆了!华为:这类程序员我给200万!你怎么看?

从2017年开始,人工智能便波澜不断,无论是从BAT高调布局AI,还是从年薪50万招聘AI应届生,炽手可热形容AI工程师一点都不过分。 百度推出“少帅计划”,针对30岁以下的深度学习科学家,开出100万以上年薪! ...

每周读书#2 - 《程序员的成长课》

这是一个焦虑的时代,前有《人到中年,职场半坡》刷屏,后有中兴员工跳楼刷爆朋友圈。登录知乎、CSDN,关于程序员的出路问题的讨论,总能得到众多的关注。 整个社会弥漫着一股焦虑的味道,其实不只中年人,年轻人...

那一阙词,早已波澜-仓央嘉措

我问佛,我愿花光那一世所有的呢喃,去追寻癫狂我半世之人,可否? 佛曰:你追,或者不追她,心定,在这个婆娑的世界,做快乐事,哪怕是劫是缘。

程序员如何在工作之外获得收入

我技术之外的资本是零,如果你也是这样,那这篇文章适合你! 这是我的故事之一,希望对你有启发。 如果你每天下班后就是躺在床上刷刷斗音,看看微博。但是又总想摆脱黑暗迷乱找不到出口,只能一天天的随波逐流看着...

@程序员,你还记得当年高考时的样子吗?

01、程序员天天 说实话,我高考的时候内心毫无波澜,因为自己啥水平能掂量出来的,想着就是考多少分都无所谓,反正开心就好,所以高考前几天也没复习,该玩玩、该吃吃、该喝喝。 父母很看不惯我当时一幅“漫不经心...

偈颂一首《静心莲》【心静如止水,雷打无波澜。佛前忏一刹,万千罪消融。】

心静如止水,雷打无波澜。 佛前忏一刹,万千罪消融。 心若不诚,求佛无益。 心若向善,何须求佛; 心若不善,求佛何用。 了凡四训(古代著名劝善书) - 百度百科 《了凡四训》是古代著名劝善书,作者是明朝...

使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法

(一般数据量比较多有这种效果,数据量比较少,我就不让他滚动了)。 问题分析: 当第一个ul中的数据滚动完时(真实数据),第二个ul 部分的click事件不起作用(复制出来的数据),无法实现一些点击这行,弹窗详情...

读《一个程序员的奋斗史》有感

《一个程序员的奋斗史》有感 ——莫雨著,Andrew读 当第一次巧然遇见这本书的时候,就牵动着自己的心情,终于花了一天的时间读完这个程序员的心理鸡汤。与其说是心灵鸡汤,不说说是一本程序员小说。这本书是武侠...

随便推点

12C -- 配置EM Express的端口_weixin_33774615的博客-程序员宅基地

EM Express是基于web接口的图形化数据库管理工具。 内嵌到数据库中,可以用来监控、管理数据的性能和完成大多数管理工作。EM Express是轻量级的管理工具,减少了数据库服务器的开销。没有对应的后台进程或者task与其相关联。 它需要使用数据库内部的组件,比如XDB、sql*net。 查看em  express使用的端口号:select dbms_xdb_config...

qwt实时曲线_Linux_ARM_G的博客-程序员宅基地

一、首先要定义和实例化一个QwtPlot,然后是一根曲线QwtPlotCurve,还有就是数据,由于QwtPlot是从设计器拉到界面,IDE做了这个工作就暂时不管了,如果没有IDE可以用代码写的://曲线 QwtPlotCurve * curve;//X轴double time[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//Y轴double val...

基于Encoder-Decoder模式的机器翻译模型原理及实现_小鹿的爸爸-程序员宅基地

基于Encoder-Decoder模式的机器翻译模型原理及实现理论背景代码实现关键词: Encoder-Decoder, LSTM, WordEmbedding在机器学习领域,有很多任务是把一种样式的序列映射成另外一种样式的序列,比如把一种语言翻译成另一种语言,把一段语音转换成一段文本,给一段文字生成一句话简介,或者把一张图片转换成一段对图片内容的文字描述等。这些任务都可以看作是Seq2Se...

rootkit检测、病毒查杀、webshell检测_奔跑的犀牛-程序员宅基地_rootkit查杀

一、chkrootkit1、下载rootkitwget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz2、安装tar xf chkrootkit.tar.gz3、使用cd chkrootkit-0.52/./chkrootkit |grep INFECTED 没有出现INFECTED说明系统没有问题二、rkhu...

ES6入门学习笔记_hen1183392934的博客-程序员宅基地

ES6学习笔记学习开课吧 石川老师视频教程兼容性各大浏览器的最新版本,对 ES6 的支持可以查看kangax.github.io/compat-table/es6/。随着时间的推移,支持度已经越来越高了,超过 90%的 ES6 语法特性都实现了。ES6(ES2015)——IE10+、Chorme、FirFox、移动端、NodeJS编译转换:在线转换提前编译(babel==brows...

MDK5.29,5.30,5.31,5.32,5.33和各种pack软件包镜像下载_ctrigger的专栏-程序员宅基地

MDK5.29,5.30,5.31,5.32,5.33和各种pack软件包镜像下载原文地址:https://www.cnblogs.com/armfly/p/12564643.htmlMDK5.29,5.30,5.31,5.32,5.33和各种pack软件包镜像下载

Verilog 简介与FPGA厂商介绍_今日你学左米啊-程序员宅基地

1.1 Verilog 简介与FPGA厂商介绍->_<-文章目录1.1 Verilog 简介与FPGA厂商介绍学习Verilog最好有的基础Verilog简介设计层次与工具怎么学Verilog with FPGA买一块开发板不买板子,但跟着开发板教程走看一些博客、公众号写的教程我建议的学习流程Xilinx赛灵思家的开发工具Intel(Altera)intel家的开发工具仿真工具说明后面的更新计划结语本篇并不会涉及到Verilog本身的知识,都是拓展阅读。学习Verilog最好有的基础

LBP(局部二值模式)特征提取原理_沈春旭的博客-程序员宅基地

1.前言 LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和 D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征;2.LBP特征描述原始的LBP算子定义为在3*3的窗

推荐文章

热门文章

相关标签