mediasoup-demo公網(wǎng)部署

服務(wù)器環(huán)境

  • CentOS7
  • Node.js v14.17.5
  • GCC v9.1.1
  • Python 2.7.5 (3也沒問題,不過要注意編譯腳本需要的python的命令,對(duì)python3做個(gè)軟鏈接好了)

node.js安裝

通過nvm安裝的node.js開發(fā)運(yùn)行環(huán)境 (這里獲取最新的nvm install script)

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

完成后,退出再登陸,使環(huán)境變量生效。

如果安裝出錯(cuò),移除nvm也很方便,記一下
cd ~
rm -rf .nvm
同時(shí)刪除~/.profile, ~/.bash_profile, ~/.zshrc, ~/.bashrc文件中關(guān)于nvm的配置
比如.bashrc里的export NVM_DIR 那段語句刪除,其他類似

這里補(bǔ)充一下:
sudo su -
注意后面的-,su 后面不加用戶是默認(rèn)切到 root。su 是不改變當(dāng)前環(huán)境變量,su - 是改變?yōu)榍袚Q目標(biāo)用戶的環(huán)境變量,也就是說su只能獲得root的執(zhí)行權(quán)限,不能獲得root的環(huán)境變量,而su -是切換到root并獲得root的環(huán)境變量及執(zhí)行權(quán)限。

安裝node.js v14.17.5(目前官網(wǎng)的LTS版)

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

node-gyp gulp-cli 有的時(shí)候不需要單獨(dú)運(yùn)行安裝指令,你如果遇見相關(guān)的問題提示,就單獨(dú)安裝一下好了。

GCC新版安裝

CentOS7默認(rèn)的gcc版本是v4.8.5,mediasoup由于用了大量c++11特性,要求>= 4.9。編譯安裝太麻煩了,我直接運(yùn)行下面的命令安裝v9。

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

注意,重新登錄后運(yùn)行下 scl enable devtoolset-9 bash 進(jìn)行切換就好了,否則還是默認(rèn)的版本。

自簽名證書

v3新版本demo沒有生成證書,需要自行生成證書并且放置相對(duì)應(yīng)的目錄。
如果你有自己的域名和證書是最好了,如果沒有生成針對(duì)IP的自簽名證書,也沒有問題,測(cè)試足夠了。只是使用過程中,建議使用FireFox或者Safari,他們打開自簽名的https網(wǎng)站,可以讓你選擇忽略安全繼續(xù)打開。而Chrome貌似只能通過命令行方式打開才能忽略安全問題,略麻煩。

使用如下命令生成 HTTPS 協(xié)議使用的公鑰和私鑰對(duì),其中key表示私鑰,crt表示公鑰:

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

會(huì)讓輸入一些相關(guān)信息,直接回車忽略好了
生成證書后,將證書和私鑰文件復(fù)制到 mediasoup-demo/server/certs 目錄下。(mkdir -p certs)

mediasoup-demo

下載demo源碼,只需要下載demo,后續(xù)安裝編譯會(huì)自動(dòng)下載到需要的代碼,而且目前的默認(rèn)分支其實(shí)已經(jīng)是v3了。

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

代碼有4個(gè)目錄

aiortc // 不知道是什么鬼,還沒看
app // 客戶端代碼
broadcasters // 用戶推流模塊,比如用FFmpeg推流到mediasoup。
server // 服務(wù)端代碼,包括信令服務(wù)+媒體服務(wù)

編譯安裝server

cd server
npm install

會(huì)下載node需要的module,其中c++部分的mediasoup代碼會(huì)下載到 mediasoup-demo/server/node_modules/mediasoup 目錄下,這個(gè)目錄其實(shí)就是 mediasoup ,這個(gè)項(xiàng)目worker目錄下是c++,后續(xù)自己有修改后直接make就可以。

結(jié)束會(huì)有提示

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

先不管這些,并不影響實(shí)際的使用,相關(guān)資料可以看一下npm文檔。

接下來根據(jù)實(shí)際修改配置文件,從 config.example.js 復(fù)制一份修改就好。

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

主要有幾個(gè)地方

  • 自簽名證書和https信令監(jiān)聽端口
    上面已經(jīng)將證書拷貝到certs目錄下了,因此也就不需要修改config里面的目錄設(shè)置了。
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配置項(xiàng)有的資料表示需要改成本機(jī)的公網(wǎng)IP,但是我用0.0.0.0,也沒發(fā)現(xiàn)有問題。注意這里的4443端口,也許瀏覽器也要單獨(dú)訪問下https://xxx.xxx.xxx.xxx:4443/ 忽略安全問題放行,否則你的wss連接會(huì)被拒絕,比如Firefox。
這里還可以修改信令監(jiān)聽的端口4443,但是要注意對(duì)應(yīng)修改客戶端的配置了?。聪旅鎔ulp的說明)

  • webRtcTransportOptions 和 plainTransportOptions(xxx.xxx.xxx.xxx是你的公網(wǎng)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'也能使用,有的資料顯示配置成本機(jī)的內(nèi)網(wǎng)IP也可以正常運(yùn)行,原因以后再深究吧。我測(cè)試配置的都是公網(wǎng)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的服務(wù)端口范圍設(shè)置為15000~15100,需要對(duì)公網(wǎng)開放這個(gè)范圍內(nèi)的UDP端口訪問權(quán)限。

啟動(dòng) npm start

安裝客戶端App

cd app
npm install

如果報(bào)錯(cuò)

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

啟動(dòng) npm start,這個(gè)App啟動(dòng)如果是在Desktop版Linux上,會(huì)自動(dòng)運(yùn)行起來默認(rèn)瀏覽器,服務(wù)器上當(dāng)然忽略。

因?yàn)榭蛻舳四J(rèn)監(jiān)聽在 3000 端口,當(dāng)需要更該客戶端默認(rèn)監(jiān)聽端口時(shí),需在 mediasoup-demo/app/gulpfile.js 文件中的 browserSync 添加端口配置,如下:

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

如果上面config.js里修改了https的默認(rèn)4443端口,那么記住同時(shí)要修改 mediasoup-demo/app/lib/urlFactory.js 文件中的端口:

let protooPort = 4443;

修改完成后,重新使用 gulp 打包客戶端代碼發(fā)布到 mediasoup-demo/server/public 路徑下。

打開本地機(jī)器的瀏覽器測(cè)試吧!

https://xxx.xxx.xxx.xxx:3000/
這里要補(bǔ)充下,如果是Safari,提示安全問題,忽視進(jìn)入就可以了。
如果是Firefox,還需要單獨(dú) 訪問下 https://xxx.xxx.xxx.xxx:4443/ ,忽略安全問題,繼續(xù),否則wss連接會(huì)被拒絕。

https://xxx.xxx.xxx.xxx:3000/訪問會(huì)隨機(jī)分配一個(gè)roomid,另一個(gè)客戶端就可以帶上這個(gè)roomid加入,比如
https://xxx.xxx.xxx.xxx:3000/?roomId=0umla1f2&info=true&forceH264=true
參數(shù)info=true會(huì)打開統(tǒng)計(jì)欄,forceH264=true會(huì)強(qiáng)制使用H264。放個(gè)圖

H264 兩臺(tái)不同機(jī)器上的客戶端
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容