From 2a7be453f3825e30f28906f8f74c88aab20745c8 Mon Sep 17 00:00:00 2001
From: acgist <289547414@qq.com>
Date: Thu, 9 Mar 2023 08:10:21 +0800
Subject: [PATCH] =?UTF-8?q?[*]=20=E6=8B=89=E5=8F=96bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/Deploy.md | 62 ++++++-------------
docs/{nginx => etc}/nginx.conf | 0
docs/etc/taoyao-signal-server.service | 17 +++++
taoyao-client-media/src/Taoyao.js | 35 ++++++-----
.../src/components/LocalClient.vue | 8 +--
.../src/components/RemoteClient.vue | 8 +--
taoyao-client-web/src/components/Taoyao.js | 11 ++--
.../taoyao/signal/party/media/Consumer.java | 2 +-
.../taoyao/signal/party/media/Producer.java | 2 +-
.../protocol/media/MediaConsumeProtocol.java | 22 +++----
.../media/MediaConsumerCloseProtocol.java | 2 +-
.../protocol/media/MediaProduceProtocol.java | 2 +-
12 files changed, 81 insertions(+), 90 deletions(-)
rename docs/{nginx => etc}/nginx.conf (100%)
create mode 100644 docs/etc/taoyao-signal-server.service
diff --git a/docs/Deploy.md b/docs/Deploy.md
index 83ff9ec..1b82bd3 100644
--- a/docs/Deploy.md
+++ b/docs/Deploy.md
@@ -4,11 +4,13 @@
```
CentOS:CentOS Linux release 7.9.2009 (Core)
-Java >= 17
-Maven >= 3.6.0
-gcc/g++ >= 4.9
+pm2 >= 5.2.0
+git >= 1.8.0
+Java >= 17.0.0
+Maven >= 3.8.0
+gcc/g++ >= 10.0.0
node version >= v16.0.0
-python version >= 3.6 with PIP
+python version >= 3.8.0 with PIP
```
## 设置Yum源
@@ -121,8 +123,12 @@ ln -sf /data/nodejs/node-v16.19.0-linux-x64/bin/pm2 /usr/local/bin/
# 日志
pm2 install pm2-logrotate
-pm2 set pm2-logrotate-ext:retain 14
-pm2 set pm2-logrotate-ext:max_size 256M
+pm2 set pm2-logrotate:retain 14
+pm2 set pm2-logrotate:compress true
+pm2 set pm2-logrotate:max_size 256M
+
+# 查看配置
+pm2 conf
# 自启
pm2 startup
@@ -142,7 +148,8 @@ tar -zxvf openjdk-17.0.2_linux-x64_bin.tar.gz
vim ~/.bash_profile
---
-PATH=$PATH:/data/java/jdk-17.0.2/bin
+JAVA_HOME=/data/java/jdk-17.0.2
+PATH=$PATH:$JAVA_HOME/bin
---
. ~/.bash_profile
@@ -165,7 +172,8 @@ tar -zxvf apache-maven-3.8.6-bin.tar.gz
vim ~/.bash_profile
---
-PATH=$PATH:/data/maven/apache-maven-3.8.6/bin
+MAVEN_HOME=/data/maven/apache-maven-3.8.6
+PATH=$PATH:$MAVEN_HOME/bin
---
. ~/.bash_profile
@@ -291,27 +299,7 @@ mvn clean package -D skipTests
cp taoyao-server/target/taoyao-server-1.0.0/bin/deploy.sh ./
# 配置服务
-vim /usr/lib/systemd/system/taoyao-signal-server.service
-
----
-[Unit]
-Description=taoyao signal server
-After=network.target
-Wants=network.target
-
-[Service]
-User=root
-Type=forking
-KillMode=process
-ExecStart=/data/taoyao/taoyao-signal-server/deploy/bin/startup.sh
-ExecReload=/bin/kill -HUP $MAINPID
-ExecStop=/bin/kill -QUIT $MAINPID
-Restart=always
-RestartSec=5s
-
-[Install]
-WantedBy=multi-user.target
----
+cp /data/taoyao/docs/etc/taoyao-signal-server.service /usr/lib/systemd/system/taoyao-signal-server.service
# 配置自启
systemctl daemon-reload
@@ -368,21 +356,7 @@ pm2 start | stop | restart taoyao-client-web
npm run build
# Nginx配置
-vim /etc/nginx/conf.d/taoyao.cnf
-
----
-server {
- listen 8443 http2;
- server_name localhost;
-
- access_log /var/log/nginx/taoyao.access.log main buffer=32k flush=10s;
-
- location / {
- root /data/taoyao/taoyao-client-web/dist;
- index index.html;
- }
-}
----
+cp /data/taoyao/docs/etc/nginx /etc/nginx/nginx.conf
nginx -s reload
```
diff --git a/docs/nginx/nginx.conf b/docs/etc/nginx.conf
similarity index 100%
rename from docs/nginx/nginx.conf
rename to docs/etc/nginx.conf
diff --git a/docs/etc/taoyao-signal-server.service b/docs/etc/taoyao-signal-server.service
new file mode 100644
index 0000000..f851114
--- /dev/null
+++ b/docs/etc/taoyao-signal-server.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=taoyao signal server
+After=network.target
+Wants=network.target
+
+[Service]
+User=root
+Type=forking
+KillMode=process
+ExecStart=/data/taoyao/taoyao-signal-server/deploy/bin/startup.sh
+ExecReload=/bin/kill -HUP $MAINPID
+ExecStop=/bin/kill -QUIT $MAINPID
+Restart=always
+RestartSec=5s
+
+[Install]
+WantedBy=multi-user.target
diff --git a/taoyao-client-media/src/Taoyao.js b/taoyao-client-media/src/Taoyao.js
index 69ce75b..74ba948 100644
--- a/taoyao-client-media/src/Taoyao.js
+++ b/taoyao-client-media/src/Taoyao.js
@@ -367,55 +367,57 @@ class Taoyao {
* @param {*} message 消息
*/
on(message) {
+ const me = this;
// 请求回调
- if (this.callbackMapping.has(message.header.id)) {
+ if (me.callbackMapping.has(message.header.id)) {
try {
- this.callbackMapping.get(message.header.id)(message);
+ me.callbackMapping.get(message.header.id)(message);
} finally {
- this.callbackMapping.delete(message.header.id);
+ me.callbackMapping.delete(message.header.id);
}
return;
}
+ // 执行信令
const body = message.body;
switch (message.header.signal) {
case "client::reboot":
- this.clientReboot(message, body);
+ me.clientReboot(message, body);
break;
case "client::shutdown":
- this.clientShutdown(message, body);
+ me.clientShutdown(message, body);
break;
case "client::register":
protocol.clientIndex = body.index;
break;
case "media::ice::restart":
- this.mediaIceRestart(message, body);
+ me.mediaIceRestart(message, body);
break;
case "media::consume":
- this.mediaConsume(message, body);
+ me.mediaConsume(message, body);
break;
case "media::consumer::close":
me.mediaConsumerClose(message, body);
break;
case "media::produce":
- this.mediaProduce(message, body);
+ me.mediaProduce(message, body);
break;
case "media::router::rtp::capabilities":
- this.mediaRouterRtpCapabilities(message, body);
+ me.mediaRouterRtpCapabilities(message, body);
break;
case "media::transport::webrtc::connect":
- this.mediaTransportWebrtcConnect(message, body);
+ me.mediaTransportWebrtcConnect(message, body);
break;
case "media::transport::webrtc::create":
- this.mediaTransportWebrtcCreate(message, body);
+ me.mediaTransportWebrtcCreate(message, body);
break;
case "platform::error":
- this.platformError(message, body);
+ me.platformError(message, body);
break;
case "room::create":
- this.roomCreate(message, body);
+ me.roomCreate(message, body);
break;
case "room::close":
- this.roomClose(message, body);
+ me.roomClose(message, body);
break;
}
}
@@ -718,9 +720,8 @@ class Taoyao {
})
);
});
- // TODO:改为同步
- //await this.request("media::consume", {
- this.push(
+ // 等待终端准备就绪
+ this.request(
protocol.buildMessage("media::consume", {
kind: consumer.kind,
type: consumer.type,
diff --git a/taoyao-client-web/src/components/LocalClient.vue b/taoyao-client-web/src/components/LocalClient.vue
index 17068c2..d848e11 100644
--- a/taoyao-client-web/src/components/LocalClient.vue
+++ b/taoyao-client-web/src/components/LocalClient.vue
@@ -5,10 +5,10 @@
{{ client?.name || "" }}
-
-
-
-
+
+
+
+
diff --git a/taoyao-client-web/src/components/RemoteClient.vue b/taoyao-client-web/src/components/RemoteClient.vue
index f68da21..d5a5fbf 100644
--- a/taoyao-client-web/src/components/RemoteClient.vue
+++ b/taoyao-client-web/src/components/RemoteClient.vue
@@ -5,10 +5,10 @@
{{ client?.name || "" }}
-
-
-
-
+
+
+
+
diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js
index 4b97640..15d8c63 100644
--- a/taoyao-client-web/src/components/Taoyao.js
+++ b/taoyao-client-web/src/components/Taoyao.js
@@ -714,7 +714,7 @@ class Taoyao extends RemoteClient {
remoteClient.audioTrack = track;
remoteClient.audioConsumer = consumer;
} else if(track.kind === 'video') {
- remoteClient.audioActive = false;
+ remoteClient.videoActive = true;
remoteClient.videoTrack = track;
remoteClient.videoconsumer = consumer;
} else {
@@ -829,8 +829,8 @@ class Taoyao extends RemoteClient {
protocol.buildMessage("room::enter", {
roomId: roomId,
password: password,
- rtpCapabilities: me.consume ? me.mediasoupDevice.rtpCapabilities : undefined,
- sctpCapabilities: me.consume && me.dataProduce ? me.mediasoupDevice.sctpCapabilities : undefined,
+ rtpCapabilities: (me.audioConsume || me.videoConsume || me.audioProduce || me.videoProduce) ? me.mediasoupDevice.rtpCapabilities : undefined,
+ sctpCapabilities: (me.dataConsume || me.dataProduce) ? me.mediasoupDevice.sctpCapabilities : undefined,
})
);
}
@@ -1113,7 +1113,8 @@ class Taoyao extends RemoteClient {
// codec : this._mediasoupDevice.rtpCapabilities.codecs
// .find((codec) => codec.mimeType.toLowerCase() === 'audio/pcma')
});
-
+ self.audioActive = true;
+ self.track = track;
// TODO:加密解密
// if (this._e2eKey && e2e.isSupported()) {
// e2e.setupSenderTransform(this._micProducer.rtpSender);
@@ -1233,6 +1234,8 @@ class Taoyao extends RemoteClient {
} else {
console.warn("终端没有实现服务代理:", self);
}
+ self.videoActive = true;
+ self.track = track;
let codec;
let encodings;
const codecOptions = {
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Consumer.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Consumer.java
index 3a7c37c..040e8e5 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Consumer.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Consumer.java
@@ -63,7 +63,7 @@ public class Consumer implements Closeable {
return;
}
this.close = true;
- log.info("关闭消费者:{}", this.consumerId);
+ log.info("关闭消费者:{} - {}", this.streamId, this.consumerId);
this.getProducer().remove(this.consumerId);
this.consumerClient.getConsumers().remove(this.consumerId);
EventPublisher.publishEvent(new MediaConsumerCloseEvent(this.consumerId, this.room));
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Producer.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Producer.java
index 541df70..ed91ebd 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Producer.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Producer.java
@@ -75,7 +75,7 @@ public class Producer implements Closeable {
return;
}
this.close = true;
- log.info("关闭生产者:{}", this.producerId);
+ log.info("关闭生产者:{} - {}", this.streamId, this.producerId);
this.consumers.forEach((k, v) -> v.close());
this.producerClient.getProducers().remove(this.producerId);
EventPublisher.publishEvent(new MediaProducerCloseEvent(this.producerId, this.room));
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumeProtocol.java
index 7ea400b..1f17d0e 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumeProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumeProtocol.java
@@ -115,26 +115,21 @@ public class MediaConsumeProtocol extends ProtocolRoomAdapter implements Applica
*/
private void consume(Room room, ClientWrapper consumerClientWrapper, Producer producer, Message message) {
final Client mediaClient = room.getMediaClient();
+ final String consumerClientId = consumerClientWrapper.getClientId();
+ final String streamId = producer.getStreamId() + "->" + consumerClientId;
+ final ClientWrapper producerClientWrapper = producer.getProducerClient();
+ final String producerClientId = producerClientWrapper.getClientId();
if(consumerClientWrapper.consumed(producer)) {
- // TODO:没有清理干净
- // 消费通道准备就绪
- if(log.isDebugEnabled()) {
- log.debug("消费通道准备就绪:{} - {}", consumerClientWrapper.getClientId(), producer.getStreamId());
- }
+ // 消费通道就绪
mediaClient.push(message);
+ log.info("{}消费通道就绪:{}", consumerClientId, streamId);
} else {
// 主动消费媒体
- if(log.isDebugEnabled()) {
- log.debug("消费媒体:{} - {}", consumerClientWrapper.getClientId(), producer.getStreamId());
- }
- final String clientId = consumerClientWrapper.getClientId();
- final String streamId = producer.getStreamId() + "->" + clientId;
final Transport recvTransport = consumerClientWrapper.getRecvTransport();
- final ClientWrapper produceClientWrapper = producer.getProducerClient();
final Map body = new HashMap<>();
body.put(Constant.ROOM_ID, room.getRoomId());
- body.put(Constant.CLIENT_ID, clientId);
- body.put(Constant.SOURCE_ID, produceClientWrapper.getClientId());
+ body.put(Constant.CLIENT_ID, consumerClientId);
+ body.put(Constant.SOURCE_ID, producerClientId);
body.put(Constant.STREAM_ID, streamId);
body.put(Constant.PRODUCER_ID, producer.getProducerId());
body.put(Constant.TRANSPORT_ID, recvTransport.getTransportId());
@@ -142,6 +137,7 @@ public class MediaConsumeProtocol extends ProtocolRoomAdapter implements Applica
body.put(Constant.SCTP_CAPABILITIES, consumerClientWrapper.getSctpCapabilities());
message.setBody(body);
mediaClient.push(message);
+ log.info("{}主动消费媒体:{} - {}", consumerClientId, producerClientId, streamId);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerCloseProtocol.java
index 7ce5347..0aa05d3 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerCloseProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerCloseProtocol.java
@@ -60,7 +60,7 @@ public class MediaConsumerCloseProtocol extends ProtocolRoomAdapter implements A
final String consumerId = MapUtils.get(body, Constant.CONSUMER_ID);
final Consumer consumer = room.consumer(consumerId);
if(consumer == null) {
- log.warn("关闭消费者无效:{}", consumerId);
+ log.debug("关闭消费者无效:{}", consumerId);
} else {
consumer.close();
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaProduceProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaProduceProtocol.java
index bf771df..8175dcf 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaProduceProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaProduceProtocol.java
@@ -70,7 +70,7 @@ public class MediaProduceProtocol extends ProtocolRoomAdapter {
// 视频全收:广播音频
// 全部不收:全部广播
room.broadcast(responseMessage);
- log.info("{}生产媒体:{} - {} - {}", clientId, kind, streamId, producerId);
+ log.info("{}生产媒体:{} - {}", clientId, streamId, producerId);
this.publishEvent(new MediaConsumeEvent(room, producer));
}