[*] 日常优化
This commit is contained in:
@@ -804,7 +804,7 @@ class Taoyao {
|
|||||||
/**
|
/**
|
||||||
* 消费媒体信令
|
* 消费媒体信令
|
||||||
*
|
*
|
||||||
* @param {*} message 消息
|
* @param {*} message 信令消息
|
||||||
* @param {*} body 消息主体
|
* @param {*} body 消息主体
|
||||||
*/
|
*/
|
||||||
async mediaConsume(message, body) {
|
async mediaConsume(message, body) {
|
||||||
@@ -818,8 +818,7 @@ class Taoyao {
|
|||||||
appData,
|
appData,
|
||||||
rtpCapabilities,
|
rtpCapabilities,
|
||||||
} = body;
|
} = body;
|
||||||
const me = this;
|
const room = this.rooms.get(roomId);
|
||||||
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 (
|
||||||
@@ -828,8 +827,8 @@ class Taoyao {
|
|||||||
!transport ||
|
!transport ||
|
||||||
!rtpCapabilities ||
|
!rtpCapabilities ||
|
||||||
!room.mediasoupRouter.canConsume({
|
!room.mediasoupRouter.canConsume({
|
||||||
producerId : producerId,
|
producerId,
|
||||||
rtpCapabilities: rtpCapabilities,
|
rtpCapabilities,
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
console.warn("不能消费媒体", body);
|
console.warn("不能消费媒体", body);
|
||||||
@@ -840,28 +839,21 @@ class Taoyao {
|
|||||||
for (let i = 0; i < consumerCount; i++) {
|
for (let i = 0; i < consumerCount; i++) {
|
||||||
promises.push(
|
promises.push(
|
||||||
(async () => {
|
(async () => {
|
||||||
let consumer;
|
const consumer = await transport.consume({
|
||||||
try {
|
paused: true,
|
||||||
consumer = await transport.consume({
|
producerId,
|
||||||
// 默认暂停
|
rtpCapabilities,
|
||||||
paused : true,
|
});
|
||||||
producerId : producerId,
|
|
||||||
rtpCapabilities: rtpCapabilities,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.error("创建消费者异常", body, error);
|
|
||||||
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);
|
console.debug("创建消费者", consumer.id, streamId);
|
||||||
consumer.on("transportclose", () => {
|
consumer.on("transportclose", () => {
|
||||||
console.info("消费者关闭(通道关闭)", consumer.id, streamId);
|
console.debug("消费者关闭(通道关闭)", consumer.id, streamId);
|
||||||
consumer.close();
|
consumer.close();
|
||||||
});
|
});
|
||||||
consumer.on("producerclose", () => {
|
consumer.on("producerclose", () => {
|
||||||
console.info("消费者关闭(生产者关闭)", consumer.id, streamId);
|
console.debug("消费者关闭(生产者关闭)", consumer.id, streamId);
|
||||||
consumer.close();
|
consumer.close();
|
||||||
});
|
});
|
||||||
consumer.on("producerpause", () => {
|
consumer.on("producerpause", () => {
|
||||||
@@ -883,7 +875,7 @@ class Taoyao {
|
|||||||
// consumer.observer.on("score", fn(score));
|
// consumer.observer.on("score", fn(score));
|
||||||
consumer.on("score", (score) => {
|
consumer.on("score", (score) => {
|
||||||
console.debug("消费者评分", consumer.id, streamId, score);
|
console.debug("消费者评分", consumer.id, streamId, score);
|
||||||
me.push(protocol.buildMessage("media::consumer::score", {
|
this.push(protocol.buildMessage("media::consumer::score", {
|
||||||
score,
|
score,
|
||||||
roomId,
|
roomId,
|
||||||
consumerId: consumer.id,
|
consumerId: consumer.id,
|
||||||
@@ -892,17 +884,17 @@ class Taoyao {
|
|||||||
// consumer.observer.on("layerschange", fn(layers));
|
// consumer.observer.on("layerschange", fn(layers));
|
||||||
consumer.on("layerschange", (layers) => {
|
consumer.on("layerschange", (layers) => {
|
||||||
console.debug("消费者空间层和时间层改变", consumer.id, streamId, layers);
|
console.debug("消费者空间层和时间层改变", consumer.id, streamId, layers);
|
||||||
me.push(protocol.buildMessage("media::consumer::layers::change", {
|
this.push(protocol.buildMessage("media::consumer::layers::change", {
|
||||||
roomId,
|
roomId,
|
||||||
consumerId : consumer.id,
|
consumerId : consumer.id,
|
||||||
spatialLayer : layers ? layers.spatialLayer : null,
|
spatialLayer : layers?.spatialLayer,
|
||||||
temporalLayer: layers ? layers.temporalLayer : null,
|
temporalLayer: layers?.temporalLayer,
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
consumer.observer.on("close", () => {
|
consumer.observer.on("close", () => {
|
||||||
if(room.consumers.delete(consumer.id)) {
|
if(room.consumers.delete(consumer.id)) {
|
||||||
console.debug("消费者关闭", consumer.id, streamId);
|
console.debug("消费者关闭", consumer.id, streamId);
|
||||||
me.push(protocol.buildMessage("media::consumer::close", {
|
this.push(protocol.buildMessage("media::consumer::close", {
|
||||||
roomId,
|
roomId,
|
||||||
consumerId: consumer.id
|
consumerId: consumer.id
|
||||||
}));
|
}));
|
||||||
@@ -912,14 +904,14 @@ class Taoyao {
|
|||||||
});
|
});
|
||||||
consumer.observer.on("pause", () => {
|
consumer.observer.on("pause", () => {
|
||||||
console.debug("消费者暂停", consumer.id, streamId);
|
console.debug("消费者暂停", consumer.id, streamId);
|
||||||
me.push(protocol.buildMessage("media::consumer::pause", {
|
this.push(protocol.buildMessage("media::consumer::pause", {
|
||||||
roomId,
|
roomId,
|
||||||
consumerId: consumer.id
|
consumerId: consumer.id
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
consumer.observer.on("resume", () => {
|
consumer.observer.on("resume", () => {
|
||||||
console.debug("消费者恢复", consumer.id, streamId);
|
console.debug("消费者恢复", consumer.id, streamId);
|
||||||
me.push(protocol.buildMessage("media::consumer::resume", {
|
this.push(protocol.buildMessage("media::consumer::resume", {
|
||||||
roomId,
|
roomId,
|
||||||
consumerId: consumer.id
|
consumerId: consumer.id
|
||||||
}));
|
}));
|
||||||
@@ -930,7 +922,7 @@ class Taoyao {
|
|||||||
// console.debug("消费者跟踪事件(trace)", consumer.id, streamId, trace);
|
// console.debug("消费者跟踪事件(trace)", consumer.id, streamId, trace);
|
||||||
// });
|
// });
|
||||||
// 等待终端准备就绪:可以不用等待直接使用push方法
|
// 等待终端准备就绪:可以不用等待直接使用push方法
|
||||||
await me.request(protocol.buildMessage("media::consume", {
|
await this.request(protocol.buildMessage("media::consume", {
|
||||||
roomId,
|
roomId,
|
||||||
clientId,
|
clientId,
|
||||||
sourceId,
|
sourceId,
|
||||||
|
|||||||
@@ -838,6 +838,9 @@ class Taoyao extends RemoteClient {
|
|||||||
case "media::consumer::close":
|
case "media::consumer::close":
|
||||||
me.defaultMediaConsumerClose(message, body);
|
me.defaultMediaConsumerClose(message, body);
|
||||||
break;
|
break;
|
||||||
|
case "media::consumer::layers::change":
|
||||||
|
this.defaultMediaConsumerLayersChange(message, body);
|
||||||
|
break;
|
||||||
case "media::consumer::pause":
|
case "media::consumer::pause":
|
||||||
me.defaultMediaConsumerPause(message, body);
|
me.defaultMediaConsumerPause(message, body);
|
||||||
break;
|
break;
|
||||||
@@ -1527,14 +1530,13 @@ class Taoyao extends RemoteClient {
|
|||||||
* @param {*} producerId 生产者ID
|
* @param {*} producerId 生产者ID
|
||||||
*/
|
*/
|
||||||
mediaConsume(producerId) {
|
mediaConsume(producerId) {
|
||||||
const me = this;
|
if(!this.recvTransport) {
|
||||||
if(!me.recvTransport) {
|
this.platformError("没有连接接收通道");
|
||||||
me.platformError("没有连接接收通道");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
me.push(protocol.buildMessage("media::consume", {
|
this.push(protocol.buildMessage("media::consume", {
|
||||||
roomId : me.roomId,
|
producerId,
|
||||||
producerId: producerId,
|
roomId: this.roomId,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1550,8 +1552,7 @@ class Taoyao extends RemoteClient {
|
|||||||
* @param {*} body 消息主体
|
* @param {*} body 消息主体
|
||||||
*/
|
*/
|
||||||
async defaultMediaConsume(message, body) {
|
async defaultMediaConsume(message, body) {
|
||||||
const me = this;
|
if (!this.audioConsume && !this.videoConsume) {
|
||||||
if (!me.audioConsume && !me.videoConsume) {
|
|
||||||
console.debug("没有消费媒体");
|
console.debug("没有消费媒体");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1569,10 +1570,15 @@ class Taoyao extends RemoteClient {
|
|||||||
producerPaused,
|
producerPaused,
|
||||||
} = body;
|
} = body;
|
||||||
try {
|
try {
|
||||||
const consumer = await me.recvTransport.consume({
|
const consumer = await this.recvTransport.consume({
|
||||||
id: consumerId,
|
id: consumerId,
|
||||||
appData: { ...appData, clientId, sourceId, streamId },
|
appData: {
|
||||||
// 让libwebrtc同步相同来源媒体
|
...appData,
|
||||||
|
clientId,
|
||||||
|
sourceId,
|
||||||
|
streamId
|
||||||
|
},
|
||||||
|
// libwebrtc同步相同来源媒体
|
||||||
streamId: `${clientId}-${appData.videoSource || "taoyao"}`,
|
streamId: `${clientId}-${appData.videoSource || "taoyao"}`,
|
||||||
kind,
|
kind,
|
||||||
producerId,
|
producerId,
|
||||||
@@ -1581,16 +1587,16 @@ class Taoyao extends RemoteClient {
|
|||||||
consumer.clientId = clientId;
|
consumer.clientId = clientId;
|
||||||
consumer.sourceId = sourceId;
|
consumer.sourceId = sourceId;
|
||||||
consumer.streamId = streamId;
|
consumer.streamId = streamId;
|
||||||
me.consumers.set(consumer.id, consumer);
|
this.consumers.set(consumer.id, consumer);
|
||||||
consumer.on("transportclose", () => {
|
consumer.on("transportclose", () => {
|
||||||
console.debug("消费者关闭(通道关闭)", consumer.id, streamId);
|
console.debug("消费者关闭(通道关闭)", consumer.id, streamId);
|
||||||
consumer.close();
|
consumer.close();
|
||||||
});
|
});
|
||||||
consumer.observer.on("close", () => {
|
consumer.observer.on("close", () => {
|
||||||
if(me.consumers.delete(consumer.id)) {
|
if(this.consumers.delete(consumer.id)) {
|
||||||
console.debug("消费者关闭", consumer.id, streamId);
|
console.debug("消费者关闭", consumer.id, streamId);
|
||||||
} else {
|
} else {
|
||||||
console.debug("消费者关闭(无效)", consumer.id, streamId);
|
console.debug("消费者关闭(消费者无效)", consumer.id, streamId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const {
|
const {
|
||||||
@@ -1599,12 +1605,11 @@ class Taoyao extends RemoteClient {
|
|||||||
} = mediasoupClient.parseScalabilityMode(
|
} = mediasoupClient.parseScalabilityMode(
|
||||||
consumer.rtpParameters.encodings[0].scalabilityMode
|
consumer.rtpParameters.encodings[0].scalabilityMode
|
||||||
);
|
);
|
||||||
console.debug("时间层空间层", spatialLayers, temporalLayers);
|
this.push(message);
|
||||||
me.push(message);
|
console.debug("添加远程媒体消费者", consumer, spatialLayers, temporalLayers);
|
||||||
console.debug("远程媒体消费者", consumer);
|
|
||||||
const track = consumer.track;
|
const track = consumer.track;
|
||||||
const remoteClient = me.remoteClients.get(consumer.sourceId);
|
const remoteClient = this.remoteClients.get(consumer.sourceId);
|
||||||
me.callbackTrack(sourceId, track);
|
this.callbackTrack(sourceId, track);
|
||||||
if (
|
if (
|
||||||
remoteClient &&
|
remoteClient &&
|
||||||
remoteClient.proxy &&
|
remoteClient.proxy &&
|
||||||
@@ -1621,10 +1626,10 @@ class Taoyao extends RemoteClient {
|
|||||||
}
|
}
|
||||||
remoteClient.proxy.media(track, consumer);
|
remoteClient.proxy.media(track, consumer);
|
||||||
} else {
|
} else {
|
||||||
console.warn("远程终端没有实现代理", remoteClient);
|
console.warn("远程终端没有实现代理", consumer.sourceId, remoteClient);
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
me.platformError("消费媒体异常", error);
|
this.platformError("消费媒体异常", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1659,6 +1664,16 @@ class Taoyao extends RemoteClient {
|
|||||||
consumer.close();
|
consumer.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消费者空间层和时间层改变信令
|
||||||
|
*
|
||||||
|
* @param {*} message 信令消息
|
||||||
|
* @param {*} body 信令主体
|
||||||
|
*/
|
||||||
|
defaultMediaConsumerLayersChange(message, body) {
|
||||||
|
console.debug("消费者空间层和时间层改变", body);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 暂停消费者信令
|
* 暂停消费者信令
|
||||||
*
|
*
|
||||||
@@ -1903,7 +1918,7 @@ class Taoyao extends RemoteClient {
|
|||||||
console.debug("数据消费者消息", dataConsumer.id, streamId, message.toString("UTF-8"), ppid);
|
console.debug("数据消费者消息", dataConsumer.id, streamId, message.toString("UTF-8"), ppid);
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
me.platformError("消费数据异常", error);
|
this.platformError("消费数据异常", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,14 +39,27 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
""",
|
""",
|
||||||
body = """
|
body = """
|
||||||
{
|
{
|
||||||
"roomId" : "房间ID"
|
"roomId" : "房间ID",
|
||||||
"producerId": "生产者ID"
|
"producerId": "生产者ID"
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
"roomId" : "房间ID",
|
||||||
|
"clientId" : "消费者ID",
|
||||||
|
"sourceId" : "生产者ID",
|
||||||
|
"streamId" : "媒体ID",
|
||||||
|
"producerId" : "生产者ID",
|
||||||
|
"consumerId" : "消费者ID",
|
||||||
|
"kind" : "消费者媒体类型",
|
||||||
|
"type" : "消费者类型",
|
||||||
|
"appData" : "APP数据",
|
||||||
|
"rtpParameters" : "RTP参数",
|
||||||
|
"producerPaused": "生产者是否暂停",
|
||||||
|
}
|
||||||
""",
|
""",
|
||||||
flow = {
|
flow = {
|
||||||
|
"终端->信令服务->媒体服务=>信令服务->终端",
|
||||||
"终端-[生产媒体]>信令服务-[消费媒体])信令服务=>信令服务->终端",
|
"终端-[生产媒体]>信令服务-[消费媒体])信令服务=>信令服务->终端",
|
||||||
"终端-[创建WebRTC通道]>信令服务-[消费媒体])信令服务=>信令服务->终端",
|
"终端-[创建WebRTC通道]>信令服务-[消费媒体])信令服务=>信令服务->终端",
|
||||||
"终端->信令服务->媒体服务=>信令服务->终端"
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
public class MediaConsumeProtocol extends ProtocolRoomAdapter implements ApplicationListener<MediaConsumeEvent> {
|
public class MediaConsumeProtocol extends ProtocolRoomAdapter implements ApplicationListener<MediaConsumeEvent> {
|
||||||
@@ -63,13 +76,13 @@ public class MediaConsumeProtocol extends ProtocolRoomAdapter implements Applica
|
|||||||
final Room room = event.getRoom();
|
final Room room = event.getRoom();
|
||||||
if(event.getProducer() != null) {
|
if(event.getProducer() != null) {
|
||||||
// 生产媒体:其他终端消费
|
// 生产媒体:其他终端消费
|
||||||
final Producer producer = event.getProducer();
|
final Producer producer = event.getProducer();
|
||||||
final ClientWrapper produceClientWrapper = producer.getProducerClient();
|
final ClientWrapper produceClientWrapper = producer.getProducerClient();
|
||||||
room.getClients().values().stream()
|
room.getClients().values().stream()
|
||||||
.filter(v -> v != produceClientWrapper)
|
.filter(v -> v != produceClientWrapper)
|
||||||
.filter(v -> v.getRecvTransport() != null)
|
.filter(v -> v.getRecvTransport() != null)
|
||||||
.filter(v -> v.getSubscribeType().canConsume(producer))
|
.filter(v -> v.getSubscribeType().canConsume(producer))
|
||||||
.forEach(v -> this.consume(room, v, producer, this.build()));
|
.forEach(consumeClientWrapper -> this.consume(room, consumeClientWrapper, producer, this.build()));
|
||||||
} else if(event.getClientWrapper() != null) {
|
} else if(event.getClientWrapper() != null) {
|
||||||
// 创建WebRTC消费通道:消费其他终端
|
// 创建WebRTC消费通道:消费其他终端
|
||||||
final ClientWrapper consumeClientWrapper = event.getClientWrapper();
|
final ClientWrapper consumeClientWrapper = event.getClientWrapper();
|
||||||
@@ -138,7 +151,7 @@ public class MediaConsumeProtocol extends ProtocolRoomAdapter implements Applica
|
|||||||
if(consumerClientWrapper.consumed(producer)) {
|
if(consumerClientWrapper.consumed(producer)) {
|
||||||
// 消费通道就绪
|
// 消费通道就绪
|
||||||
mediaClient.push(message);
|
mediaClient.push(message);
|
||||||
log.info("{}消费通道就绪:{}", consumerClientId, streamId);
|
log.debug("{}消费通道就绪:{}", consumerClientId, streamId);
|
||||||
} else {
|
} else {
|
||||||
// 主动消费媒体
|
// 主动消费媒体
|
||||||
final Transport recvTransport = consumerClientWrapper.getRecvTransport();
|
final Transport recvTransport = consumerClientWrapper.getRecvTransport();
|
||||||
|
|||||||
Reference in New Issue
Block a user