MediaSoup MediaSoup-demo v3 版本部署测试

    技术2025-01-07  17

    环境

    系统

    软件源

    http://mirrors.aliyun.com/            // 即阿里云

    NodeJS 与 npm 版本

    npm 源

    GCC 版本

    准备过程

    安装 nodejs 以及 npm

    sudo apt install nodejs

    sudo apt install npm

    sudo npm install -g npm  // 全局安装 npm,即强制更新 npm 版本,否则 npm 版本为 3.5.2,即便是 sudo apt upgrade npm 也无济于事

    替换 npm 源

    sudo npm config set registry https://registry.npm.taobao.org

    sudo npm config list

    全局安装 n 管理器

    sudo npm install n -g

    安装最新的nodejs stable版本

    sudo n stable

    验证安装

    sudo node -v

    sudo npm -v

    安装过程

    mediasoup-demo下载安装

    git clone https://github.com/versatica/mediasoup-demo.git

    cd mediasoup-demo

    git checkout v3

    安装 server

    cd server

    sudo npm install

    成功如下

    安装 app

    cd ../app

    sudo npm install

    (忘记截图了 sorry ...)

    说明

    如果有国外vpn的情况下,或者访问 Github网络较好的情况下,以上步骤可能非常顺利,否则,以上步骤每一步都会因为网络问题而失败

    sudo npm install如果采用Ubuntu环境,那么无论是否是root用户,那么每一个 npm 命令都要带 sudo (以免发生意外的权限问题导致中途失败)

    失败了怎么办?

    其实,无论是Ubuntu的软件源,还是npm的软件源,我们都已经替换成了国内的景象,阿里云或者淘宝。但是,由于 Github 无国内镜像,所以 git clone 的操作都会耗时较长。

    另 npm install 的操作,需要从 Github 上去下载模块源码进行编译,以及需要 clang 工具,下载源码以及clang工具的时候, 都十分耗时,而且会经常失败。

    安装过程中,安装 server 失败怎么办?

    首先查看,当前目录下是否生成了 node_modules 目录

    如果有,删除,删除后,再一次执行 sudo npm install。

    以上过程需要不断重试。

    但是,也需要一些耐心,耗时会很长很长,5个小时10个小时都是有可能的。同理,app中 npm install 操作如果失败,采用同样的方式重试。

    如果以上过程都成功了,那么接下来的操作就相对简单了。

    第一,备份。 zip -r mediasoup-demo.zip mediasoup-demo

    第二,mediasoup-demo/server 目录下执行:

    cp config.example.js config.js

    第三,修改 config.js 中的个别配置

    1. domain : process.env.DOMAIN || 'localhost',

    将 localhost 位置的内容,修改成安装 mediasoup-demo 的ip。

    2. listenIp   : '0.0.0.0',

    将以上ip 配置为 0.0.0.0 或者 本机ip。

    3. 找到以下两个配置块儿:

    将其中的 x.x.x.x 以及 y.y.y.y 的 ip 都替换成 本机 ip。 webRtcTransportOptions : {        listenIps :     [            {                ip          : process.env.MEDIASOUP_LISTEN_IP || 'x.x.x.x',             announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP         }        ],       initialAvailableOutgoingBitrate : 1000000,     minimumAvailableOutgoingBitrate : 600000,     maxSctpMessageSize              : 262144,     // Additional options that are not part of WebRtcTransportOptions.     maxIncomingBitrate              : 1500000 },   // mediasoup PlainTransport options for legacy RTP endpoints (FFmpeg, // GStreamer). // See https://mediasoup.org/documentation/v3/mediasoup/api/#PlainTransportOptions plainTransportOptions : {        listenIp :     {            ip          : process.env.MEDIASOUP_LISTEN_IP || 'y.y.y.y',         announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP     },       maxSctpMessageSize : 262144 }   

    运行

    mediasoup-demo/server 目录下依次执行如下命令

    sudo mkdir certs

    sudo cd certs

    sudo openssl genrsa > privkey.pem

    sudo openssl req -new -x509 -key privkey.pem > fullchain.pem

    mediasoup-demo/server 目录下 执行 sudo npm start

    新开一个终端

    mediasoup-demo/app 目录下 执行 sudo npm start

    在 app start 终端中,如果看到如下内容,表示启动成功

    [Browsersync] Access URLs:  ----------------------------------------------        Local: https://localhost:3000/?info=true     External: https://192.168.0.101:3000/?info=true  ----------------------------------------------           UI: http://localhost:3001  UI External: http://localhost:3001  ---------------------------------------------- [Browsersync] Serving files from: ../server/public [Browsersync] Watching files...

    任意一台局域网内的电脑,都可以使用如下 URL 加会测试了。

    https://192.168.0.101:3000/?info=true

    注意

    在浏览器端登录的时候

    第一 尽量采用 Chrome 的浏览器,版本尽量高一些,实验Chrome是80.0版本。

    第二 虽然是https 协议,但是,证书是我们自己生成的。所以,浏览器会提示有问题。我们进行进入高级选项,继续访问即可。

    第三 我们一定要确保我们的加会PC机有可用的麦克风以及摄像头,并且,浏览器选项登录时,赋予其权限。

    查看一些信息

    进程信息

    pidof npm

    pidof mediasoup-demo

    ps -ef | grep mediasoup

    ps -ef | grep npm

    端口占用信息

    netstat -anp | grep tcp

    netstat -anp | grep udp

    netstat -anp | grep mediasoup

    退出

    到对应的终端 Ctrl+C 即可。

    问题

    如果是异常退出,如何清理干净?

    便用以上的命令去排查。

    如果端口是被带 npm 或者 mediasoup 字样的进程占用,那么,kill -9 pid 杀死对应进程。

    在无浏览器端有人加会的情况下

    mediasoup 不会占用 udp 端口,因为此时 rtp/rtcp 通道(channel)并未被信令协商开启。

    mediasoup 会占用若干 tcp 端口,默认的情况下:

    如 3000,30001,4443 等。

    mediasoup 会占用大量 Unix 域套接字以及PIPE 资源

    二者的作用,主要就是 Linux 进程间通讯。

    所以 mediasoup 其实是一个多进程的应用。

    进一步的查看

    pidof mediasoup-demo

    pidof mediasoup-worker

    拿到对应的 pid 之后,我们可以 lsof -p pid 瞅一瞅看一看,可以大致了解一下 mediasoup 底层到底用了什么样技术。

    比如, 1. 多个woker进程(本例中 config.js 中,work的number 我改成了1.如下图)

    2. Unix域套接字以及PIPE等做进程间通信

    3. EPOLL 进行异步IO触发

    4. TCP/UDP 通信

    等等

    各种命令的查看结果

     

    mediasoup-demo 进程

    最终效果

    注意如何浏览器访问会议的方式

    第一个加会人员地址

     https://192.168.0.101:3000/?info=true

    加会过程中,第一并不是有效的 https 的连接,因为证书不是权威机构发放的证书,而是我们用openssl手动生成的,所以会有安全提示,用chrome浏览器时,我们选择高级,继续前往即可。成功之后,网页地址栏地址会被修改(server端重定向了)。类似如下:

     https://192.168.0.101:3000/?info=true&roomId=20ah24h

    后面加会的人,如果需要加入到同一个会中,就必须采用上面代码 roomId 的 url。两个人才可以通讯。

    上面结果图说明

    双大屏,实际是一台windows 台式机器,一拖二,是与会者之一。

    笔记本,是与会者之二。

    鼠标旁红色摄像头,实际是台式机器摄像头。

    笔记本,视频数据,不是来自摄像头,而是来自屏幕共享,共享的内容是chrome浏览器的一个默认的空地址栏的标签页。

    部署的Ubuntu环境是第三台机器。作为server,结果图中右侧secureCRT中显式的就是ssh连接的该server的情况。

    利用 demo项目进行 mediasoup 的源代码学习

    在 server 的 node_modules 目录下有各 mediasoup 目录,该目录下,即为 GitHub 上 对应版本(v3)的源代码的 git clone 代码。我们修改了该 mediasoup的代码,那么在就需要回到 server 目录下 执行

    sudo npm rebuild

    后面,server 下 sudo npm start  后 app 下  sudo npm start 接口。

    此时,我们修改了的 mediasoup 的代码,便会在该demo项目中生效。

    Processed: 0.009, SQL: 9