diff --git a/docs/TODO.md b/docs/TODO.md index 00c09d3..bb272cf 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -28,6 +28,15 @@ * 排版优化:优化顺序 * 代码优化:逻辑调整、性能优化、安全优化、增强稳定性 +## Mediasoup功能集成 + +持续集成`mediasoup`功能: + +* 上次集成`mediasoup-demo`日期:`2023-06-19` +* 上次集成`libmediasoupclient`日期:`2023-06-19` + +> `mediasoup-demo`包含`mediasoup`和`mediasoup-client` + ## 计划任务 * E2E @@ -44,4 +53,3 @@ * 浏览器WebRTC监控页面关闭:`chrome://webrtc-internals/` ## 完成任务 - diff --git a/taoyao-client-android/libmediasoupclient b/taoyao-client-android/libmediasoupclient index 55d724f..48768ba 160000 --- a/taoyao-client-android/libmediasoupclient +++ b/taoyao-client-android/libmediasoupclient @@ -1 +1 @@ -Subproject commit 55d724ff8b036991b0f0688adb334df976e458fe +Subproject commit 48768ba90dee235e045e8dfbf364365504e2c4ce diff --git a/taoyao-client-media/src/Config.js b/taoyao-client-media/src/Config.js index d20363d..a08f5cb 100644 --- a/taoyao-client-media/src/Config.js +++ b/taoyao-client-media/src/Config.js @@ -24,7 +24,6 @@ module.exports = { // 信令地址 host: "127.0.0.1", // host: "192.168.1.100", - // host: "192.168.8.100", // 信令端口 port: 8888, // 信令协议 diff --git a/taoyao-client-media/src/Server.js b/taoyao-client-media/src/Server.js index bac385c..5927a57 100644 --- a/taoyao-client-media/src/Server.js +++ b/taoyao-client-media/src/Server.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -const config = require("./Config"); +const config = require("./Config"); const mediasoup = require("mediasoup"); const { Taoyao, signalChannel } = require("./Taoyao"); @@ -9,66 +9,70 @@ process.title = config.name; // 禁止校验无效证书 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; -// Mediasoup Worker列表 +// 工作线程 const mediasoupWorkers = []; -// 桃夭 +// 桃夭信令 const taoyao = new Taoyao(mediasoupWorkers); /** - * 创建Mediasoup Worker列表 + * 创建工作线程 */ async function buildMediasoupWorkers() { - // 监听事件 - // mediasoup.observer.on("newworker", fn(worker)); + mediasoup.observer.on("newworker", (worker) => { + console.info("mediasoup newworker", worker); + }); const { workerSize } = config.mediasoup; - console.info("创建Mediasoup Worker数量:", workerSize); + console.info("工作线程数量", workerSize); for (let index = 0; index < workerSize; index++) { + // 创建工作线程 const worker = await mediasoup.createWorker({ - logTags: config.mediasoup.workerSettings.logTags, - logLevel: config.mediasoup.workerSettings.logLevel, + logTags : config.mediasoup.workerSettings.logTags, + logLevel : config.mediasoup.workerSettings.logLevel, rtcMinPort: Number(config.mediasoup.workerSettings.rtcMinPort), rtcMaxPort: Number(config.mediasoup.workerSettings.rtcMaxPort), }); - // 配置WebRTC服务 - const webRtcServerOptions = JSON.parse( - JSON.stringify(config.mediasoup.webRtcServerOptions) - ); - for (const listenInfo of webRtcServerOptions.listenInfos) { - listenInfo.port = listenInfo.port + mediasoupWorkers.length; - } - const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions); - worker.appData.webRtcServer = webRtcServer; - mediasoupWorkers.push(worker); + // 监听事件 worker.on("died", (error) => { - console.warn("worker died:", worker.pid, error); - setTimeout(() => process.exit(1), 2000); + // 正常情况不会出现 + console.error("worker died", worker.pid, error); }); worker.observer.on("close", () => { - console.info("worker close:", worker.pid); + console.debug("worker close", worker.pid); }); - // worker.observer.on("newrouter", (router) => { - // console.info("worker newrouter:", worker.pid, router.id); - // }); - // worker.observer.on("newwebrtcserver", (webRtcServer) => { - // console.info("worker newwebrtcserver:", worker.pid, webRtcServer.id); - // }); - // webRtcServer.on("workerclose", () => { - // console.info("webRtcServer workerclose:", worker.pid, webRtcServer.id); - // }); - // webRtcServer.observer.on("close", () => { - // console.info("webRtcServer close:", worker.pid, webRtcServer.id); - // }); - // webRtcServer.observer.on("webrtctransporthandled", (webRtcTransport) => { - // console.info("webRtcServer webrtctransporthandled:", worker.pid, webRtcServer.id, webRtcTransport.id); - // }); - // webRtcServer.observer.on("webrtctransportunhandled", (webRtcTransport) => { - // console.info("webRtcServer webrtctransportunhandled:", worker.pid, webRtcServer.id, webRtcTransport.id); - // }); + worker.observer.on("newrouter", (router) => { + console.debug("worker newrouter", worker.pid, router.id); + }); + worker.observer.on("newwebrtcserver", (webRtcServer) => { + console.debug("worker newwebrtcserver", worker.pid, webRtcServer.id); + }); + // 创建WebRTC服务 + const webRtcServerOptions = JSON.parse(JSON.stringify(config.mediasoup.webRtcServerOptions)); + for (const listenInfos of webRtcServerOptions.listenInfos) { + listenInfos.port = listenInfos.port + mediasoupWorkers.length; + } + const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions); + // 监听事件 + webRtcServer.on("workerclose", () => { + console.debug("webRtcServer workerclose", worker.pid, webRtcServer.id); + }); + webRtcServer.observer.on("close", () => { + console.debug("webRtcServer close", worker.pid, webRtcServer.id); + }); + webRtcServer.observer.on("webrtctransporthandled", (webRtcTransport) => { + console.debug("webRtcServer webrtctransporthandled", worker.pid, webRtcServer.id, webRtcTransport.id); + }); + webRtcServer.observer.on("webrtctransportunhandled", (webRtcTransport) => { + console.debug("webRtcServer webrtctransportunhandled", worker.pid, webRtcServer.id, webRtcTransport.id); + }); + // 配置WebRTC服务 + worker.appData.webRtcServer = webRtcServer; + // 添加工作线程 + mediasoupWorkers.push(worker); } } /** - * 连接信令服务 + * 连接信令 */ async function connectSignalServer() { signalChannel.taoyao = taoyao; @@ -85,10 +89,10 @@ async function main() { :: https://gitee.com/acgist/taoyao `); - console.info("开始启动:", config.name); + console.info("开始启动", config.name); await buildMediasoupWorkers(); await connectSignalServer(); - console.info("启动完成:", config.name); + console.info("启动完成", config.name); } main(); diff --git a/taoyao-client-media/src/Taoyao.js b/taoyao-client-media/src/Taoyao.js index 25b0db7..87fcd66 100644 --- a/taoyao-client-media/src/Taoyao.js +++ b/taoyao-client-media/src/Taoyao.js @@ -1,8 +1,7 @@ const fs = require("fs"); -const config = require("./Config.js"); +const config = require("./Config"); const process = require("child_process"); const WebSocket = require("ws"); -const { trace } = require("console"); /** * 信令协议 diff --git a/taoyao-client-web/src/components/Config.js b/taoyao-client-web/src/components/Config.js index 80fb954..9f36c62 100644 --- a/taoyao-client-web/src/components/Config.js +++ b/taoyao-client-web/src/components/Config.js @@ -56,6 +56,14 @@ const defaultKsvcEncodings = [{ scalabilityMode: "S3T3_KEY" }]; /** * simulcast默认配置 + * TODO:update + * https://gitee.com/acgist/mediasoup-demo/commit/090c82920d1b8015d457e4fafbb06607cb232885 + * https://gitee.com/acgist/mediasoup-demo/commit/e4f70da0c69226b997d174c477d82f8dbb997e91 + * https://gitee.com/acgist/mediasoup-demo/commit/2c67601d0a231bf901242c8e14cdd0d1ba39f3a4 + * https://gitee.com/acgist/mediasoup-demo/commit/b9f3f28d2eab314b95392fa698d518177d5ad767 + * https://gitee.com/acgist/mediasoup-demo/commit/1c59132ca926a6f9ca0c5c2bb155fac58eed9b06 + * https://gitee.com/acgist/mediasoup-demo/commit/d15a859306e1ba5d031cde90d02593e095719cbc + * https://gitee.com/acgist/mediasoup-demo/commit/13cf71cc608690ff96ec12e6d3f1262b40c4d8f3 */ const defaultSimulcastEncodings = [ { scaleResolutionDownBy: 4, maxBitrate: 500000, scalabilityMode: "S1T2" }, diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js index f6a727d..5cf7836 100644 --- a/taoyao-client-web/src/components/Taoyao.js +++ b/taoyao-client-web/src/components/Taoyao.js @@ -1976,6 +1976,8 @@ class Taoyao extends RemoteClient { opusStereo: 1, opusDtx: 1, }, + // TODO:opus + // https://gitee.com/acgist/mediasoup-demo/commit/1cab7cb245dc77b7f952a282290fcea8c9841d6e // { // opusStereo : true, // opusDtx : true,