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 ...
随机推荐
- 【python基础语法】数据类型:数值、字符串 (第2天课堂笔记)
""" 数据类型: 一.数值类型:整数 浮点数 布尔值 二.序列类型:字符串.列表 元祖 三.散列类型:字典 集合 可变数据类型: 列表 字典 集合,可以改动内存地址数据 ...
- [Blog] Part1: 技术札记-写个创站小结吧
创站绝对是一个大坑 我当初真有勇气.. 嗯 这个站主要就是 Github+Jekyll+markdown 基本上还是现在能用的比较习惯的模式 基本流程概述 域名 -> 修改DNS -> g ...
- JAVA控制流程
Java代码有三种执行结构流程,顺序结构.分支结构.循环结构 顺序结构 顺序结构是最简单的代码执行结构,从代码开始逐步执行每一句代码到结束 public class C { public static ...
- Lodash是什么?
lodash:是一个一致性.模块化.高性能的 JavaScript 实用工具库.(也就是相当于自己封装的私有方法) node里引入 // Load the full build. var _ = re ...
- PHP0007:PHP基础-字符串
php设置编码 用gbk编码识别utf8字符
- Json与Ajax(注册实例)
需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: "./server/slider.json", type: "po ...
- 题解【洛谷P1596】[USACO10OCT]Lake Counting
题面 \(\text{Flood Fill}\) 模板题. \(\text{Flood Fill}\) 可以快速求出一个图中连通块的个数. 大概就是遍历每一个点,如果它没有被遍历过且是一个新连通块,那 ...
- 题解 P5712 【【深基3.例4】Apples】
题目传送门 思路 仔细读题后,我们可以发现,输出可以分成\(2\)种情况,apple加s与apple不加s,所以我们可以使用if/else来实现. 接着,我们读入n. int n; cin>&g ...
- 非最大抑制,挑选和目标重叠框 yolo思想原理
非最大抑制,挑选和目标重叠框 yolo思想原理 待办 https://blog.csdn.net/shuzfan/article/details/52711706 根据分类器类别分类概率做排序,(框的 ...
- EL表达式无法获取boolean类型变量值
今天调试个程序, 有个名为isAdmin的boolean类型的变量在jsp页面获取到的值为空, 这根本就是没获取到或者变量不存在的状况啊,但是在Action中明明是赋值成false了. 上网查了一下有 ...