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.0 start /usr/local/src/node/mediasoup-demo/server
> DEBUG=${DEBUG:='*mediasoup* *INFO* *WARN* *ERROR*'} INTERACTIVE=${INTERACTIVE:='true'} node server.js

- config.mediasoup.numWorkers: 2
- 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 2 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:8092] constructor() +0ms

[opening Readline Command Console...]
type help to print available commands
cmd>   mediasoup:Worker worker process running [pid:8092] +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:8094] constructor() +0ms
  mediasoup:Worker worker process running [pid:8094] +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       8074   2823  0 16:56 pts/0    00:00:00 npm
root       8085   8074  0 16:56 pts/0    00:00:00 mediasoup-demo
root       8092   8085  0 16:56 pts/0    00:00:00 /usr/local/src/node/mediasou
root       8094   8085  0 16:56 pts/0    00:00:00 /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源碼包解壓后文件缺失,導致編譯失敗,引以為戒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM