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 桌面系统安装 VSCode 编辑器

Centos 7 git版本升级 流程一样,先yum remove git 卸载原本的1.8.1,然后开始安装最新发行版2.23,码云下载地址,我通过wget下载的github源码包解压后文件缺失,导致编译失败,引以为戒。

mediasoup-demo解析-服务端的更多相关文章

  1. Netty源码解析---服务端启动

    Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...

  2. fastjson解析服务端返回的数据

    1.配置依赖 //fastjson api 'com.alibaba:fastjson:1.2.44' 2.设计服务端返回的数据 {},{},{}]} 3.编写bean类,特别注意,要和服务端返回的类 ...

  3. android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据

    补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访 ...

  4. Netty源码解析 -- 服务端启动过程

    本文通过阅读Netty源码,解析Netty服务端启动过程. 源码分析基于Netty 4.1 Netty是一个高性能的网络通信框架,支持NIO,OIO等多种IO模式.通常,我们都是使用NIO模式,该系列 ...

  5. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  6. 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...

  7. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  8. go语言游戏服务端开发(一)——架构

    五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例.   网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏de ...

  9. JAVA学习第六十三课 — 关于client服务端 &amp;&amp; URL类 &amp; URLConnection

    常见的client和服务端 client:       浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端:       server:TomCat:1.处理请求 2.给予应答 想让TomC ...

随机推荐

  1. SpringBoot原理—分析SpringBoot启动机制(starter机制)

    一:前言使用过springboot的同学应该已经知道,springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程.本文的目的就是一步步分析springboot的启动过 ...

  2. C#中调用Windows系统服务exe程序的工具类与重启服务的流程

    场景 使用C#编写的Windows服务程序,在Winform中进行调用. 常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法. 以在Winform中重启服务为例. 注: 博 ...

  3. day5 字典 dict

    数据类型划分:可变数据类型,不可变数据类型不可变数据类型:元组,数字,布尔,str, == 可哈希可变数据类型:list , dict, set == 不可哈希dict的 key 必须是不可变数据类型 ...

  4. node常用模块汇总

    node常用模块汇总: 点击插件名字,查看使用文档 npm常用模块汇总 node常用模块汇总 gulp常用插件汇总 mkdirp:在node.js中像mkdir -p一样递归创建目录及其子目录

  5. 《操作系统真象还原》MBR

    以下是读本书第三章的收获. 如何知道一个源程序的各符号(指令和变量)地址?简单来说,地址就是该符号偏移文件开头的距离,符号的地址是按顺序编排的,所以两个相邻的符号,其地址也是相邻的.对于指令来说,指令 ...

  6. How Many Tables HDU - 1213

    #include<iostream> using namespace std; ; int p[N]; int find(int x) { if(p[x]!=x) p[x]=find(p[ ...

  7. python之路(集合,深浅copy,基础数据补充)

    一.集合:类似列表,元组的存储数据容器,不同点是不可修改,不可重复.无序排列. 1.创建集合: (1).set1 = {'abby', 'eric'} result:{'eric', 'abby'} ...

  8. 【HTML】html5 canvas全屏烟花动画特效

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. 题解 P5718 【【深基4.例2】找最小值】

    题目传送门 思路 介绍一种新方法--sort排序,它的格式是这样的sort(a+1,a+n+1,cmp);,我们只需要把a数组排好序,然后输出第\(1\)个元素即可. 定义a数组与变量\(n\)并输入 ...

  10. java中给集合快速取值最大值和最小值

    public static void main(String[] args) { List list = new ArrayList(); list.add(new Double(123.23)); ...