From 3501308dbd01c74d4a291f1712523671cc428cab Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Fri, 4 Aug 2023 08:23:12 +0800 Subject: [PATCH] =?UTF-8?q?[*]=20=E6=97=A5=E5=B8=B8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- taoyao-client-media/src/Taoyao.js | 68 ++++++++++++++++++- taoyao-client-web/src/components/Taoyao.js | 59 ++++++++++++++++ .../media/MediaConsumerScoreProtocol.java | 10 ++- ...diaConsumerSetPreferredLayersProtocol.java | 14 ++-- .../MediaConsumerSetPriorityProtocol.java | 8 +-- .../media/MediaConsumerStatusProtocol.java | 4 +- 6 files changed, 142 insertions(+), 21 deletions(-) diff --git a/taoyao-client-media/src/Taoyao.js b/taoyao-client-media/src/Taoyao.js index 2d5c021..b6c7ede 100644 --- a/taoyao-client-media/src/Taoyao.js +++ b/taoyao-client-media/src/Taoyao.js @@ -414,6 +414,12 @@ class Taoyao { case "media::consumer::set::preferred::layers": me.mediaConsumerSetPreferredLayers(message, body); break; + case "media::consumer::set::priority": + me.mediaConsumerSetPriority(message, body); + break; + case "media::consumer::status": + me.mediaConsumerStatus(message, body); + break; case "media::data::consume": me.mediaDataConsume(message, body); break; @@ -1060,9 +1066,9 @@ class Taoyao { console.debug("消费者评分", consumer.id, streamId, score); me.push( protocol.buildMessage("media::consumer::score", { - score : score, roomId : roomId, consumerId: consumer.id, + score : score, }) ); }); @@ -1240,18 +1246,74 @@ class Taoyao { roomId, consumerId, spatialLayer, - temporalLayer + temporalLayer, } = body; const room = me.rooms.get(roomId); const consumer = room?.consumers.get(consumerId); if(consumer) { console.debug("修改最佳空间层和时间层", consumerId); - await consumer.setPreferredLayers({ spatialLayer, temporalLayer }); + await consumer.setPreferredLayers({ + spatialLayer, + temporalLayer + }); } else { console.debug("修改最佳空间层和时间层(无效)", consumerId); } } + /** + * 设置消费者优先级信令 + * + * @param {*} message 信令消息 + * @param {*} body 消息主体 + */ + async mediaConsumerSetPriority(message, body) { + const me = this; + const { + roomId, + consumerId, + priority, + } = body; + const room = me.rooms.get(roomId); + const consumer = room?.consumers.get(consumerId); + if(consumer) { + console.debug("设置消费者优先级", consumerId, priority); + if(priority <= 0 || priority >= 256) { + await consumer.unsetPriority(); + } else { + await consumer.setPriority(priority); + } + } else { + console.debug("设置消费者优先级(无效)", consumerId); + } + } + + /** + * 查询消费者状态信令 + * + * @param {*} message 信令消息 + * @param {*} body 消息主体 + */ + async mediaConsumerStatus(message, body) { + const me = this; + const { + roomId, + consumerId, + } = body; + const room = me.rooms.get(roomId); + const consumer = room?.consumers.get(consumerId); + if(consumer) { + console.debug("查询消费者状态", consumerId); + message.body = { + ...body, + status: await consumer.getStats() + }; + me.push(message); + } else { + console.debug("查询消费者状态(无效)", consumerId); + } + } + /** * 消费数据信令 * diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js index be4f94f..c35af9a 100644 --- a/taoyao-client-web/src/components/Taoyao.js +++ b/taoyao-client-web/src/components/Taoyao.js @@ -822,6 +822,9 @@ class Taoyao extends RemoteClient { case "media::consumer::resume": me.defaultMediaConsumerResume(message); break; + case "media::consumer::score": + me.defaultMediaConsumerScore(message); + break; case "media::data::consumer::close": me.defaultMediaDataConsumerClose(message); break; @@ -1558,6 +1561,16 @@ class Taoyao extends RemoteClient { console.debug("恢复消费者无效", consumerId); } } + + /** + * 媒体消费者评分信令 + * + * @param {*} message 信令消息 + */ + defaultMediaConsumerScore(message) { + console.debug("消费者评分", message); + } + /** * 修改最佳空间层和时间层信令 * @@ -1584,6 +1597,26 @@ class Taoyao extends RemoteClient { })); } + /** + * 设置消费者优先级信令 + * + * @param {*} consumerId 消费者ID + * @param {*} priority 优先级:1~255 + */ + mediaConsumerSetPriority(consumerId, priority) { + const me = this; + const consumer = me.consumers.get(consumerId); + if(!consumer) { + me.callbackError("设置消费者优先级消费者无效"); + return; + } + me.push(protocol.buildMessage("media::consumer::set::priority", { + roomId: me.roomId, + consumerId, + priority, + })); + } + /** * 查询消费者状态信令 * @@ -3263,6 +3296,32 @@ class Taoyao extends RemoteClient { await track.applyConstraints(Object.assign(track.getSettings(), setting)); } + /** + * 统计设备信息 + * + * @param {*} clientId 终端ID + * + * @returns 设备信息统计 + */ + async getClientStats(clientId) { + const me = this; + const stats = {}; + if(clientId === me.clientId) { + stats.sendTransport = await me.sendTransport.getStats(); + stats.recvTransport = await me.recvTransport.getStats(); + stats.audioProducer = await me.audioProducer.getStats(); + stats.videoProducer = await me.videoProducer.getStats(); + } else { + const consumers = Array.from(me.consumers.values()); + for(const consumer of consumers) { + if(clientId === consumer.sourceId) { + stats[consumer.kind] = await consumer.getStats(); + } + } + } + return stats; + } + /** * 关闭媒体资源 * diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerScoreProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerScoreProtocol.java index 30968af..cd84087 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerScoreProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerScoreProtocol.java @@ -19,9 +19,13 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; @Description( body = """ { - "score": "消费者RTP流得分表示传输质量:0~10", - "producerScore": "生产者RTP流得分表示传输质量:0~10", - "producerScores": [所有生产者RTP流得分] + "roomId" : "房间ID" + "consumerId": "消费者ID" + "score" : { + "score" : 消费者RTP流得分表示传输质量:0~10, + "producerScore" : 生产者RTP流得分表示传输质量:0~10, + "producerScores": [Simulcast生产者RTP流得分] + } } """, flow = "媒体服务->信令服务->终端" diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerSetPreferredLayersProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerSetPreferredLayersProtocol.java index 7eb2b49..22ce2ea 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerSetPreferredLayersProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerSetPreferredLayersProtocol.java @@ -4,7 +4,6 @@ import java.util.Map; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; -import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientType; @@ -14,12 +13,12 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; /** * 修改最佳空间层和时间层信令 * - * 空间层(spatialLayer):分辨率 + * 空间层(spatialLayer) :分辨率 * 时间层(temporalLayer):帧率 * * 码率:数据大小和时间的比值 * - * 注意:只有simulcast和SVC消费者有效 + * 注意:只有Simulcast和SVC消费者有效 * * @author acgist */ @@ -27,13 +26,13 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; @Description( body = """ { - "roomId": "房间ID", - "consumerId": "消费者ID", - "spatialLayer": 最佳空间层, + "roomId" : "房间ID", + "consumerId" : "消费者ID", + "spatialLayer" : 最佳空间层, "temporalLayer": 最佳时间层 } """, - flow = "终端->信令服务->媒体服务->信令服务->终端" + flow = "终端->信令服务->媒体服务" ) public class MediaConsumerSetPreferredLayersProtocol extends ProtocolRoomAdapter { @@ -46,7 +45,6 @@ public class MediaConsumerSetPreferredLayersProtocol extends ProtocolRoomAdapter @Override public void execute(String clientId, ClientType clientType, Room room, Client client, Client mediaClient, Message message, Map body) { if(clientType.mediaClient()) { - body.put(Constant.CLIENT_ID, clientId); mediaClient.push(message); } else { this.logNoAdapter(clientType); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerSetPriorityProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerSetPriorityProtocol.java index d3df007..cacaeec 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerSetPriorityProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerSetPriorityProtocol.java @@ -13,17 +13,15 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; /** * 设置消费者优先级信令 * - * TODO:unsetPriority - * * @author acgist */ @Protocol @Description( body = """ { - "roomId": "房间ID", + "roomId" : "房间ID", "consumerId": "消费者ID", - "priority": 优先级(1~255) + "priority" : 优先级(1~255) } """ ) @@ -38,7 +36,7 @@ public class MediaConsumerSetPriorityProtocol extends ProtocolRoomAdapter { @Override public void execute(String clientId, ClientType clientType, Room room, Client client, Client mediaClient, Message message, Map body) { if(clientType.mediaClient()) { - client.push(mediaClient.request(message)); + mediaClient.push(message); } else { this.logNoAdapter(clientType); } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerStatusProtocol.java index f1956e1..52ad7ae 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerStatusProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerStatusProtocol.java @@ -19,11 +19,11 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; @Description( body = """ { - "roomId": "房间ID", + "roomId" : "房间ID", "consumerId": "消费者ID" } """, - flow = "终端=>信令服务->媒体服务->信令服务->终端" + flow = "终端=>信令服务->媒体服务" ) public class MediaConsumerStatusProtocol extends ProtocolRoomAdapter {