From d8f6b4b5af8466b83abb617159fa0c2a0f3f17ab Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Wed, 9 Aug 2023 08:09:07 +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/.env.work | 14 +++++ taoyao-client-media/package.json | 1 + taoyao-client-media/src/Taoyao.js | 29 ++++++++++ taoyao-client-web/src/components/Taoyao.js | 54 +++++++++++++++++++ .../java/com/acgist/taoyao/rtp/RtpTest.java | 9 +++- .../taoyao/signal/party/room/RouterType.java | 23 -------- .../MediaRouterRtpCapabilitiesProtocol.java | 7 +-- .../media/MediaSetRouterTypeProtocol.java | 46 ---------------- .../media/MediaTransportCloseProtocol.java | 13 ++--- .../media/MediaTransportPlainProtocol.java | 18 ++++--- .../media/MediaTransportStatusProtocol.java | 4 +- 11 files changed, 128 insertions(+), 90 deletions(-) create mode 100644 taoyao-client-media/.env.work delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/room/RouterType.java delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaSetRouterTypeProtocol.java diff --git a/taoyao-client-media/.env.work b/taoyao-client-media/.env.work new file mode 100644 index 0000000..3a85002 --- /dev/null +++ b/taoyao-client-media/.env.work @@ -0,0 +1,14 @@ +NAME=taoyao-client-media +CLIENT_ID=taoyao-client-media +CLIENT_NAME=桃夭媒体服务 +SIGNAL_VERSION=1.0.0 +SIGNAL_HOST=127.0.0.1 +SIGNAL_PORT=8888 +SIGNAL_USERNAME=taoyao +SIGNAL_PASSWORD=taoyao +MEDIASOUP_WORKER_SIZE=2 +MEDIASOUP_MIN_PORT=40000 +MEDIASOUP_MAX_PORT=49999 +MEDIASOUP_LISTEN_IP=0.0.0.0 +MEDIASOUP_LISTEN_PORT=44444 +MEDIASOUP_ANNOUNCED_IP=192.168.8.244 \ No newline at end of file diff --git a/taoyao-client-media/package.json b/taoyao-client-media/package.json index 6c37751..4afa62f 100644 --- a/taoyao-client-media/package.json +++ b/taoyao-client-media/package.json @@ -9,6 +9,7 @@ "scripts": { "dev" : "node src/Server.js", "prd" : "cross-env NODE_ENV=prd node src/Server.js", + "work" : "cross-env NODE_ENV=work node src/Server.js", "node-a": "cross-env NODE_ENV=node-a node src/Server.js", "node-b": "cross-env NODE_ENV=node-b node src/Server.js" }, diff --git a/taoyao-client-media/src/Taoyao.js b/taoyao-client-media/src/Taoyao.js index a894c4d..d6dc704 100644 --- a/taoyao-client-media/src/Taoyao.js +++ b/taoyao-client-media/src/Taoyao.js @@ -465,6 +465,9 @@ class Taoyao { case "media::transport::plain": me.mediaTransportPlain(message, body); break; + case "media::transport::status": + me.mediaTransportStatus(message, body); + break; case "media::transport::webrtc::connect": me.mediaTransportWebrtcConnect(message, body); break; @@ -1657,6 +1660,32 @@ class Taoyao { me.push(message); } + /** + * 查询通道状态信令 + * + * @param {*} message 消息 + * @param {*} body 消息主体 + */ + async mediaTransportStatus(message, body) { + const me = this; + const { + roomId, + transportId, + } = body; + const room = me.rooms.get(roomId); + const transport = room?.transports.get(transportId); + if(transport) { + console.debug("查询通道状态", transportId); + message.body = { + ...body, + status: await transport.getStats() + }; + me.push(message); + } else { + console.debug("查询通道状态(无效)", transportId); + } + } + /** * 连接WebRTC通道信令 * diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js index a7cf9f3..d67f4b6 100644 --- a/taoyao-client-web/src/components/Taoyao.js +++ b/taoyao-client-web/src/components/Taoyao.js @@ -843,6 +843,9 @@ class Taoyao extends RemoteClient { case "media::producer::score": me.defaultMediaProducerScore(message); break; + case "media::transport::close": + me.defaultMediaTransportClose(message); + break; case "media::video::orientation::change": me.defaultMediaVideoOrientationChange(message); break; @@ -1878,6 +1881,57 @@ class Taoyao extends RemoteClient { console.debug("生产者评分", message); } + /** + * 关闭通道信令 + * + * @param {*} transportId 通道ID + */ + mediaTransportClose(transportId) { + const me = this; + console.debug("关闭通道", transportId); + me.push(protocol.buildMessage("media::transport::close", { + roomId : me.roomId, + transportId: transportId, + })); + } + + /** + * 关闭通道信令 + * + * @param {*} message + */ + defaultMediaTransportClose(message) { + const me = this; + const { + roomId, + transportId + } = message.body; + if(me.recvTransport && me.recvTransport.id === transportId) { + console.debug("关闭接收通道", transportId); + me.recvTransport.close(); + me.recvTransport = null; + } else if(me.sendTransport && me.sendTransport.id === transportId) { + console.debug("关闭发送通道", transportId); + me.sendTransport.close(); + me.sendTransport = null; + } else { + console.debug("关闭通道无效", transportId); + } + } + + /** + * 查询通道状态信令 + * + * @param {*} transportId 通道ID + */ + async mediaTransportStatus(transportId) { + const me = this; + return await me.request(protocol.buildMessage('media::transport::status', { + roomId: me.roomId, + transportId + })); + } + /** * 查询生产者状态信令 * diff --git a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/rtp/RtpTest.java b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/rtp/RtpTest.java index 3824dab..88702c4 100644 --- a/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/rtp/RtpTest.java +++ b/taoyao-signal-server/taoyao-server/src/test/java/com/acgist/taoyao/rtp/RtpTest.java @@ -28,7 +28,7 @@ public class RtpTest { final InputStream inputStream = socket.getInputStream(); final OutputStream outputStream = socket.getOutputStream(); // 随机密码:https://localhost:8888/config/socket - final String secret = "TSFXzB7hcfE=".strip(); + final String secret = "2SPWy+TF1zM=".strip(); final Cipher encrypt = CipherUtils.buildCipher(Cipher.ENCRYPT_MODE, Encrypt.DES, secret); final Cipher decrypt = CipherUtils.buildCipher(Cipher.DECRYPT_MODE, Encrypt.DES, secret); // 接收 @@ -63,7 +63,12 @@ public class RtpTest { buffer.flip(); buffer.get(message); buffer.compact(); - log.debug("收到消息:{}", new String(decrypt.doFinal(message))); + final String value = new String(decrypt.doFinal(message)); + if(value.contains("media::audio::volume")) { + log.debug("收到消息:{}", value); + } else { + log.info("收到消息:{}", value); + } } } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/room/RouterType.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/room/RouterType.java deleted file mode 100644 index abbee3c..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/room/RouterType.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.acgist.taoyao.signal.party.room; - -/** - * 媒体路由类型 - * - * @author acgist - */ -public enum RouterType { - - /** - * 对讲:只有两个人之间的媒体相互路由 - */ - ONE_TO_ONE, - /** - * 广播:只有一个人的媒体路由到其他人 - */ - ONE_TO_ALL, - /** - * 网播:所有人的媒体相互路由 - */ - ALL_TO_ALL, - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRouterRtpCapabilitiesProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRouterRtpCapabilitiesProtocol.java index 261a742..84a9114 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRouterRtpCapabilitiesProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaRouterRtpCapabilitiesProtocol.java @@ -24,13 +24,14 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; } """, """ - { - "codec": "编码解码", + "roomId" : "房间标识", + "rtpCapabilities": { + "codec" : "编码解码", "headerExtensions": "扩展" } """ }, - flow = { "终端=>信令服务->媒体服务->信令服务->终端"} + flow = { "终端=>信令服务->媒体服务"} ) public class MediaRouterRtpCapabilitiesProtocol extends ProtocolRoomAdapter { diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaSetRouterTypeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaSetRouterTypeProtocol.java deleted file mode 100644 index 1285fd9..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaSetRouterTypeProtocol.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.acgist.taoyao.signal.protocol.media; - -import java.util.Map; - -import com.acgist.taoyao.boot.annotation.Description; -import com.acgist.taoyao.boot.annotation.Protocol; -import com.acgist.taoyao.boot.model.Message; -import com.acgist.taoyao.signal.client.Client; -import com.acgist.taoyao.signal.client.ClientType; -import com.acgist.taoyao.signal.party.room.Room; -import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; - -/** - * 设置路由类型信令 - * 注意:不会添加移除消费者生产者,只会暂停恢复操作。 - * - * @author acgist - */ -@Protocol -@Description( - body = """ - { - "roomId": "房间ID" - "routerType": "路由类型" - } - """, - flow = "终端->信令服务->终端" -) -public class MediaSetRouterTypeProtocol extends ProtocolRoomAdapter { - - public static final String SIGNAL = "media::set::router::type"; - - public MediaSetRouterTypeProtocol() { - super("设置路由类型信令", SIGNAL); - } - - @Override - public void execute(String clientId, ClientType clientType, Room room, Client client, Client mediaClient, Message message, Map body) { - if(clientType.mediaClient()) { - // TODO:路由类型 - } else { - this.logNoAdapter(clientType); - } - } - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportCloseProtocol.java index 80b6ac8..e024802 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportCloseProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportCloseProtocol.java @@ -27,13 +27,14 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Protocol @Description( + memo = "关闭通过回调实现所以不能同步响应", body = """ { - "roomId": "房间ID" + "roomId" : "房间ID" "transportId": "通道ID" } """, - flow = "终端->信令服务->媒体服务->信令服务+)终端" + flow = "终端->信令服务->媒体服务->信令服务->终端" ) public class MediaTransportCloseProtocol extends ProtocolRoomAdapter implements ApplicationListener { @@ -46,10 +47,10 @@ public class MediaTransportCloseProtocol extends ProtocolRoomAdapter implements @Async @Override public void onApplicationEvent(TransportCloseEvent event) { - final Room room = event.getRoom(); + final Room room = event.getRoom(); final Client mediaClient = event.getMediaClient(); final Map body = Map.of( - Constant.ROOM_ID, room.getRoomId(), + Constant.ROOM_ID, room.getRoomId(), Constant.TRANSPORT_ID, event.getTransportId() ); mediaClient.push(this.build(body)); @@ -57,7 +58,7 @@ public class MediaTransportCloseProtocol extends ProtocolRoomAdapter implements @Override public void execute(String clientId, ClientType clientType, Room room, Client client, Client mediaClient, Message message, Map body) { - final String transportId = MapUtils.get(body, Constant.TRANSPORT_ID); + final String transportId = MapUtils.get(body, Constant.TRANSPORT_ID); final Transport transport = room.transport(transportId); if(transport == null) { log.debug("通道无效:{} - {}", transportId, clientType); @@ -67,7 +68,7 @@ public class MediaTransportCloseProtocol extends ProtocolRoomAdapter implements transport.close(); } else if(clientType.mediaServer()) { transport.remove(); - room.broadcast(message); + transport.getClient().push(message); } else { this.logNoAdapter(clientType); } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportPlainProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportPlainProtocol.java index d81f5b1..9db277d 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportPlainProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportPlainProtocol.java @@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; /** * 创建RTP输入通道信令 + * * 注意: * 1. ffmpeg不支持rtcpMux * 2. comedia必须开启srtp功能 @@ -32,17 +33,18 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Protocol @Description( + memo = "用来接入RTP终端", body = """ { - "roomId": "房间ID", - "rtcpMux": RTP和RTCP端口复用(true|false), - "comedia": 自动终端端口(true|false), - "enableSctp": 是否开启sctp(true|false), - "numSctpStreams": sctp数量, - "enableSrtp": 是否开启srtp(true|false), + "roomId" : "房间ID", + "rtcpMux" : RTP和RTCP端口复用(true|false), + "comedia" : 自动识别终端端口(true|false), + "enableSctp" : 是否开启SCTP(true|false), + "numSctpStreams": SCTP数量, + "enableSrtp" : 是否开启SRTP(true|false), "srtpCryptoSuite": { "cryptoSuite": "算法(AEAD_AES_256_GCM|AEAD_AES_128_GCM|AES_CM_128_HMAC_SHA1_80|AES_CM_128_HMAC_SHA1_32)", - "keyBase64": "密钥" + "keyBase64" : "密钥" } } """ @@ -86,7 +88,7 @@ public class MediaTransportPlainProtocol extends ProtocolRoomAdapter { * 重写IP地址 * * @param clientIp 终端IP - * @param body 消息主体 + * @param body 消息主体 */ private void rewriteIp(String clientIp, Map body) { // 媒体服务返回IP diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportStatusProtocol.java index 907ae7a..af05130 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportStatusProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportStatusProtocol.java @@ -19,11 +19,11 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; @Description( body = """ { - "roomId": "房间ID", + "roomId" : "房间ID", "transportId": "通道ID" } """, - flow = "终端=>信令服务->媒体服务->信令服务->终端" + flow = "终端=>信令服务->媒体服务" ) public class MediaTransportStatusProtocol extends ProtocolRoomAdapter {