mediasoup-demo公网部署

服务器环境

  • CentOS7
  • Node.js v14.17.5
  • GCC v9.1.1
  • Python 2.7.5 (3也没问题,不过要注意编译脚本需要的python的命令,对python3做个软链接好了)

node.js安装

通过nvm安装的node.js开发运行环境 (这里获取最新的nvm install script)

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

完成后,退出再登陆,使环境变量生效。

如果安装出错,移除nvm也很方便,记一下
cd ~
rm -rf .nvm
同时删除~/.profile, ~/.bash_profile, ~/.zshrc, ~/.bashrc文件中关于nvm的配置
比如.bashrc里的export NVM_DIR 那段语句删除,其他类似

这里补充一下:
sudo su -
注意后面的-,su 后面不加用户是默认切到 root。su 是不改变当前环境变量,su - 是改变为切换目标用户的环境变量,也就是说su只能获得root的执行权限,不能获得root的环境变量,而su -是切换到root并获得root的环境变量及执行权限。

安装node.js v14.17.5(目前官网的LTS版)

nvm ls-remote
nvm install 14.17.5
npm install -g node-gyp
npm install -g gulp-cli

node-gyp gulp-cli 有的时候不需要单独运行安装指令,你如果遇见相关的问题提示,就单独安装一下好了。

GCC新版安装

CentOS7默认的gcc版本是v4.8.5,mediasoup由于用了大量c++11特性,要求>= 4.9。编译安装太麻烦了,我直接运行下面的命令安装v9。

sudo yum install centos-release-scl
sudo yum install devtoolset-9-gcc*
scl enable devtoolset-9 bash
which gcc
gcc --version

注意,重新登录后运行下 scl enable devtoolset-9 bash 进行切换就好了,否则还是默认的版本。

自签名证书

v3新版本demo没有生成证书,需要自行生成证书并且放置相对应的目录。
如果你有自己的域名和证书是最好了,如果没有生成针对IP的自签名证书,也没有问题,测试足够了。只是使用过程中,建议使用FireFox或者Safari,他们打开自签名的https网站,可以让你选择忽略安全继续打开。而Chrome貌似只能通过命令行方式打开才能忽略安全问题,略麻烦。

使用如下命令生成 HTTPS 协议使用的公钥和私钥对,其中key表示私钥,crt表示公钥:

openssl req -new -newkey rsa:1024 -x509 -sha256 -days 3650 -nodes -out fullchain.pem -keyout privkey.pem

会让输入一些相关信息,直接回车忽略好了
生成证书后,将证书和私钥文件复制到 mediasoup-demo/server/certs 目录下。(mkdir -p certs)

mediasoup-demo

下载demo源码,只需要下载demo,后续安装编译会自动下载到需要的代码,而且目前的默认分支其实已经是v3了。

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

代码有4个目录

aiortc // 不知道是什么鬼,还没看
app // 客户端代码
broadcasters // 用户推流模块,比如用FFmpeg推流到mediasoup。
server // 服务端代码,包括信令服务+媒体服务

编译安装server

cd server
npm install

会下载node需要的module,其中c++部分的mediasoup代码会下载到 mediasoup-demo/server/node_modules/mediasoup 目录下,这个目录其实就是 mediasoup ,这个项目worker目录下是c++,后续自己有修改后直接make就可以。

结束会有提示

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 791 packages from 414 contributors and audited 792 packages in 99.474s
26 packages are looking for funding
run npm fund for details

found 11 vulnerabilities (7 low, 2 moderate, 2 high)
run npm audit fix to fix them, or npm audit for details

先不管这些,并不影响实际的使用,相关资料可以看一下npm文档。

接下来根据实际修改配置文件,从 config.example.js 复制一份修改就好。

cp config.example.js config.js
vi config.js

主要有几个地方

  • 自签名证书和https信令监听端口
    上面已经将证书拷贝到certs目录下了,因此也就不需要修改config里面的目录设置了。
