mediasoup-demo 运行实战
mediasoup 是一個強大的 WebRTC SFU 服務。mediasoup-demo?則是 mediasoup 的一個很不錯的入門演示程序。這里記錄把 mediasoup-demo 跑起來的過程。操作系統平臺以 Ubuntu 20.04 為例。mediasoup 主要以 JavaScript 開發,運行環境為 Node.js,它一般作為 Node.js 模塊運行于 Node.js 應用中。
準備環境
mediasoup v3 的 安裝指南 中有安裝要求:
- node version >= v12.0.0
- python version >= 3.6 with PIP
- GNU make
對于 Linux,OSX 和任何 *NIX 系統,還有額外的要求:
- gcc 和 g++ >= 4.9 或 clang (包含 C++11 支持)
- cc 和 c++ 命令 (符號連接) 指向對應的 gcc/g++ 或 clang/clang++ 可執行文件。
當系統軟件庫中的 node 版本不符合要求時,需要自己安裝適當版本的 Node。Node 版本不合適,很有可能 demo 就運行不起來。筆者試了多個版本都沒能把 mediasoup 跑起來,包括 v13.1.0、v13.10.0 和最新的長期支持版 v16.13.1,不過在 sequelize 的 GitHub issue 12419 ,看到有人提到用 v12.18.3 解決了筆者遇到的一些問題,筆者也選擇了 v12.18.3 版。
下載 node 的預編譯壓縮包:
https://nodejs.org/dist/如果系統中已經安裝了其它版本的 node,在安裝之前,還需要先移除之前安裝的版本:
sudo rm -rf /usr/local/bin/npm /usr/local/share/man/man1/node* ~/.npm sudo rm -rf /usr/local/lib/node* sudo rm -rf /usr/local/bin/node* sudo rm -rf /usr/local/include/node*sudo apt-get purge nodejs npm sudo apt autoremove解壓并安裝 node:
tar -xf node-v12.18.3-linux-x64.tar.xz sudo mv node-v12.18.3-linux-x64/bin/* /usr/local/bin/ sudo mv node-v12.18.3-linux-x64/lib/node_modules/ /usr/local/lib/安裝 mediasoup-demo
下載 mediasoup-demo,克隆 mediasoup-demo 工程
$ git clone https://github.com/versatica/mediasoup-demo.git $ cd mediasoup-demo $ git checkout v3設置 mediasoup-demo server:
mediasoup-demo$ cd server server$ npm install拷貝 config.example.js 到 config.js,并對它做一些定制化的修改:
$ cp config.example.js config.js這一步是必須的,否則 mediasoup-demo 運行將出錯。所需要做的配置包括域名,監聽的 IP 地址,HTTPS 證書和私鑰的路徑
域名、監聽 HTTPS 的 IP/端口、證書路徑及私鑰路徑:
domain : process.env.DOMAIN || 'localhost',// Signaling settings (protoo WebSocket server and HTTP API server).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`}},這些配置可以通過修改 config.js 實現,也可以通過設置環境變量實現。這里不修改這些配置,將 TLS 證書和私鑰放進 mediasoup-demo/server/certs/ 并按照這里的配置重命名。如果已經有網站域名,網站已經開了 HTTPS,且打算將 mediasoup-demo 跑在網站同一臺機器上,可以將證書和私鑰拷貝過來,或者用環境變量 HTTPS_CERT_FULLCHAIN 和 HTTPS_CERT_PRIVKEY 分別指向證書和私鑰的路徑:
export HTTPS_CERT_FULLCHAIN="XXX" export HTTPS_CERT_PRIVKEY="YYY"否則,可以用工具 https://github.com/aggresss/playground-cpp/blob/master/certs/autogen.sh 生成臨時的自簽名證書,運行這個腳本生成如下文件:
playground-cpp/certs$ git status 位于分支 master 您的分支與上游分支 'origin/master' 一致。尚未暫存以備提交的變更:(使用 "git add <文件>..." 更新要提交的內容)(使用 "git restore <文件>..." 丟棄工作區的改動)修改: ca.crt修改: ca.csr修改: ca.key修改: ca.srl修改: client.crt修改: client.csr修改: client.key修改: md5.txt修改: server.crt修改: server.csr修改: server.keyserver.key 是私鑰,server.crt 是證書。將這兩個文件拷貝到 mediasoup-demo 下:
playground-cpp/certs$ mkdir -p ~/mediasoup-demo/server/certs/ playground-cpp/certs$ mv server.key ~/mediasoup-demo/server/certs/privkey.pem playground-cpp/certs$ mv server.crt ~/mediasoup-demo/server/certs/fullchain.pem沒有私鑰和證書,運行服務器應用時會報錯找不到證書:
mediasoup-demo-server:INFO running an HTTPS server... +6ms (node:396580) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, open '~/mediasoup-demo/server/certs/fullchain.pem'at Object.openSync (fs.js:462:3)at Object.readFileSync (fs.js:364:35)at runHttpsServer (~/mediasoup-demo/server/server.js:431:13)at run (~/mediasoup-demo/server/server.js:74:8)at processTicksAndRejections (internal/process/task_queues.js:97:5) (node:396580) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2) (node:396580) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.運行瀏覽器應用時會報錯找不到私鑰:
[16:02:19] Finished '<anonymous>' after 27 ms [16:02:19] Finished 'live' after 14 s internal/fs/utils.js:269throw err;^Error: ENOENT: no such file or directory, open '~/mediasoup-demo/server/certs/privkey.pem'at Object.openSync (fs.js:462:3)at Object.readFileSync (fs.js:364:35)at getKey (~/mediasoup-demo/app/node_modules/browser-sync/dist/server/utils.js:38:15)at getHttpsServerDefaults (~/mediasoup-demo/app/node_modules/browser-sync/dist/server/utils.js:45:14)at Object.getHttpsOptions (~/mediasoup-demo/app/node_modules/browser-sync/dist/server/utils.js:67:41)at ~/mediasoup-demo/app/node_modules/browser-sync/dist/server/utils.js:81:44at Object.getServer (~/mediasoup-demo/app/node_modules/browser-sync/dist/server/utils.js:85:15)at createServer (~/mediasoup-demo/app/node_modules/browser-sync/dist/server/static-server.js:71:24)at createServer (~/mediasoup-demo/app/node_modules/browser-sync/dist/server/index.js:72:42)at module.exports.plugin (~/mediasoup-demo/app/node_modules/browser-sync/dist/server/index.js:12:20) {errno: -2,syscall: 'open',code: 'ENOENT',path: '~/mediasoup-demo/server/certs/privkey.pem' } npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! mediasoup-demo-app@3.0.0 start: `gulp live` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the mediasoup-demo-app@3.0.0 start script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above.npm ERR! A complete log of this run can be found in: npm ERR! ~/.npm/_logs/2021-12-24T08_02_19_135Z-debug.log還有一個必須要配置的是 RTC 傳輸選項中的監聽 IP MEDIASOUP_LISTEN_IP:
webRtcTransportOptions :{listenIps :[{ip : process.env.MEDIASOUP_LISTEN_IP || '1.2.3.4',announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP}],initialAvailableOutgoingBitrate : 1000000,minimumAvailableOutgoingBitrate : 600000,maxSctpMessageSize : 262144,// Additional options that are not part of WebRtcTransportOptions.maxIncomingBitrate : 1500000},這個選項同樣既可以通過修改 config.js 配置,也可以通過設置環境變量配置。監聽的 IP 地址需要設置為機器本地 IP 地址。否則,瀏覽器應用運行和服務器通信時,服務器將報錯:
mediasoup:Router createWebRtcTransport() +3smediasoup:Channel request() [method:router.createWebRtcTransport, id:5] +3smediasoup:ERROR:Channel [pid:396733 RTC::PortManager::Bind() | throwing MediaSoupError: port bind failed due to address not available [transport:udp, ip:'1.2.3.4', port:42251, attempt:1/10000] +0msmediasoup:ERROR:Channel [pid:396733 Worker::OnChannelRequest() | throwing MediaSoupError: port bind failed due to address not available [transport:udp, ip:'1.2.3.4', port:42251, attempt:1/10000] [method:router.createWebRtcTransport] +4msmediasoup:WARN:Channel request failed [method:router.createWebRtcTransport, id:5]: [method:router.createWebRtcTransport] +0msmediasoup-demo-server:ERROR:Room request failed:Error: [method:router.createWebRtcTransport] at Channel.processMessage (/home/hanpfei/data/opensource/mediasoup-demo/server/node_modules/mediasoup/node/lib/Channel.js:195:37) at Socket.<anonymous> (/home/hanpfei/data/opensource/mediasoup-demo/server/node_modules/mediasoup/node/lib/Channel.js:69:34) at Socket.emit (events.js:315:20) at Socket.EventEmitter.emit (domain.js:483:12) at addChunk (_stream_readable.js:295:12) at readableAddChunk (_stream_readable.js:271:9) at Socket.Readable.push (_stream_readable.js:212:10) at Pipe.onStreamRead (internal/stream_base_commons.js:186:23) +0msmediasoup-demo-server:Room protoo Peer "close" event [peerId:ucayshrc] +27msmediasoup-demo-server:INFO:Room last Peer in the room left, closing the room [roomId:rvpgogc7] +3smediasoup-demo-server:Room close() +2msmediasoup:Router close() +28msmediasoup:Channel request() [method:router.close, id:6] +27msmediasoup:Transport routerClosed() +3smediasoup:DataProducer transportClosed() +3smediasoup:RtpObserver routerClosed() +3smediasoup:Channel request succeeded [method:router.close, id:6] +4ms報錯提示,由于 IP 地址不可用,綁定端口失敗。
設置 mediasoup-demo 瀏覽器應用:
$ cd app $ npm install本地運行 mediasoup-demo
在終端中運行 Node.js 服務器應用:
mediasoup-demo$ cd server mediasoup-demo/server$ npm start在一個不同的終端中編譯并運行瀏覽器應用程序:
mediasoup-demo$ cd app mediasoup-demo/app$ npm start然后就可以通過瀏覽器訪問 mediasoup 了,如:
https://192.168.217.129:3000/?info=true&roomId=rvpgogc7mediasoup-demo 這個運行起來之后,網絡拓撲是這樣的:
mediasoup-demo/server 是 WebRTC 的 SFU 服務器,mediasoup-demo/app 是客戶端瀏覽器應用服務器,用于提供網頁和 JS 文件等資源。
參考資料
Npm can’t find module “semver” error in Ubuntu 19.04
mediasoup-demo 實踐
https://github.com/versatica/mediasoup-demo/blob/v3/README.md
https://mediasoup.discourse.group/t/mediasouperror-port-bind-failed-due-to-address-not-available-udp-1-2-3-4-attempt-1/32/6
https://github.com/mkhahani/mediasoup-sample-app/issues/1
總結
以上是生活随笔為你收集整理的mediasoup-demo 运行实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebRTC 的版本号与代码分支
- 下一篇: WebRTC 音频发送和接收处理过程