[*] 日常优化

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,8 +945,6 @@ class Taoyao {
} }
} }
// TODO:continue
/** /**
* 关闭生产者信令 * 关闭生产者信令
* *
@@ -953,14 +952,15 @@ class Taoyao {
* @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);
} }
} }
@@ -971,14 +971,15 @@ class Taoyao {
* @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);
} }
} }
@@ -989,17 +990,24 @@ class Taoyao {
* @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,7 +1019,8 @@ class Taoyao {
appData, appData,
rtpCapabilities, rtpCapabilities,
} = body; } = body;
const room = this.rooms.get(roomId); const me = this;
const room = me.rooms.get(roomId);
const producer = room?.producers.get(producerId); const producer = room?.producers.get(producerId);
const transport = room?.transports.get(transportId); const transport = room?.transports.get(transportId);
if ( if (
@@ -1024,50 +1033,36 @@ class Taoyao {
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({
// 默认暂停
paused : true,
producerId : producerId, 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,32 +1070,21 @@ 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,
@@ -1108,9 +1092,10 @@ class Taoyao {
}) })
); );
}); });
// 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,
@@ -1119,29 +1104,22 @@ class Taoyao {
}) })
); );
}); });
// 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
@@ -1149,37 +1127,38 @@ class Taoyao {
); );
}); });
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,
@@ -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);
} }
} }
@@ -1203,14 +1182,15 @@ class Taoyao {
* @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);
} }
} }
@@ -1221,15 +1201,16 @@ class Taoyao {
* @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);
} }
} }
@@ -1242,15 +1223,14 @@ class Taoyao {
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);
} }
} }
@@ -1261,15 +1241,16 @@ class Taoyao {
* @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);
} }
} }
@@ -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;
} }