[*] 日常优化

This commit is contained in:
acgist
2023-07-01 09:30:44 +08:00
parent 02f266dbc9
commit ac96910bf0
2 changed files with 119 additions and 141 deletions

View File

@@ -838,7 +838,6 @@ class Taoyao {
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaProduce(message, body) { async mediaProduce(message, body) {
const me = this;
const { const {
kind, kind,
roomId, roomId,
@@ -848,6 +847,7 @@ class Taoyao {
appData, appData,
rtpParameters rtpParameters
} = body; } = body;
const me = this;
const room = me.rooms.get(roomId); const room = me.rooms.get(roomId);
const transport = room?.transports.get(transportId); const transport = room?.transports.get(transportId);
if(!transport) { if(!transport) {
@@ -863,6 +863,7 @@ class Taoyao {
producer.clientId = clientId; producer.clientId = clientId;
producer.streamId = streamId; producer.streamId = streamId;
room.producers.set(producer.id, producer); room.producers.set(producer.id, producer);
console.debug("创建生产者", producer.id, streamId);
producer.on("transportclose", () => { producer.on("transportclose", () => {
console.info("生产者关闭(通道关闭)", producer.id, streamId); console.info("生产者关闭(通道关闭)", producer.id, streamId);
producer.close(); producer.close();
@@ -870,7 +871,7 @@ class Taoyao {
producer.observer.on("close", () => { producer.observer.on("close", () => {
if(room.producers.delete(producer.id)) { if(room.producers.delete(producer.id)) {
console.info("生产者关闭", producer.id, streamId); console.info("生产者关闭", producer.id, streamId);
this.push( me.push(
protocol.buildMessage("media::producer::close", { protocol.buildMessage("media::producer::close", {
roomId : roomId, roomId : roomId,
producerId: producer.id producerId: producer.id
@@ -882,7 +883,7 @@ class Taoyao {
}); });
producer.observer.on("pause", () => { producer.observer.on("pause", () => {
console.debug("生产者暂停", producer.id, streamId); console.debug("生产者暂停", producer.id, streamId);
this.push( me.push(
protocol.buildMessage("media::producer::pause", { protocol.buildMessage("media::producer::pause", {
roomId : roomId, roomId : roomId,
producerId: producer.id producerId: producer.id
@@ -891,7 +892,7 @@ class Taoyao {
}); });
producer.observer.on("resume", () => { producer.observer.on("resume", () => {
console.debug("生产者恢复", producer.id, streamId); console.debug("生产者恢复", producer.id, streamId);
this.push( me.push(
protocol.buildMessage("media::producer::resume", { protocol.buildMessage("media::producer::resume", {
roomId : roomId, roomId : roomId,
producerId: producer.id producerId: producer.id
@@ -922,14 +923,14 @@ class Taoyao {
// await producer.enableTraceEvent([ 'pli', 'fir', 'rtp', 'nack', 'keyframe' ]); // await producer.enableTraceEvent([ 'pli', 'fir', 'rtp', 'nack', 'keyframe' ]);
// producer.observer.on("trace", fn(trace)); // producer.observer.on("trace", fn(trace));
// producer.on("trace", (trace) => { // producer.on("trace", (trace) => {
// console.debug("生产者跟踪", producer.id, trace); // console.debug("生产者跟踪事件trace", producer.id, streamId, trace);
// }); // });
message.body = { message.body = {
kind : kind, kind : kind,
roomId : roomId, roomId : roomId,
producerId: producer.id producerId: producer.id
}; };
this.push(message); me.push(message);
if (producer.kind === "audio") { if (producer.kind === "audio") {
room.audioLevelObserver room.audioLevelObserver
.addProducer({ producerId: producer.id }) .addProducer({ producerId: producer.id })
@@ -944,23 +945,22 @@ class Taoyao {
} }
} }
// TODO:continue
/** /**
* 关闭生产者信令 * 关闭生产者信令
* *
* @param {*} message 消息 * @param {*} message 消息
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaProducerClose(message, body) { async mediaProducerClose(message, body) {
const me = this;
const { roomId, producerId } = body; const { roomId, producerId } = body;
const room = this.rooms.get(roomId); const room = me.rooms.get(roomId);
const producer = room?.producers.get(producerId); const producer = room?.producers.get(producerId);
if(producer) { if(producer) {
console.info("关闭生产者", producerId); console.info("关闭生产者", producerId);
await producer.close(); await producer.close();
} else { } else {
console.info("关闭生产者无效", producerId); console.debug("关闭生产者无效", producerId);
} }
} }
@@ -968,17 +968,18 @@ class Taoyao {
* 暂停生产者信令 * 暂停生产者信令
* *
* @param {*} message 消息 * @param {*} message 消息
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaProducerPause(message, body) { async mediaProducerPause(message, body) {
const me = this;
const { roomId, producerId } = body; const { roomId, producerId } = body;
const room = this.rooms.get(roomId); const room = me.rooms.get(roomId);
const producer = room.producers.get(producerId); const producer = room?.producers.get(producerId);
if(producer) { if(producer) {
console.info("暂停生产者", producerId); console.debug("暂停生产者", producerId);
await producer.pause(); await producer.pause();
} else { } else {
console.info("暂停生产者无效", producerId); console.debug("暂停生产者无效(无效)", producerId);
} }
} }
@@ -986,20 +987,27 @@ class Taoyao {
* 恢复生产者信令 * 恢复生产者信令
* *
* @param {*} message 消息 * @param {*} message 消息
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaProducerResume(message, body) { async mediaProducerResume(message, body) {
const me = this;
const { roomId, producerId } = body; const { roomId, producerId } = body;
const room = this.rooms.get(roomId); const room = me.rooms.get(roomId);
const producer = room.producers.get(producerId); const producer = room?.producers.get(producerId);
if(producer) { if(producer) {
console.info("恢复生产者", producerId); console.debug("恢复生产者", producerId);
await producer.resume(); await producer.resume();
} else { } else {
console.info("恢复生产者无效", producerId); console.debug("恢复生产者无效", producerId);
} }
} }
/**
* 消费媒体信令
*
* @param {*} message 消息
* @param {*} body 消息主体
*/
async mediaConsume(message, body) { async mediaConsume(message, body) {
const { const {
roomId, roomId,
@@ -1011,63 +1019,50 @@ class Taoyao {
appData, appData,
rtpCapabilities, rtpCapabilities,
} = body; } = body;
const room = this.rooms.get(roomId); const me = this;
const producer = room?.producers.get(producerId); const room = me.rooms.get(roomId);
const producer = room?.producers.get(producerId);
const transport = room?.transports.get(transportId); const transport = room?.transports.get(transportId);
if ( if (
!room || !room ||
!producer || !producer ||
!transport || !transport ||
!rtpCapabilities || !rtpCapabilities ||
!room.mediasoupRouter.canConsume({ !room.mediasoupRouter.canConsume({
producerId: producerId, producerId : producerId,
rtpCapabilities: rtpCapabilities, rtpCapabilities: rtpCapabilities,
}) })
) { ) {
console.warn( console.warn("不能消费媒体", body);
"不能消费媒体:",
roomId,
clientId,
producerId,
transportId,
rtpCapabilities
);
return; return;
} }
const promises = []; const promises = [];
const consumerCount = 1 + room.consumerReplicas; const consumerCount = room.consumerReplicas + 1;
for (let i = 0; i < consumerCount; i++) { for (let i = 0; i < consumerCount; i++) {
promises.push( promises.push(
(async () => { (async () => {
let consumer; let consumer;
try { try {
consumer = await transport.consume({ consumer = await transport.consume({
producerId: producerId, // 默认暂停
paused : true,
producerId : producerId,
rtpCapabilities: rtpCapabilities, rtpCapabilities: rtpCapabilities,
// 暂停
paused: true,
}); });
} catch (error) { } catch (error) {
console.error( console.error("创建消费者异常", body, error);
"创建消费者异常:",
roomId,
clientId,
producerId,
transportId,
rtpCapabilities,
error
);
return; return;
} }
consumer.clientId = clientId; consumer.clientId = clientId;
consumer.streamId = streamId; consumer.streamId = streamId;
room.consumers.set(consumer.id, consumer); room.consumers.set(consumer.id, consumer);
console.debug("创建消费者", consumer.id, streamId);
consumer.on("transportclose", () => { consumer.on("transportclose", () => {
console.info("consumer transportclose", consumer.id); console.info("消费者关闭(通道关闭)", consumer.id, streamId);
consumer.close(); consumer.close();
}); });
consumer.on("producerclose", () => { consumer.on("producerclose", () => {
console.info("consumer producerclose", consumer.id); console.info("消费者关闭(生产者关闭)", consumer.id, streamId);
consumer.close(); consumer.close();
}); });
consumer.on("producerpause", () => { consumer.on("producerpause", () => {
@@ -1075,114 +1070,98 @@ class Taoyao {
if(consumer.localPaused) { if(consumer.localPaused) {
return; return;
} }
console.info("consumer producerpause", consumer.id); console.debug("消费者暂停(生产者暂停)", consumer.id, streamId);
consumer.pause(); consumer.pause();
this.push(
protocol.buildMessage("media::consumer::pause", {
roomId: roomId,
consumerId: consumer.id,
})
);
}); });
consumer.on("producerresume", () => { consumer.on("producerresume", () => {
// 本地暂停不要操作 // 本地暂停不要操作
if(consumer.localPaused) { if(consumer.localPaused) {
return; return;
} }
console.info("consumer producerresume", consumer.id); console.debug("消费者恢复(生产者恢复)", consumer.id, streamId);
consumer.resume(); consumer.resume();
this.push(
protocol.buildMessage("media::consumer::resume", {
roomId: roomId,
consumerId: consumer.id,
})
);
}); });
// consumer.observer.on("score", fn(score));
consumer.on("score", (score) => { consumer.on("score", (score) => {
console.info("consumer score", consumer.id, score); console.debug("消费者评分", consumer.id, streamId, score);
this.push( me.push(
protocol.buildMessage("media::consumer::score", { protocol.buildMessage("media::consumer::score", {
score: score, score : score,
roomId: roomId, roomId : roomId,
consumerId: consumer.id, consumerId: consumer.id,
}) })
); );
}); });
// consumer.observer.on("layerschange", fn(layers));
consumer.on("layerschange", (layers) => { consumer.on("layerschange", (layers) => {
console.info("consumer layerschange", consumer.id, layers); console.debug("消费者空间层和时间层改变", consumer.id, streamId, layers);
this.push( me.push(
protocol.buildMessage("media::consumer::layers::change", { protocol.buildMessage("media::consumer::layers::change", {
roomId: roomId, roomId : roomId,
consumerId: consumer.id, consumerId: consumer.id,
spatialLayer: layers ? layers.spatialLayer : null, spatialLayer : layers ? layers.spatialLayer : null,
temporalLayer: layers ? layers.temporalLayer : null, temporalLayer: layers ? layers.temporalLayer : null,
}) })
); );
}); });
// await consumer.enableTraceEvent([ 'rtp', 'keyframe', 'nack', 'pli', 'fir' ]);
// consumer.on("trace", (trace) => {
// console.info("consumer trace", consumer.id, trace);
// });
// consumer.on("rtp", (rtpPacket) => {
// console.info("consumer rtp", consumer.id, rtpPacket);
// });
consumer.observer.on("close", () => { consumer.observer.on("close", () => {
if(room.consumers.delete(consumer.id)) { if(room.consumers.delete(consumer.id)) {
console.info("consumer close", consumer.id); console.info("消费者关闭", consumer.id, streamId);
this.push( me.push(
protocol.buildMessage("media::consumer::close", { protocol.buildMessage("media::consumer::close", {
roomId: roomId, roomId : roomId,
consumerId: consumer.id consumerId: consumer.id
}) })
); );
} else { } else {
console.debug("consumer close non", consumer.id); console.debug("消费者关闭(无效)", consumer.id, streamId);
} }
}); });
consumer.observer.on("pause", () => { consumer.observer.on("pause", () => {
console.info("consumer pause", consumer.id); console.debug("消费者暂停", consumer.id, streamId);
this.push( me.push(
protocol.buildMessage("media::consumer::pause", { protocol.buildMessage("media::consumer::pause", {
roomId: roomId, roomId : roomId,
consumerId: consumer.id consumerId: consumer.id
}) })
); );
}); });
consumer.observer.on("resume", () => { consumer.observer.on("resume", () => {
console.info("consumer resume", consumer.id); console.debug("消费者恢复", consumer.id, streamId);
this.push( me.push(
protocol.buildMessage("media::consumer::resume", { protocol.buildMessage("media::consumer::resume", {
roomId: roomId, roomId : roomId,
consumerId: consumer.id consumerId: consumer.id
}) })
); );
}); });
// consumer.observer.on("score", fn(score)); // await consumer.enableTraceEvent([ 'pli', 'fir', 'rtp', 'nack', 'keyframe' ]);
// consumer.observer.on("layerschange", fn(layers));
// consumer.observer.on("trace", fn(trace)); // consumer.observer.on("trace", fn(trace));
// 等待终端准备就绪 // consumer.on("trace", (trace) => {
await this.request( // console.info("消费者跟踪事件trace", consumer.id, streamId, trace);
// this.push( // });
// 等待终端准备就绪可以不用等待直接使用push方法
await me.request(
protocol.buildMessage("media::consume", { protocol.buildMessage("media::consume", {
kind: consumer.kind, kind : consumer.kind,
type: consumer.type, type : consumer.type,
roomId: roomId, roomId : roomId,
appData: producer.appData, clientId : clientId,
clientId: clientId, sourceId : sourceId,
sourceId: sourceId, streamId : streamId,
streamId: streamId, producerId : producerId,
producerId: producerId, consumerId : consumer.id,
consumerId: consumer.id, appData : producer.appData,
rtpParameters: consumer.rtpParameters, rtpParameters : consumer.rtpParameters,
producerPaused: consumer.producerPaused, producerPaused: consumer.producerPaused,
}) })
); );
await consumer.resume(); await consumer.resume();
consumer.localPaused = false; consumer.localPaused = false;
this.push( me.push(
protocol.buildMessage("media::consumer::score", { protocol.buildMessage("media::consumer::score", {
score: consumer.score, score : consumer.score,
roomId: roomId, roomId : roomId,
consumerId: consumer.id, consumerId: consumer.id,
}) })
); );
@@ -1192,7 +1171,7 @@ class Taoyao {
try { try {
await Promise.all(promises); await Promise.all(promises);
} catch (error) { } catch (error) {
console.warn("_createConsumer() | failed:%o", error); console.error("消费媒体异常", error);
} }
} }
@@ -1200,17 +1179,18 @@ class Taoyao {
* 关闭消费者信令 * 关闭消费者信令
* *
* @param {*} message 消息 * @param {*} message 消息
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaConsumerClose(message, body) { async mediaConsumerClose(message, body) {
const me = this;
const { roomId, consumerId } = body; const { roomId, consumerId } = body;
const room = this.rooms.get(roomId); const room = me.rooms.get(roomId);
const consumer = room?.consumers.get(consumerId); const consumer = room?.consumers.get(consumerId);
if(consumer) { if(consumer) {
console.info("关闭消费者", consumerId); console.info("关闭消费者", consumerId);
await consumer.close(); await consumer.close();
} else { } else {
console.info("关闭消费者无效", consumerId); console.debug("关闭消费者无效(无效)", consumerId);
} }
} }
@@ -1218,18 +1198,19 @@ class Taoyao {
* 暂停消费者信令 * 暂停消费者信令
* *
* @param {*} message 消息 * @param {*} message 消息
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaConsumerPause(message, body) { async mediaConsumerPause(message, body) {
const me = this;
const { roomId, consumerId } = body; const { roomId, consumerId } = body;
const room = this.rooms.get(roomId); const room = me.rooms.get(roomId);
const consumer = room?.consumers.get(consumerId); const consumer = room?.consumers.get(consumerId);
if(consumer) { if(consumer) {
consumer.localPaused = true; consumer.localPaused = true;
console.info("暂停消费者", consumerId); console.debug("暂停消费者", consumerId);
await consumer.pause(); await consumer.pause();
} else { } else {
console.info("暂停消费者无效", consumerId); console.debug("暂停消费者无效", consumerId);
} }
} }
@@ -1237,20 +1218,19 @@ class Taoyao {
* 请求关键帧信令 * 请求关键帧信令
* *
* @param {*} message 消息 * @param {*} message 消息
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaConsumerRequestKeyFrame(message, body) { async mediaConsumerRequestKeyFrame(message, body) {
const me = this; const me = this;
const { roomId, consumerId } = body; const { roomId, consumerId } = body;
const room = this.rooms.get(roomId); const room = me.rooms.get(roomId);
const consumer = room?.consumers.get(consumerId); const consumer = room?.consumers.get(consumerId);
if(consumer) { if(consumer) {
console.info("mediaConsumerRequestKeyFrame", consumerId); console.debug("请求关键帧", consumerId);
// 处理trace监听读取关键帧 // 通过trace事件监听关键帧的信息
await consumer.requestKeyFrame(); await consumer.requestKeyFrame();
me.push(message);
} else { } else {
console.info("mediaConsumerRequestKeyFrame non", consumerId); console.debug("请求关键帧(无效)", consumerId);
} }
} }
@@ -1258,18 +1238,19 @@ class Taoyao {
* 恢复消费者信令 * 恢复消费者信令
* *
* @param {*} message 消息 * @param {*} message 消息
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaConsumerResume(message, body) { async mediaConsumerResume(message, body) {
const me = this;
const { roomId, consumerId } = body; const { roomId, consumerId } = body;
const room = this.rooms.get(roomId); const room = me.rooms.get(roomId);
const consumer = room.consumers.get(consumerId); const consumer = room?.consumers.get(consumerId);
if(consumer) { if(consumer) {
consumer.localPaused = false; consumer.localPaused = false;
console.info("恢复消费者", consumerId); console.debug("恢复消费者", consumerId);
await consumer.resume(); await consumer.resume();
} else { } else {
console.info("恢复消费者无效", consumerId); console.debug("恢复消费者无效", consumerId);
} }
} }
@@ -1277,7 +1258,7 @@ class Taoyao {
* 修改最佳空间层和时间层信令 * 修改最佳空间层和时间层信令
* *
* @param {*} message 消息 * @param {*} message 消息
* @param {*} body 消息主体 * @param {*} body 消息主体
*/ */
async mediaConsumerSetPreferredLayers(message, body) { async mediaConsumerSetPreferredLayers(message, body) {
const me = this; const me = this;
@@ -1287,17 +1268,18 @@ class Taoyao {
spatialLayer, spatialLayer,
temporalLayer temporalLayer
} = body; } = body;
const room = this.rooms.get(roomId); const room = me.rooms.get(roomId);
const consumer = room?.consumers.get(consumerId); const consumer = room?.consumers.get(consumerId);
if(consumer) { if(consumer) {
console.info("mediaConsumerSetPreferredLayers", consumerId); console.debug("修改最佳空间层和时间层", consumerId);
await consumer.setPreferredLayers({ spatialLayer, temporalLayer }); await consumer.setPreferredLayers({ spatialLayer, temporalLayer });
me.push(message);
} else { } else {
console.info("mediaConsumerSetPreferredLayers non", consumerId); console.debug("修改最佳空间层和时间层(无效)", consumerId);
} }
} }
// TODOcontinue
/** /**
* 消费数据信令 * 消费数据信令
* *
@@ -1641,14 +1623,9 @@ class Taoyao {
console.info("transport listenserverclose", transport.id); console.info("transport listenserverclose", transport.id);
transport.close(); transport.close();
}); });
// await transport.enableTraceEvent([ 'probation', 'bwe' ]); // await transport.enableTraceEvent([ 'bwe', 'probation' ]);
// transport.on("trace", (trace) => { // transport.on("trace", (trace) => {
// // 网络评估 // console.debug("通道跟踪事件trace", transport.id, trace);
// if (trace.type === "bwe" && trace.direction === "out") {
// logger.debug("transport downlinkBwe", trace);
// } else {
// console.debug("transport trace", transport.id, trace);
// }
// }); // });
transport.observer.on("close", () => { transport.observer.on("close", () => {
if(room.transports.delete(transport.id)) { if(room.transports.delete(transport.id)) {

View File

@@ -2300,6 +2300,7 @@ class Taoyao extends RemoteClient {
async sessionCall(clientId) { async sessionCall(clientId) {
const me = this; const me = this;
if (!clientId) { if (!clientId) {
// TODO判断自己
this.callbackError("无效终端"); this.callbackError("无效终端");
return; return;
} }