服務(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
runnpm fundfor detailsfound 11 vulnerabilities (7 low, 2 moderate, 2 high)
runnpm audit fixto fix them, ornpm auditfor 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è)圖
