http://mirrors.aliyun.com/ // 即阿里云
sudo apt install nodejs
sudo apt install npm
sudo npm install -g npm // 全局安装 npm,即强制更新 npm 版本,否则 npm 版本为 3.5.2,即便是 sudo apt upgrade npm 也无济于事
sudo npm config set registry https://registry.npm.taobao.org
sudo npm config list
sudo npm install n -g
sudo n stable
sudo node -v
sudo npm -v
git clone https://github.com/versatica/mediasoup-demo.git
cd mediasoup-demo
git checkout v3
cd server
sudo npm install
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工具的时候, 都十分耗时,而且会经常失败。
首先查看,当前目录下是否生成了 node_modules 目录
如果有,删除,删除后,再一次执行 sudo npm install。
以上过程需要不断重试。
但是,也需要一些耐心,耗时会很长很长,5个小时10个小时都是有可能的。同理,app中 npm install 操作如果失败,采用同样的方式重试。
cp config.example.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
双大屏,实际是一台windows 台式机器,一拖二,是与会者之一。
笔记本,是与会者之二。
鼠标旁红色摄像头,实际是台式机器摄像头。
笔记本,视频数据,不是来自摄像头,而是来自屏幕共享,共享的内容是chrome浏览器的一个默认的空地址栏的标签页。
部署的Ubuntu环境是第三台机器。作为server,结果图中右侧secureCRT中显式的就是ssh连接的该server的情况。
在 server 的 node_modules 目录下有各 mediasoup 目录,该目录下,即为 GitHub 上 对应版本(v3)的源代码的 git clone 代码。我们修改了该 mediasoup的代码,那么在就需要回到 server 目录下 执行
sudo npm rebuild
后面,server 下 sudo npm start 后 app 下 sudo npm start 接口。
此时,我们修改了的 mediasoup 的代码,便会在该demo项目中生效。