mediasoup-demo解析-服务端
1、启动server
npm start启动服务,会执行脚本:
"start": "DEBUG=${DEBUG:='*mediasoup* *INFO* *WARN* *ERROR*'} INTERACTIVE=${INTERACTIVE:='true'} node server.js"
该命令设置了DEBUG环境变量,并启动server.js
2、SFU架构
参考:Android WebRTC完整入门教程04: 多人视频
多人视频有三种理论方案, 如下图所示, 从左到右分别是Mesh,SFU,MCU.

SFU(Selective Forwarding Unit) 可选择转发单元, 有一个中心单元, 负责转发流. 每个人只跟中心单元建立一个连接, 上传自己的流, 并下载别人的流. 4个人的情况下, 每个人建立一个连接, 包括1个上传流和3个下载流. 此方案对客户端要求较高, 对服务端要求较高.
3、mediasoup相关角色
参考:官方文档
Producer:一个生产者表示将通过WebRTC传输被发送到mediasoup路由的一个音频或视频源,它是在定义媒体包传输方式之上创建的。
Consumer:一个消费者表示通过WebRTC传输正在从mediasoup路由被发送到客户端应用程序的音频或视频远程源,它是在定义媒体包传输方式之上创建的。
DataProducer:数据生产者表示将通过WebRTC传输发送到mediasoup路由器的数据源,它是在定义数据消息(SCTP)的传输方式之上创建的。
DataConsumer:数据生产者表示通过WebRTC传输从Mediasoup路由器传输到客户端应用程序的数据源。它是在定义数据消息(SCTP)的传输方式之上创建的。
4、server启动过程
npm start运行server.js文件时做了6件事
4.1、启动server的命令行交互服务,可以在server启动后再监听用户命令行输入并处理,定义的命令较多
4.2、启动client命令行交互服务,很少的几个命令
4.3、mediasoup核心C++ SFU服务以子进程的方式被nodejs加载启动,这里启动了2个子进程,用来执行相同的任务
[root@jxh server]# npm start > mediasoup-demo-server@3.0. start /usr/local/src/node/mediasoup-demo/server
> DEBUG=${DEBUG:='*mediasoup* *INFO* *WARN* *ERROR*'} INTERACTIVE=${INTERACTIVE:='true'} node server.js - config.mediasoup.numWorkers:
- process.env.DEBUG: *mediasoup* *INFO* *WARN* *ERROR*
- config.mediasoup.workerSettings.logLevel: warn
- config.mediasoup.workerSettings.logTags: [ 'info',
'ice',
'dtls',
'rtp',
'srtp',
'rtcp',
'rtx',
'bwe',
'score',
'simulcast',
'svc',
'sctp' ]
mediasoup-demo-server:INFO running mediasoup Workers... +0ms
mediasoup createWorker() +0ms
mediasoup:Worker constructor() +0ms
mediasoup:Worker spawning worker process: /usr/local/src/node/mediasoup-demo/server/node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=warn --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=49999 +0ms
mediasoup:Channel[pid:] constructor() +0ms [opening Readline Command Console...]
type help to print available commands
cmd> mediasoup:Worker worker process running [pid:] +24ms
mediasoup createWorker() +26ms
mediasoup:Worker constructor() +1ms
mediasoup:Worker spawning worker process: /usr/local/src/node/mediasoup-demo/server/node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=warn --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=49999 +0ms
mediasoup:Channel[pid:] constructor() +0ms
mediasoup:Worker worker process running [pid:] +63ms
mediasoup-demo-server:INFO creating Express app... +91ms
mediasoup-demo-server:INFO running an HTTPS server... +3ms
mediasoup-demo-server:INFO running protoo WebSocketServer... +12ms
查看linux运行进程
root : pts/ :: npm
root : pts/ :: mediasoup-demo
root : pts/ :: /usr/local/src/node/mediasou
root : pts/ :: /usr/local/src/node/mediasou
对应上面启动日志中的PID为8092和8094两个进程,其PPID(父进程PID)都为8005,也就是mediasoup-demo主进程。
对应的启动文件为

该文件根据其上一级的Makefile文件在npm install时编译生成
启动的子进程数由server/config.js配置文件指定
numWorkers : Object.keys(os.cpus()).length,
也就是说它是由当前机器的CPU核数决定的。

