[+] 优化房间创建、关闭、广播、终端列表逻辑
现在已经能够拉出视频
This commit is contained in:
@@ -22,6 +22,8 @@ module.exports = {
|
||||
name: "桃夭媒体服务",
|
||||
// 地址
|
||||
host: "127.0.0.1",
|
||||
// host: "192.168.1.100",
|
||||
// host: "192.168.8.100",
|
||||
// 端口
|
||||
port: 8888,
|
||||
// 协议
|
||||
|
||||
@@ -18,7 +18,7 @@ const taoyao = new Taoyao(mediasoupWorkers);
|
||||
* 创建Mediasoup Worker列表
|
||||
*/
|
||||
async function buildMediasoupWorkers() {
|
||||
// 可配置的事件
|
||||
// 监听事件
|
||||
// mediasoup.observer.on("newworker", fn(worker));
|
||||
const { workerSize } = config.mediasoup;
|
||||
console.info("创建Mediasoup Worker数量:", workerSize);
|
||||
@@ -29,16 +29,6 @@ async function buildMediasoupWorkers() {
|
||||
rtcMinPort: Number(config.mediasoup.workerSettings.rtcMinPort),
|
||||
rtcMaxPort: Number(config.mediasoup.workerSettings.rtcMaxPort),
|
||||
});
|
||||
worker.on("died", (error) => {
|
||||
console.warn("Mediasoup Worker停止服务:", worker.pid, error);
|
||||
setTimeout(() => process.exit(1), 2000);
|
||||
});
|
||||
worker.observer.on("close", () => {
|
||||
console.warn("Mediasoup Worker关闭服务:", worker.pid);
|
||||
});
|
||||
// 可配置的事件
|
||||
// worker.observer.on("newrouter", fn(router));
|
||||
// worker.observer.on("newwebrtcserver", fn(router));
|
||||
// 配置WebRTC服务
|
||||
const webRtcServerOptions = JSON.parse(
|
||||
JSON.stringify(config.mediasoup.webRtcServerOptions)
|
||||
@@ -49,6 +39,16 @@ async function buildMediasoupWorkers() {
|
||||
const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions);
|
||||
worker.appData.webRtcServer = webRtcServer;
|
||||
mediasoupWorkers.push(worker);
|
||||
// 监听事件
|
||||
worker.on("died", (error) => {
|
||||
console.warn("Mediasoup Worker停止服务:", worker.pid, error);
|
||||
setTimeout(() => process.exit(1), 2000);
|
||||
});
|
||||
worker.observer.on("close", () => {
|
||||
console.warn("Mediasoup Worker关闭服务:", worker.pid);
|
||||
});
|
||||
// worker.observer.on("newrouter", fn(router));
|
||||
// worker.observer.on("newwebrtcserver", fn(router));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ const signalChannel = {
|
||||
console.debug("信令通道消息:", content);
|
||||
me.taoyao.on(JSON.parse(content));
|
||||
} catch (error) {
|
||||
console.error("处理信令消息异常:", data, error);
|
||||
console.error("处理信令消息异常:", data.toString(), error);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -322,15 +322,18 @@ class Room {
|
||||
/**
|
||||
* 关闭资源
|
||||
*/
|
||||
close() {
|
||||
const self = this;
|
||||
if (self.close) {
|
||||
closeAll() {
|
||||
const me = this;
|
||||
if (me.close) {
|
||||
return;
|
||||
}
|
||||
self.close = true;
|
||||
if (self.mediasoupRouter) {
|
||||
self.mediasoupRouter.close();
|
||||
}
|
||||
me.close = true;
|
||||
// me.producers.forEach(v => v.close());
|
||||
// me.consumers.forEach(v => v.close());
|
||||
// me.dataProducers.forEach(v => v.close());
|
||||
// me.dataConsumers.forEach(v => v.close());
|
||||
me.transports.forEach(v => v.close());
|
||||
me.mediasoupRouter.close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,6 +407,9 @@ class Taoyao {
|
||||
case "room::create":
|
||||
this.roomCreate(message, body);
|
||||
break;
|
||||
case "room::close":
|
||||
this.roomClose(message, body);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -812,8 +818,9 @@ class Taoyao {
|
||||
);
|
||||
});
|
||||
await transport.enableTraceEvent(["bwe"]);
|
||||
// await transport.enableTraceEvent([ 'probation', 'bwe' ]);
|
||||
transport.on("trace", (trace) => {
|
||||
console.debug("transport trace event:", trace, trace.type, transport.id);
|
||||
console.debug("transport trace event:", transport.id, trace.type, trace);
|
||||
});
|
||||
// 可配置的事件
|
||||
// transport.on("routerclose", fn());
|
||||
@@ -842,30 +849,42 @@ class Taoyao {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭房间信令
|
||||
*
|
||||
* @param {*} message 消息
|
||||
* @param {*} body 消息主体
|
||||
*/
|
||||
async roomClose(message, body) {
|
||||
const roomId = body.roomId;
|
||||
const room = this.rooms.get(roomId);
|
||||
if(!room) {
|
||||
console.warn("房间无效:", roomId);
|
||||
return;
|
||||
}
|
||||
console.info("关闭房间:", roomId);
|
||||
room.closeAll();
|
||||
this.rooms.delete(roomId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建房间信令
|
||||
*
|
||||
* @param {*} message 消息
|
||||
* @param {*} body 消息主体
|
||||
*
|
||||
* @returns 房间
|
||||
*/
|
||||
async roomCreate(message, body) {
|
||||
const me = this;
|
||||
const roomId = body.roomId;
|
||||
let room = this.rooms.get(roomId);
|
||||
let room = me.rooms.get(roomId);
|
||||
if (room) {
|
||||
this.push(message);
|
||||
return room;
|
||||
console.debug("创建房间已经存在:", room);
|
||||
me.push(message);
|
||||
return;
|
||||
}
|
||||
const mediasoupWorker = this.nextMediasoupWorker();
|
||||
const mediasoupWorker = me.nextMediasoupWorker();
|
||||
const { mediaCodecs } = config.mediasoup.routerOptions;
|
||||
const mediasoupRouter = await mediasoupWorker.createRouter({ mediaCodecs });
|
||||
mediasoupRouter.observer.on("close", () => {
|
||||
// TODO:通知房间关闭
|
||||
});
|
||||
// 可配置的事件
|
||||
// mediasoupRouter.on("workerclose", () => {});
|
||||
// mediasoupRouter.observer.on("newtransport", fn(transport));
|
||||
// TODO:下面两个监控改为配置启用
|
||||
const audioLevelObserver = await mediasoupRouter.createAudioLevelObserver({
|
||||
maxEntries: 1,
|
||||
@@ -883,10 +902,22 @@ class Taoyao {
|
||||
audioLevelObserver,
|
||||
activeSpeakerObserver,
|
||||
});
|
||||
this.rooms.set(roomId, room);
|
||||
me.rooms.set(roomId, room);
|
||||
console.info("创建房间", roomId);
|
||||
this.push(message);
|
||||
return room;
|
||||
me.push(message);
|
||||
// 监听事件
|
||||
mediasoupRouter.observer.on("close", () => {
|
||||
console.info("房间路由关闭:", roomId, mediasoupRouter);
|
||||
room.closeAll();
|
||||
me.rooms.delete(roomId);
|
||||
me.push(
|
||||
protocol.buildMessage("room::close", {
|
||||
roomId: roomId
|
||||
})
|
||||
);
|
||||
});
|
||||
// mediasoupRouter.on("workerclose", () => {});
|
||||
// mediasoupRouter.observer.on("newtransport", fn(transport));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user