https  :
        {
                listenIp   : '0.0.0.0',
                // NOTE: Don't change listenPort (client app assumes 4443).
                listenPort : process.env.PROTOO_LISTEN_PORT || 4443,
                // NOTE: Set your own valid certificate files.
                tls        :
                {
                        cert : process.env.HTTPS_CERT_FULLCHAIN || `${__dirname}/certs/fullchain.pem`,
                        key  : process.env.HTTPS_CERT_PRIVKEY || `${__dirname}/certs/privkey.pem`
                }
        },

listenIp配置项有的资料表示需要改成本机的公网IP,但是我用0.0.0.0,也没发现有问题。注意这里的4443端口,也许浏览器也要单独访问下https://xxx.xxx.xxx.xxx:4443/ 忽略安全问题放行,否则你的wss连接会被拒绝,比如Firefox。
这里还可以修改信令监听的端口4443,但是要注意对应修改客户端的配置了!(看下面gulp的说明)

  • webRtcTransportOptions 和 plainTransportOptions(xxx.xxx.xxx.xxx是你的公网IP)
listenIps :
        [
                {
                        // ip          : process.env.MEDIASOUP_LISTEN_IP || '1.2.3.4',
                        ip          : process.env.MEDIASOUP_LISTEN_IP || 'xxx.xxx.xxx.xxx',
                        // announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP
                        announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP || 'xxx.xxx.xxx.xxx'    
                 }
        ],

ip配置我用'0.0.0.0'也能使用,有的资料显示配置成本机的内网IP也可以正常运行,原因以后再深究吧。我测试配置的都是公网IP。

  • RTP 传输端口范围
                workerSettings :
                {
                        logLevel : 'warn',
                        logTags  :
                        [
                                'info',
                                'ice',
                                'dtls',
                                'rtp',
                                'srtp',
                                'rtcp',
                                'rtx',
                                'bwe',
                                'score',
                                'simulcast',
                                'svc',
                                'sctp'
                        ],
                        rtcMinPort : process.env.MEDIASOUP_MIN_PORT || 15000,
                        rtcMaxPort : process.env.MEDIASOUP_MAX_PORT || 15100
                },

这里将RTP的服务端口范围设置为15000~15100,需要对公网开放这个范围内的UDP端口访问权限。

启动 npm start

安装客户端App

cd app
npm install

如果报错

npm ERR! code EINVALIDTAGNAME
npm ERR! Invalid tag name ">=^16.0.0": Tags may not have any characters that encodeURIComponent encodes.

npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2021-08-27T08_18_32_998Z-debug.log

改成

npm install --legacy-peer-deps

启动 npm start,这个App启动如果是在Desktop版Linux上,会自动运行起来默认浏览器,服务器上当然忽略。

因为客户端默认监听在 3000 端口,当需要更该客户端默认监听端口时,需在 mediasoup-demo/app/gulpfile.js 文件中的 browserSync 添加端口配置,如下:

                browserSync(
                        {
                                open      : 'external',
                                host      : config.domain,
                                // port      : xxxx,                 // 不加就是gulp默认的3000端口
                                startPath : '/?info=true',
                                server    :
                                {
                                        baseDir : OUTPUT_DIR
                                },
                                https     : config.https.tls,
                                ghostMode : false,
                                files     : path.join(OUTPUT_DIR, '**', '*')
                        });

如果上面config.js里修改了https的默认4443端口,那么记住同时要修改 mediasoup-demo/app/lib/urlFactory.js 文件中的端口:

let protooPort = 4443;

修改完成后,重新使用 gulp 打包客户端代码发布到 mediasoup-demo/server/public 路径下。

打开本地机器的浏览器测试吧!

https://xxx.xxx.xxx.xxx:3000/
这里要补充下,如果是Safari,提示安全问题,忽视进入就可以了。
如果是Firefox,还需要单独 访问下 https://xxx.xxx.xxx.xxx:4443/ ,忽略安全问题,继续,否则wss连接会被拒绝。

https://xxx.xxx.xxx.xxx:3000/访问会随机分配一个roomid,另一个客户端就可以带上这个roomid加入,比如
https://xxx.xxx.xxx.xxx:3000/?roomId=0umla1f2&info=true&forceH264=true
参数info=true会打开统计栏,forceH264=true会强制使用H264。放个图

H264 两台不同机器上的客户端
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349