我的虚拟机是2核的,因此程序启动了2个相同的子进程,对应代码位于server.js
async function runMediasoupWorkers()
{
const { numWorkers } = config.mediasoup; logger.info('running %d mediasoup Workers...', numWorkers); for (let i = 0; i < numWorkers; ++i)
{
// mediasoup.createWorker(settings):使用给定的设置创建一个新的工作进程
const worker = await mediasoup.createWorker(
{
logLevel : config.mediasoup.workerSettings.logLevel,
logTags : config.mediasoup.workerSettings.logTags,
rtcMinPort : config.mediasoup.workerSettings.rtcMinPort,
rtcMaxPort : config.mediasoup.workerSettings.rtcMaxPort
}); worker.on('died', () =>
{
logger.error(
'mediasoup Worker died, exiting in 2 seconds... [pid:%d]', worker.pid); setTimeout(() => process.exit(1), 2000);
}); mediasoupWorkers.push(worker);
}
}
多个worker之间的架构图如下(来源于官网)

4.4、创建expressapp实例,server用的是express框架,定义了对http请求的相关路由处理
4.5、启动https server,启用证书,监听配置文件定义的端口
4.6、启动websocket server(protoo server)
4.7、启动每隔30s检测room状态的定时器
其他:
Centos 7 git版本升级 流程一样,先yum remove git 卸载原本的1.8.1,然后开始安装最新发行版2.23,码云下载地址,我通过wget下载的github源码包解压后文件缺失,导致编译失败,引以为戒。
mediasoup-demo解析-服务端的更多相关文章
- Netty源码解析---服务端启动
Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...
- fastjson解析服务端返回的数据
1.配置依赖 //fastjson api 'com.alibaba:fastjson:1.2.44' 2.设计服务端返回的数据 {},{},{}]} 3.编写bean类,特别注意,要和服务端返回的类 ...
- android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据
补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访 ...
- Netty源码解析 -- 服务端启动过程
本文通过阅读Netty源码,解析Netty服务端启动过程. 源码分析基于Netty 4.1 Netty是一个高性能的网络通信框架,支持NIO,OIO等多种IO模式.通常,我们都是使用NIO模式,该系列 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示
申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- go语言游戏服务端开发(一)——架构
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. 网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏de ...
- JAVA学习第六十三课 — 关于client服务端 && URL类 & URLConnection
常见的client和服务端 client: 浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端: server:TomCat:1.处理请求 2.给予应答 想让TomC ...
随机推荐
- BZOJ #5457: 城市 [线段树合并]
线段树合并的板子题,每次从下到上合并就完事了 // by Isaunoya #include <bits/stdc++.h> using namespace std; #define re ...
- 【新人赛】阿里云恶意程序检测 -- 实践记录11.3 - n-gram模型调参
主要工作 本周主要是跑了下n-gram模型,并调了下参数.大概看了几篇论文,有几个处理方法不错,准备下周代码实现一下. xgboost参数设置为: param = {'max_depth': 6, ' ...
- PHP中根据二维数组中某个字段实现排序
想要实现二维数组中根据某个字段排序,一般可以通过数组循环对比的方式实现.这里介绍一种更简单的方法,直接通过PHP函数实现.array_multisort() :可以用来一次对多个数组进行排序,或者根据 ...
- gulp常用插件之gulp-babel使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-babel这是Babel的Gulp插件. 此自述文件适用于gulp-babel v8 + Babel v7检查7.x分支以了解使用Bab ...
- js微信禁用右上角的分享按钮,和vue中微信页面禁用右上角的分享按钮的问题
1.隐藏微信网页右上角的按钮 document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() { // 通过下面这个 ...
- Codeforces Round #624 (Div. 3)
A.题意:通过加奇数减偶数的操作从a到b最少需要几步 签到题 #include <algorithm> #include <iostream> #include <cst ...
- Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
获取外网ip curl icanhazip.com 服务器间的 文件 复制 scp root@ip:/源目录 目标目录 软连接 查看软连接 ls -li 创建软连接 ln -s 源文件 目标文件 -s ...
- Centos7 同时运行PHP5.2和PHP7.1配置
工作环境一直都是lnmp,其中PHP已经升级到7.1版本了.突然有份代码需要运行在PHP5.2上.但是之前的环境还是需要的,所以需要在centos中再安装PHP5.2. 0.之前的php7安装在/us ...
- WebGL_0001:3D页面的重置分辨率和横竖屏事件
1,事件 重置分辩率事件 window.addEventListener("resize", a, !1) 横竖屏切换事件 window.addEventListener(&quo ...
- 51nod1326 遥远的旅途(spfa+dp)
题意: 给出一个无向图,问从1到n是否存在一条长度为L的路径. n,m<=50,1<=路径长度<=10000,L<=10^18 思路: 改变一下思路,我们发现,假设从起点1走到 ...