diff --git a/docs/Deploy.md b/docs/Deploy.md index 09387c2..6e38523 100644 --- a/docs/Deploy.md +++ b/docs/Deploy.md @@ -330,7 +330,9 @@ pm2 start | stop | restart taoyao-client firewall-cmd --zone=public --add-port=5173/tcp --permanent # 信令服务 firewall-cmd --zone=public --add-port=8888/tcp --permanent -# 媒体服务(数据):40000-49999 +# 媒体服务(控制):建议关闭 +firewall-cmd --zone=public --add-port=4443/tcp --permanent +# 媒体服务(数据) firewall-cmd --zone=public --add-port=40000-49999/udp --permanent firewall-cmd --reload @@ -339,6 +341,7 @@ firewall-cmd --list-ports # 删除端口 #firewall-cmd --zone=public --remove-port=5173/udp --permanent #firewall-cmd --zone=public --remove-port=8888/udp --permanent +#firewall-cmd --zone=public --remove-port=4443/tcp --permanent #firewall-cmd --zone=public --remove-port=40000-49999/udp --permanent ``` diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/css/font.min.css b/taoyao-client/src/static/css/font.min.css similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/css/font.min.css rename to taoyao-client/src/static/css/font.min.css diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/css/style.css b/taoyao-client/src/static/css/style.css similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/css/style.css rename to taoyao-client/src/static/css/style.css diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/favicon.ico b/taoyao-client/src/static/favicon.ico similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/favicon.ico rename to taoyao-client/src/static/favicon.ico diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/fonts/taoyao.svg b/taoyao-client/src/static/fonts/taoyao.svg similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/fonts/taoyao.svg rename to taoyao-client/src/static/fonts/taoyao.svg diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/fonts/taoyao.ttf b/taoyao-client/src/static/fonts/taoyao.ttf similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/fonts/taoyao.ttf rename to taoyao-client/src/static/fonts/taoyao.ttf diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/fonts/taoyao.woff b/taoyao-client/src/static/fonts/taoyao.woff similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/fonts/taoyao.woff rename to taoyao-client/src/static/fonts/taoyao.woff diff --git a/taoyao-client/src/static/index.html b/taoyao-client/src/static/index.html new file mode 100644 index 0000000..0b8b9ed --- /dev/null +++ b/taoyao-client/src/static/index.html @@ -0,0 +1,18 @@ + + + + +桃夭 + + + + + + 直播 + 会议 + + \ No newline at end of file diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/javascript/taoyao.js b/taoyao-client/src/static/javascript/taoyao.js similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/javascript/taoyao.js rename to taoyao-client/src/static/javascript/taoyao.js diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/live.html b/taoyao-client/src/static/live.html similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/live.html rename to taoyao-client/src/static/live.html diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/meeting.html b/taoyao-client/src/static/meeting.html similarity index 100% rename from taoyao-signal-server/taoyao-server/src/main/resources/static/meeting.html rename to taoyao-client/src/static/meeting.html diff --git a/taoyao-media-server/package.json b/taoyao-media-server/package.json index 1f50ffd..a29e2b1 100644 --- a/taoyao-media-server/package.json +++ b/taoyao-media-server/package.json @@ -10,7 +10,6 @@ }, "dependencies": { "ws": "^8.12.0", - "debug": "^4.3.1", "mediasoup": "file:./mediasoup" }, "devDependencies": { diff --git a/taoyao-media-server/src/Config.js b/taoyao-media-server/src/Config.js index 37a921e..8efe134 100644 --- a/taoyao-media-server/src/Config.js +++ b/taoyao-media-server/src/Config.js @@ -13,12 +13,15 @@ module.exports = { listenIp: "0.0.0.0", listenPort: process.env.HTTPS_LISTEN_PORT || 4443, // WebSocket连接密码 - username: 'taoyao', - password: 'taoyao', + username: "taoyao", + password: "taoyao", tls: { - cert: process.env.HTTPS_CERT_PUBLIC_KEY || `${__dirname}/certs/publicKey.pem`, - key: process.env.HTTPS_CERT_PRIVATE_KEY || `${__dirname}/certs/privateKey.pem`, - } + cert: + process.env.HTTPS_CERT_PUBLIC_KEY || `${__dirname}/certs/publicKey.pem`, + key: + process.env.HTTPS_CERT_PRIVATE_KEY || + `${__dirname}/certs/privateKey.pem`, + }, }, // Mediasoup mediasoup: { @@ -133,5 +136,20 @@ module.exports = { }, maxSctpMessageSize: 262144, }, - } + }, + wellcome: ` + + + + 桃夭媒体服务 + + + +

