相关连接
Mediasoup 的基本结构
mediasoup design
- mediasoup 模块
- javaScript层开发的对外接口层,Node.js服务。提供Signal服务(房间服务、SDP、等数据)。
- C/C++ 模块,用于媒体数据交换层(ICE, DTLS, RTP and so on),UDP类型数据交换。
两个模块相互通信,但是开发者无需关心C/C++模块,只要关心JavaScript Api使用即可。
- mediasoup Work模块架构
-
C/C++ Worker模块包括Router和WebRtcTransport。
-
Router用于流媒体复制转发,WebRtcTransport维护与客户端的通信。
-
Worker:
一个Worker代表着一个运行在单核CPU上并处理Router实例的mediasoup C++子进程;
-
Router:
Router用于注入、选择和转发通过Transport实例创建的媒体流;类似于房间功能,一个Router只能在一个worker进程中产生;
-
Transport:
Transport将终端与MediaSoup Router连接起来,并通过在其上创建的Producer和Consumer实例实现双向媒体传输,实 现了下面3种Transport:WebRtcTransport,PlainRtpTransport,PipeTransport.
-
安装
安装mediasoup的Node.js模块通过NPM工具
$ npm install mediasoup@3 --save
Mediasoup C/C++模块必须已经编译而且安装完毕,并且在目标服务器上已经可以使用。安装时会自动编译。注意编译报错,并及时解决。
安装完成后当前目录下会有 node_modules 文件夹 和package-lock.json文件 -
mediasoup重要目录结构
进入node_moduels目录下查看mediasoup目录结构
- worker目录:mediasoup的c++模块,用于生产 mediasoup-work进程的二进制文件和源代码
- lib目录:mediasoup的Node.js模块,用于对外提供接口,用于创建mediasoup-work进程,并且充当第三方程序和该进程通信的中间层。
- test目录:具体的示例代码,可以看看如同启动mediasoup-work模块,如何创建router(room)等
-
mediasoup Node.js 模块说明
Node.js模块主要提供API接口,用于创建mediasoup-work进程,并且提供控制该进程的接口,充当其它进程和mediasoup-work进程通信的桥梁。 注:加粗部分是重点模块,需要详细看代码
- AudioLevelObserver.js: 用于检测声音的大小, 通过C++检测音频声音返回应用层,通过Observer接收并展示音频大小
- Channel.js:实现于C++模块的通信部分
- Consume.js: 消费媒体数据(video audio)
- EnhancedEventEmitter.js:EventEmitter的封装,C++底层向上层发送事件
- Logger.js:日志模块
- PipeTransport.js:控制Router之间的转发
- PlainRtpTransport.js:控制普通的rtp传输通道,如FFmpeg等不经过浏览器rtp协议的数据传输
- Producer.js:生产媒体数据,音频或视频
- Router.js:代表一个房间或者一个路由器
- Transport.js:所有传输的的基类(父类)
- WebRtcTransport.js:浏览器使用的传输接口。
- Worker.js:用于创建mediasoup-work进程的类,一个房间只能在一个Worker里。
- Error.js:错误信息的定义
- Index.js:Mediasoup的库,上层引入Mediasoup最先导入的库,也为库的索引。
- Ortc.js: 其与SDP相对应,以对象的形式标识SDP,如编解码参数,编解码器,帧 率等,以对象方式去存储。
- ScalabilityModes.js:扩容模块,广播等功能可以用到。
- SupportedRtpCapabilities.js:对通讯能力的支持,实际上是媒体协商相关的东西,如你支持的帧率, 码率,编解码器是什么等
-
代码调用
Node.js服务调用mediasoup接口
//your Node.js application: const mediasoup = require("mediasoup");
Node.js模块通过管道(Unix pipe)和mediasoup-worker进程间通信。所以无法实现管理进程和工作进程分离在不同主机上面。
worker.js模块调用说明:
//简单的创建一个Worker进程,具体参考test目录里面的示例代码 const os = require('os'); const process = require('process'); const { toBeType } = require('jest-tobetype'); const mediasoup = require('../'); const { createWorker, observer } = mediasoup; const { InvalidStateError } = require('../lib/errors'); expect.extend({