taoyao-media-server

+

acgist

+ + `, }; diff --git a/taoyao-media-server/src/Logger.js b/taoyao-media-server/src/Logger.js index b02b97d..158d4b3 100644 --- a/taoyao-media-server/src/Logger.js +++ b/taoyao-media-server/src/Logger.js @@ -1,44 +1,46 @@ /** * 日志 */ -const debug = require("debug"); const config = require("./Config"); class Logger { + // + name = config.name; + constructor(prefix) { - const appName = config.name; if (prefix) { - this._debug = debug(`${appName}:DEBUG:${prefix}`); - this._info = debug(`${appName}:INFO:${prefix}`); - this._warn = debug(`${appName}:WARN:${prefix}`); - this._error = debug(`${appName}:ERROR:${prefix}`); - } else { - this._debug = debug(`${appName}:DEBUG`); - this._info = debug(`${appName}:INFO`); - this._warn = debug(`${appName}:WARN`); - this._error = debug(`${appName}:ERROR`); + this.name = this.name + ':' + prefix; } - this._debug.log = console.debug.bind(console); - this._info.log = console.info.bind(console); - this._warn.log = console.warn.bind(console); - this._error.log = console.error.bind(console); } - get debug() { - return this._debug.log; + debug(...args) { + this.log(console.debug, 'DEBUG', args); } - get info() { - return this._info.log; + info(...args) { + this.log(console.info, 'INFO', args); } - get warn() { - return this._warn.log; + warn(...args) { + this.log(console.warn, 'WARN', args); } - get error() { - return this._error.log; + error(...args) { + this.log(console.error, 'ERROR', args); + } + + log(out, level, args) { + if(!args) { + return; + } + if(args.length > 1 && args[0].length > 0) { + out(`${this.name}:${level}:${args[0]}`, ...args.slice(1)); + } else if(args.length === 1 && args[0].length > 0) { + out(`${this.name}:${level}:${args[0]}`); + } else { + out(""); + } } } diff --git a/taoyao-media-server/src/Server.js b/taoyao-media-server/src/Server.js index 091ce12..8d1cbfa 100644 --- a/taoyao-media-server/src/Server.js +++ b/taoyao-media-server/src/Server.js @@ -5,7 +5,7 @@ const fs = require("fs"); const ws = require("ws"); const https = require("https"); -const mediasoup = require("mediasoup"); +// const mediasoup = require("mediasoup"); const config = require("./Config"); const Logger = require("./Logger"); const Signal = require("./Signal"); @@ -83,7 +83,7 @@ async function buildSignalServer() { logger.info("配置HTTPS服务..."); httpsServer = https.createServer(tls, (request, response) => { response.writeHead(200); - response.end("taoyao media server"); + response.end(config.wellcome); }); logger.info("配置WebSocket服务..."); webSocketServer = new ws.Server({ server: httpsServer }); @@ -125,7 +125,7 @@ async function buildSignalServer() { async function main() { logger.info("开始启动:%s", config.name); // 启动Mediasoup服务 - await buildMediasoupWorkers(); + // await buildMediasoupWorkers(); // 启动服务 await buildSignalServer(); logger.info("启动完成:%s", config.name); diff --git a/taoyao-media-server/src/Signal.js b/taoyao-media-server/src/Signal.js index dba9259..37568ca 100644 --- a/taoyao-media-server/src/Signal.js +++ b/taoyao-media-server/src/Signal.js @@ -20,7 +20,10 @@ class Signal { * @param {*} message 消息 * @param {*} session websocket */ - on(message, session) {} + on(message, session) { + + } + } module.exports = Signal; diff --git a/taoyao-media-server/src/config.js b/taoyao-media-server/src/config.js deleted file mode 100644 index 37a921e..0000000 --- a/taoyao-media-server/src/config.js +++ /dev/null @@ -1,137 +0,0 @@ -/** - * 配置 - */ -const os = require("os"); - -module.exports = { - // 系统名称 - name: "taoyao-media-server", - // 交互式命令行 - command: true, - // 信令服务 - https: { - listenIp: "0.0.0.0", - listenPort: process.env.HTTPS_LISTEN_PORT || 4443, - // WebSocket连接密码 - username: 'taoyao', - password: 'taoyao', - tls: { - cert: process.env.HTTPS_CERT_PUBLIC_KEY || `${__dirname}/certs/publicKey.pem`, - key: process.env.HTTPS_CERT_PRIVATE_KEY || `${__dirname}/certs/privateKey.pem`, - } - }, - // Mediasoup - mediasoup: { - // 按照CPU数量配置进程数量 - numWorkers: Object.keys(os.cpus()).length, - // Worker:https://mediasoup.org/documentation/v3/mediasoup/api/#WorkerSettings - workerSettings: { - logLevel: "warn", - logTags: [ - "bwe", - "ice", - "rtp", - "rtx", - "svc", - "dtls", - "info", - "sctp", - "srtp", - "rtcp", - "score", - "message", - "simulcast", - ], - rtcMinPort: process.env.MEDIASOUP_MIN_PORT || 40000, - rtcMaxPort: process.env.MEDIASOUP_MAX_PORT || 49999, - }, - // Router:https://mediasoup.org/documentation/v3/mediasoup/api/#RouterOptions - routerOptions: { - mediaCodecs: [ - { - kind: "audio", - mimeType: "audio/opus", - clockRate: 48000, - channels: 2, - }, - { - kind: "video", - mimeType: "video/VP8", - clockRate: 90000, - parameters: { - "x-google-start-bitrate": 1000, - }, - }, - { - kind: "video", - mimeType: "video/VP9", - clockRate: 90000, - parameters: { - "profile-id": 2, - "x-google-start-bitrate": 1000, - }, - }, - { - kind: "video", - mimeType: "video/h264", - clockRate: 90000, - parameters: { - "packetization-mode": 1, - "profile-level-id": "4d0032", - "level-asymmetry-allowed": 1, - "x-google-start-bitrate": 1000, - }, - }, - { - kind: "video", - mimeType: "video/h264", - clockRate: 90000, - parameters: { - "packetization-mode": 1, - "profile-level-id": "42e01f", - "level-asymmetry-allowed": 1, - "x-google-start-bitrate": 1000, - }, - }, - ], - }, - // WebRtcServer:https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcServerOptions - webRtcServerOptions: { - listenInfos: [ - { - protocol: "udp", - ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0", - announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP, - port: 44444, - }, - { - protocol: "tcp", - ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0", - announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP, - port: 44444, - }, - ], - }, - // WebRtcTransport:https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions - webRtcTransportOptions: { - listenIps: [ - { - ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0", - announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP, - }, - ], - initialAvailableOutgoingBitrate: 1000000, - minimumAvailableOutgoingBitrate: 600000, - maxSctpMessageSize: 262144, - maxIncomingBitrate: 1500000, - }, - // PlainTransport:https://mediasoup.org/documentation/v3/mediasoup/api/#PlainTransportOptions - plainTransportOptions: { - listenIp: { - ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0", - announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP, - }, - maxSctpMessageSize: 262144, - }, - } -}; diff --git a/taoyao-media-server/src/server.js b/taoyao-media-server/src/server.js deleted file mode 100644 index 091ce12..0000000 --- a/taoyao-media-server/src/server.js +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env node -/** - * 服务 - */ -const fs = require("fs"); -const ws = require("ws"); -const https = require("https"); -const mediasoup = require("mediasoup"); -const config = require("./Config"); -const Logger = require("./Logger"); -const Signal = require("./Signal"); -const command = require("./Command"); - -// 日志 -const logger = new Logger(); -// 信令 -const signal = new Signal(); -// HTTPS server -let httpsServer; -// WebSocket server -let webSocketServer; -// Mediasoup Worker -const mediasoupWorkers = []; - -process.title = config.name; -process.env.DEBUG = process.env.DEBUG || "*mediasoup* *INFO* *WARN* *ERROR*"; - -/** - * 启动Mediasoup Worker - */ -async function buildMediasoupWorkers() { - const { numWorkers } = config.mediasoup; - logger.info("启动Mediasoup服务(%d Worker)...", numWorkers); - for (let i = 0; i < numWorkers; i++) { - // 新建Worker - const worker = await mediasoup.createWorker({ - logLevel: config.mediasoup.workerSettings.logLevel, - logTags: config.mediasoup.workerSettings.logTags, - rtcMinPort: Number(config.mediasoup.workerSettings.rtcMinPort), - rtcMaxPort: Number(config.mediasoup.workerSettings.rtcMaxPort), - }); - // 监听停止服务事件 - worker.on("died", () => { - logger.error( - "Mediasoup Worker停止服务(两秒之后自动退出)... [PID:%d]", - worker.pid - ); - setTimeout(() => process.exit(1), 2000); - }); - // 加入队列 - mediasoupWorkers.push(worker); - // 配置WebRTC服务 - if (process.env.MEDIASOUP_USE_WEBRTC_SERVER !== "false") { - // 每个Worker端口不能相同 - const portIncrement = mediasoupWorkers.length - 1; - const webRtcServerOptions = JSON.parse(JSON.stringify(config.mediasoup.webRtcServerOptions)); - for (const listenInfo of webRtcServerOptions.listenInfos) { - listenInfo.port += portIncrement; - } - const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions); - worker.appData.webRtcServer = webRtcServer; - } - // 定时记录使用日志 - setInterval(async () => { - const usage = await worker.getResourceUsage(); - logger.info( - "Mediasoup Worker使用情况 [pid:%d]: %o", - worker.pid, - usage - ); - }, 120 * 1000); - } -} - -/** - * 启动信令服务 - */ -async function buildSignalServer() { - const tls = { - cert: fs.readFileSync(config.https.tls.cert), - key: fs.readFileSync(config.https.tls.key), - }; - logger.info("配置HTTPS服务..."); - httpsServer = https.createServer(tls, (request, response) => { - response.writeHead(200); - response.end("taoyao media server"); - }); - logger.info("配置WebSocket服务..."); - webSocketServer = new ws.Server({ server: httpsServer }); - webSocketServer.on("connection", (session) => { - session.on("open", (message) => { - logger.info("打开信令通道: %s", message); - }); - session.on("close", (code) => { - logger.info("关闭信令通道: %o", code); - }); - session.on("error", (e) => { - logger.error("信令通道异常: %o", e); - }); - session.on("message", (message) => { - logger.debug("收到信令消息: %s", message); - try { - signal.on(JSON.parse(message), session); - } catch (error) { - logger.error( - `处理信令消息异常: - %s - %o`, - message, - error - ); - } - }); - }); - // 打开监听 - httpsServer.listen( - Number(config.https.listenPort), - config.https.listenIp, - () => { - logger.info("信令服务启动完成"); - } - ); -} - -async function main() { - logger.info("开始启动:%s", config.name); - // 启动Mediasoup服务 - await buildMediasoupWorkers(); - // 启动服务 - await buildSignalServer(); - logger.info("启动完成:%s", config.name); - // 交互式命令行 - if (config.command) { - await command(); - } -} - -main(); diff --git a/taoyao-media-server/src/signal.js b/taoyao-media-server/src/signal.js deleted file mode 100644 index dba9259..0000000 --- a/taoyao-media-server/src/signal.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * 信令 - * 1. 终端媒体流向 - * 2. 处理音频视频:降噪、水印等等 - */ -class Signal { - - // Mediasoup Worker列表 - mediasoupWorkers = []; - // Mediasoup Worker下个索引 - nextMediasoupWorkerIndex = 0; - - constructor(mediasoupWorkers) { - this.mediasoupWorkers = mediasoupWorkers; - } - - /** - * 处理事件 - * - * @param {*} message 消息 - * @param {*} session websocket - */ - on(message, session) {} -} - -module.exports = Signal; diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaAggregateProcessor.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaAggregateProcessor.java deleted file mode 100644 index 6b0e1cc..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaAggregateProcessor.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.media.processor; - -public class MediaAggregateProcessor { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaParallelProcessor.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaParallelProcessor.java deleted file mode 100644 index 71e35a5..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaParallelProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.processor; - -/** - * 并行媒体处理器 - * - * @author acgist - */ -public class MediaParallelProcessor { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaRecordProcessor.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaRecordProcessor.java deleted file mode 100644 index 7868119..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaRecordProcessor.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.media.processor; - -public class MediaRecordProcessor { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaDenoiseProcessor.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaDenoiseProcessor.java deleted file mode 100644 index 9c92d46..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaDenoiseProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.processor.audio; - -/** - * 降噪 - * - * @author acgist - */ -public class MediaDenoiseProcessor { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaMixProcessor.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaMixProcessor.java deleted file mode 100644 index 888535d..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaMixProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.processor.audio; - -/** - * 混音 - * - * @author acgist - */ -public class MediaMixProcessor { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaWhineProcessor.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaWhineProcessor.java deleted file mode 100644 index dd6cb5a..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaWhineProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.processor.audio; - -/** - * 变声器 - * - * @author acgist - */ -public class MediaWhineProcessor { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaBeautyProcessor.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaBeautyProcessor.java deleted file mode 100644 index 03cce09..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaBeautyProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.processor.video; - -/** - * 美颜 - * - * @author acgist - */ -public class MediaBeautyProcessor { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaMarkHandler.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaMarkHandler.java deleted file mode 100644 index 2f0624b..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaMarkHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.processor.video; - -/** - * AI识别 - * - * @author acgist - */ -public class MediaMarkHandler { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaWatermarkHandler.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaWatermarkHandler.java deleted file mode 100644 index 6a3410f..0000000 --- a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaWatermarkHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.processor.video; - -/** - * 水印 - * - * @author acgist - */ -public class MediaWatermarkHandler { - -} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java new file mode 100644 index 0000000..13209cf --- /dev/null +++ b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java @@ -0,0 +1,12 @@ +package com.acgist.taoyao.mediasoup; + +/** + * Mediasoup客户端 + * + * @author acgist + */ +public class MediasoupClient { + + + +} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/client/ClientStream.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/client/ClientStream.java new file mode 100644 index 0000000..655eaf4 --- /dev/null +++ b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/client/ClientStream.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.mediasoup.client; + +/** + * 终端媒体:producer、consumer + * + * @author acgist + */ +public class ClientStream { + +} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/router/Router.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/router/Router.java new file mode 100644 index 0000000..2618322 --- /dev/null +++ b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/router/Router.java @@ -0,0 +1,19 @@ +package com.acgist.taoyao.mediasoup.router; + +import java.util.List; + +import com.acgist.taoyao.mediasoup.transport.Transport; + +/** + * 路由 + * + * @author acgist + */ +public final class Router { + + /** + * 传输通道列表 + */ + private List transportList; + +} diff --git a/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/transport/Transport.java b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/transport/Transport.java new file mode 100644 index 0000000..593ccd9 --- /dev/null +++ b/taoyao-signal-server/taoyao-media/src/main/java/com/acgist/taoyao/mediasoup/transport/Transport.java @@ -0,0 +1,23 @@ +package com.acgist.taoyao.mediasoup.transport; + +import java.util.List; + +import com.acgist.taoyao.mediasoup.client.ClientStream; + +/** + * 传输通道 + * + * @author acgist + */ +public final class Transport { + + /** + * 生产者列表 + */ + private List producerList; + /** + * 消费者列表 + */ + private List consumerList; + +} diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/index.html b/taoyao-signal-server/taoyao-server/src/main/resources/static/index.html index 0b8b9ed..415d78a 100644 --- a/taoyao-signal-server/taoyao-server/src/main/resources/static/index.html +++ b/taoyao-signal-server/taoyao-server/src/main/resources/static/index.html @@ -1,18 +1,15 @@ - -桃夭 - - - + + 桃夭信令服务 + - 直播 - 会议 +

taoyao-signal-server

+

acgist

\ No newline at end of file diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/MediaListenerAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/MediaListenerAdapter.java index 0346013..9307f3b 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/MediaListenerAdapter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/MediaListenerAdapter.java @@ -1,9 +1,6 @@ package com.acgist.taoyao.signal.listener; -import org.springframework.beans.factory.annotation.Autowired; - import com.acgist.taoyao.signal.event.ApplicationEventAdapter; -import com.acgist.taoyao.signal.media.MediaRouterManager; /** * 媒体事件监听适配器 @@ -14,7 +11,4 @@ import com.acgist.taoyao.signal.media.MediaRouterManager; */ public abstract class MediaListenerAdapter extends ApplicationListenerAdapter { - @Autowired - protected MediaRouterManager mediaRouterManager; - } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaRouterManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaRouterManager.java deleted file mode 100644 index 7120b57..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaRouterManager.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.acgist.taoyao.signal.media; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.springframework.beans.factory.annotation.Autowired; - -import com.acgist.taoyao.boot.annotation.Manager; -import com.acgist.taoyao.signal.media.processor.ProcessorChain; -import com.acgist.taoyao.signal.media.router.MediaRouter; -import com.acgist.taoyao.signal.media.router.MediaRouterHandler; - -import lombok.extern.slf4j.Slf4j; - -/** - * 媒体路由管理 - * - * @author acgist - */ -@Slf4j -@Manager -public class MediaRouterManager { - - /** - * 路由集合 - * ID=路由器 - * ID=LiveId/MeetingId - */ - private Map routers = new ConcurrentHashMap<>(); - - @Autowired(required = false) - private ProcessorChain processorChain; - - /** - * 创建路由 - * - * @param id ID - * - * @return 路由 - */ - public MediaRouter build(Long id) { - return this.routers.computeIfAbsent(id, key -> { - final MediaRouter router = new MediaRouterHandler(); - router.build(); - router.processorChain(this.processorChain); - log.debug("创建路由:{}-{}", id, router); - return router; - }); - } - - /** - * @param id ID - * - * @return 路由 - */ - public MediaRouter router(Long id) { - return this.routers.get(id); - } - - /** - * 关闭路由 - * - * @param id ID - */ - public void close(Long id) { - final MediaRouter router = this.router(id); - if(router == null) { - return; - } - router.close(); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaMixProcessor.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaMixProcessor.java deleted file mode 100644 index 61dbc4a..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaMixProcessor.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.signal.media.processor; - -public class MediaMixProcessor { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaProcessor.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaProcessor.java deleted file mode 100644 index d85c139..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.signal.media.processor; - -/** - * 媒体流处理器:混音、美颜等等 - * - * @author acgist - */ -public interface MediaProcessor { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/ProcessorChain.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/ProcessorChain.java deleted file mode 100644 index e553ca7..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/ProcessorChain.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.signal.media.processor; - -/** - * 媒体流处理器责任链 - * - * @author acgist - */ -public class ProcessorChain { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaPublisher.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaPublisher.java deleted file mode 100644 index 677c5cf..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaPublisher.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.acgist.taoyao.signal.media.router; - -import com.acgist.taoyao.signal.media.stream.MediaHandlerAdapter; - -/** - * 终端媒体发布者 - * - * @author acgist - */ -public class MediaPublisher extends MediaHandlerAdapter { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouter.java deleted file mode 100644 index 6bece2d..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouter.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.acgist.taoyao.signal.media.router; - -import java.util.List; - -import com.acgist.taoyao.signal.media.processor.ProcessorChain; -import com.acgist.taoyao.signal.media.stream.MediaStream; - -/** - * 媒体流路由器 - * - * @author acgist - */ -public interface MediaRouter { - - /** - * 初始路由 - */ - void build(); - - /** - * @return 媒体发布者 - */ - MediaPublisher publisher(); - - /** - * @return 媒体订阅者 - */ - MediaSubscriber subscriber(); - - /** - * @param processorChain 媒体流处理器责任链 - */ - void processorChain(ProcessorChain processorChain); - - /** - * @return 发布者媒体流 - */ - List streamPublisher(); - - /** - * @param sns 订阅者终端标识 - * - * @return 订阅者媒体流 - */ - List streamSubscriber(String ... sns); - - /** - * @param type 媒体类型 - * - * @return 发布者媒体流 - */ - List streamPublisher(MediaStream.Type type); - - /** - * @param type 媒体类型 - * @param sns 订阅者终端标识 - * - * @return 发布者媒体流 - */ - List streamSubscriber(MediaStream.Type type, String ... sns); - - /** - * 关闭路由 - */ - void close(); - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouterHandler.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouterHandler.java deleted file mode 100644 index b9b74c2..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouterHandler.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.acgist.taoyao.signal.media.router; - -import java.io.IOException; -import java.util.List; - -import org.apache.commons.lang3.ArrayUtils; - -import com.acgist.taoyao.signal.media.processor.ProcessorChain; -import com.acgist.taoyao.signal.media.stream.MediaStream; -import com.acgist.taoyao.signal.media.stream.MediaStream.Type; - -import lombok.extern.slf4j.Slf4j; - -/** - * 媒体流路由器处理器 - * - * @author acgist - */ -@Slf4j -public class MediaRouterHandler implements MediaRouter { - - /** - * 媒体流处理器责任链 - */ - private ProcessorChain processorChain; - /** - * 发布者 - */ - private MediaPublisher mediaPublisher; - /** - * 订阅者 - */ - private MediaSubscriber mediaSubscriber; - - @Override - public void build() { - this.mediaPublisher = new MediaPublisher(); - this.mediaSubscriber = new MediaSubscriber(); - } - - @Override - public MediaPublisher publisher() { - return this.mediaPublisher; - } - - @Override - public MediaSubscriber subscriber() { - return this.mediaSubscriber; - } - - @Override - public void processorChain(ProcessorChain processorChain) { - this.processorChain = processorChain; - } - - @Override - public List streamPublisher() { - return this.mediaPublisher.getStreams(); - } - - @Override - public List streamSubscriber(String ... sns) { - return this.mediaSubscriber.getStreams().stream() - .filter(v -> ArrayUtils.contains(sns, v.subscriber())) - .toList(); - } - - @Override - public List streamPublisher(Type type) { - return this.mediaPublisher.getStreams().stream() - .filter(v -> v.type() == type) - .toList(); - } - - @Override - public List streamSubscriber(Type type, String... sns) { - return this.mediaSubscriber.getStreams().stream() - .filter(v -> v.type() == type) - .filter(v -> ArrayUtils.contains(sns, v.subscriber())) - .toList(); - } - - @Override - public void close() { - try { - this.mediaPublisher.close(); - } catch (IOException e) { - log.error("关闭发布者异常", e); - } - try { - this.mediaSubscriber.close(); - } catch (IOException e) { - log.error("关闭订阅者异常", e); - } - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaSubscriber.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaSubscriber.java deleted file mode 100644 index 3d78f35..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaSubscriber.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.acgist.taoyao.signal.media.router; - -import com.acgist.taoyao.signal.media.stream.MediaHandlerAdapter; - -/** - * 终端媒体订阅者 - * - * @author acgist - */ -public class MediaSubscriber extends MediaHandlerAdapter { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandler.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandler.java deleted file mode 100644 index 1f68a66..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandler.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.acgist.taoyao.signal.media.stream; - -import java.io.IOException; - -/** - * 终端媒体处理器 - * - * @author acgist - */ -public interface MediaHandler { - - /** - * 打开 - * 注意:用于打开媒体流 - * - * @throws IOException IO异常 - */ - void open() throws IOException; - - /** - * 打开 - * 注意:用于管理媒体流 - * - * @param stream 媒体流 - * - * @throws IOException IO异常 - */ - void open(MediaStream stream) throws IOException; - - /** - * 暂停 - * 注意:暂停时发送心跳防止通道关闭 - * - * @throws IOException IO异常 - */ - void pause() throws IOException; - - /** - * 恢复 - * - * @throws IOException IO异常 - */ - void resume() throws IOException; - - /** - * 关闭 - * - * @param id 终端媒体流ID - * - * @throws IOException IO异常 - */ - void close() throws IOException; - - /** - * 打开 - * - * @param type 媒体类型 - * - * @throws IOException IO异常 - */ - void open(MediaStream.Type type) throws IOException; - - /** - * 暂停 - * 注意:暂停时发送心跳防止通道关闭 - * - * @param type 媒体类型 - * - * @throws IOException IO异常 - */ - void pause(MediaStream.Type type) throws IOException; - - /** - * 恢复 - * - * @param type 媒体类型 - * - * @throws IOException IO异常 - */ - void resume(MediaStream.Type type) throws IOException; - - /** - * 关闭 - * - * @param type 媒体类型 - * - * @param id 终端媒体流ID - * - * @throws IOException IO异常 - */ - void close(MediaStream.Type type) throws IOException; - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandlerAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandlerAdapter.java deleted file mode 100644 index f933c61..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandlerAdapter.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.acgist.taoyao.signal.media.stream; - -import java.io.IOException; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import com.acgist.taoyao.boot.model.MessageCodeException; -import com.acgist.taoyao.signal.media.stream.MediaStream.Type; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - -/** - * 终端媒体处理器适配器 - * - * @author acgist - */ -@Slf4j -@Getter -@Setter -public class MediaHandlerAdapter implements MediaHandler { - - /** - * 媒体流集合 - */ - protected List streams = new CopyOnWriteArrayList<>(); - - @Override - public void open() throws IOException { - throw MessageCodeException.of("禁止使用"); - } - - @Override - public void open(MediaStream stream) throws IOException { - log.debug("打开媒体流:{}", stream); - this.streams.add(stream); - } - - @Override - public void pause() throws IOException { - this.streams.forEach(v -> { - try { - v.pause(); - } catch (IOException e) { - log.error("暂停媒体流异常:{}", v, e); - } - }); - } - - @Override - public void resume() throws IOException { - this.streams.forEach(v -> { - try { - v.resume(); - } catch (IOException e) { - log.error("恢复媒体流异常:{}", v, e); - } - }); - } - - @Override - public void close() throws IOException { - this.streams.forEach(v -> { - try { - v.close(); - } catch (IOException e) { - log.error("关闭媒体流异常:{}", v, e); - } - }); - } - - @Override - public void open(Type type) throws IOException { - throw MessageCodeException.of("禁止使用"); - } - - @Override - public void pause(Type type) throws IOException { - this.streams.stream().filter(v -> v.type() == type).forEach(v -> { - try { - v.pause(); - } catch (IOException e) { - log.error("暂停媒体流异常:{}", v, e); - } - }); - } - - @Override - public void resume(Type type) throws IOException { - this.streams.stream().filter(v -> v.type() == type).forEach(v -> { - try { - v.resume(); - } catch (IOException e) { - log.error("恢复媒体流异常:{}", v, e); - } - }); - } - - @Override - public void close(Type type) throws IOException { - this.streams.stream().filter(v -> v.type() == type).forEach(v -> { - try { - v.close(); - } catch (IOException e) { - log.error("关闭媒体流异常:{}", v, e); - } - }); - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStream.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStream.java deleted file mode 100644 index 608ca50..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStream.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.acgist.taoyao.signal.media.stream; - -/** - * 终端媒体流 - * - * @author acgist - */ -public interface MediaStream extends MediaHandler { - - /** - * 终端媒体类型 - * - * @author acgist - */ - public enum Type { - - /** - * 混合:音视频 - */ - MIX, - /** - * 音频 - */ - AUDIO, - /** - * 视频 - */ - VIDEO; - - } - - /** - * 终端媒体流状态 - * - * @author acgist - */ - public enum Status { - - /** - * 没有激活 - */ - IDLE, - /** - * 已经激活 - */ - BUSY, - /** - * 已经暂停 - */ - PAUSE, - /** - * 已经关闭 - */ - CLOSE; - - } - - /** - * @return 终端媒体流ID - */ - String id(); - - /** - * @return 终端媒体流类型 - */ - Type type(); - - /** - * @return 终端媒体流状态 - */ - Status status(); - - /** - * @return 发布者 - */ - String publisher(); - - /** - * @return 订阅者 - */ - String subscriber(); - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStreamAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStreamAdapter.java deleted file mode 100644 index 6dfc3c4..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStreamAdapter.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.acgist.taoyao.signal.media.stream; - -import java.io.IOException; - -import com.acgist.taoyao.boot.model.MessageCodeException; - -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -/** - * 终端媒体流适配器 - * - * @author acgist - */ -@Getter -@Setter -@ToString(of = {"id", "type", "status", "publisher", "subscriber"}) -public abstract class MediaStreamAdapter implements MediaStream { - - /** - * 标识 - */ - protected String id; - /** - * 类型 - */ - protected Type type; - /** - * 状态 - */ - protected Status status; - /** - * 发布者 - */ - private String publisher; - /** - * 订阅者 - */ - private String subscriber; - /** - * 真实流 - */ - protected T stream; - - @Override - public String id() { - return this.id; - } - - @Override - public Type type() { - return this.type; - } - - @Override - public Status status() { - return this.status; - } - - @Override - public String publisher() { - return this.publisher; - } - - @Override - public String subscriber() { - return this.subscriber; - } - - @Override - public void open(MediaStream stream) throws IOException { - throw MessageCodeException.of("禁止套娃"); - } - -}