[*] 拉取bug

This commit is contained in:
acgist
2023-03-09 08:10:21 +08:00
parent 4b709f2944
commit 2a7be453f3
12 changed files with 81 additions and 90 deletions

View File

@@ -4,11 +4,13 @@
``` ```
CentOSCentOS Linux release 7.9.2009 (Core) CentOSCentOS Linux release 7.9.2009 (Core)
Java >= 17 pm2 >= 5.2.0
Maven >= 3.6.0 git >= 1.8.0
gcc/g++ >= 4.9 Java >= 17.0.0
Maven >= 3.8.0
gcc/g++ >= 10.0.0
node version >= v16.0.0 node version >= v16.0.0
python version >= 3.6 with PIP python version >= 3.8.0 with PIP
``` ```
## 设置Yum源 ## 设置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 install pm2-logrotate
pm2 set pm2-logrotate-ext:retain 14 pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate-ext:max_size 256M pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:max_size 256M
# 查看配置
pm2 conf
# 自启 # 自启
pm2 startup pm2 startup
@@ -142,7 +148,8 @@ tar -zxvf openjdk-17.0.2_linux-x64_bin.tar.gz
vim ~/.bash_profile 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 . ~/.bash_profile
@@ -165,7 +172,8 @@ tar -zxvf apache-maven-3.8.6-bin.tar.gz
vim ~/.bash_profile 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 . ~/.bash_profile
@@ -291,27 +299,7 @@ mvn clean package -D skipTests
cp taoyao-server/target/taoyao-server-1.0.0/bin/deploy.sh ./ cp taoyao-server/target/taoyao-server-1.0.0/bin/deploy.sh ./
# 配置服务 # 配置服务
vim /usr/lib/systemd/system/taoyao-signal-server.service cp /data/taoyao/docs/etc/taoyao-signal-server.service /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
---
# 配置自启 # 配置自启
systemctl daemon-reload systemctl daemon-reload
@@ -368,21 +356,7 @@ pm2 start | stop | restart taoyao-client-web
npm run build npm run build
# Nginx配置 # Nginx配置
vim /etc/nginx/conf.d/taoyao.cnf cp /data/taoyao/docs/etc/nginx /etc/nginx/nginx.conf
---
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;
}
}
---
nginx -s reload nginx -s reload
``` ```

View File

@@ -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

View File

@@ -367,55 +367,57 @@ class Taoyao {
* @param {*} message 消息 * @param {*} message 消息
*/ */
on(message) { on(message) {
const me = this;
// 请求回调 // 请求回调
if (this.callbackMapping.has(message.header.id)) { if (me.callbackMapping.has(message.header.id)) {
try { try {
this.callbackMapping.get(message.header.id)(message); me.callbackMapping.get(message.header.id)(message);
} finally { } finally {
this.callbackMapping.delete(message.header.id); me.callbackMapping.delete(message.header.id);
} }
return; return;
} }
// 执行信令
const body = message.body; const body = message.body;
switch (message.header.signal) { switch (message.header.signal) {
case "client::reboot": case "client::reboot":
this.clientReboot(message, body); me.clientReboot(message, body);
break; break;
case "client::shutdown": case "client::shutdown":
this.clientShutdown(message, body); me.clientShutdown(message, body);
break; break;
case "client::register": case "client::register":
protocol.clientIndex = body.index; protocol.clientIndex = body.index;
break; break;
case "media::ice::restart": case "media::ice::restart":
this.mediaIceRestart(message, body); me.mediaIceRestart(message, body);
break; break;
case "media::consume": case "media::consume":
this.mediaConsume(message, body); me.mediaConsume(message, body);
break; break;
case "media::consumer::close": case "media::consumer::close":
me.mediaConsumerClose(message, body); me.mediaConsumerClose(message, body);
break; break;
case "media::produce": case "media::produce":
this.mediaProduce(message, body); me.mediaProduce(message, body);
break; break;
case "media::router::rtp::capabilities": case "media::router::rtp::capabilities":
this.mediaRouterRtpCapabilities(message, body); me.mediaRouterRtpCapabilities(message, body);
break; break;
case "media::transport::webrtc::connect": case "media::transport::webrtc::connect":
this.mediaTransportWebrtcConnect(message, body); me.mediaTransportWebrtcConnect(message, body);
break; break;
case "media::transport::webrtc::create": case "media::transport::webrtc::create":
this.mediaTransportWebrtcCreate(message, body); me.mediaTransportWebrtcCreate(message, body);
break; break;
case "platform::error": case "platform::error":
this.platformError(message, body); me.platformError(message, body);
break; break;
case "room::create": case "room::create":
this.roomCreate(message, body); me.roomCreate(message, body);
break; break;
case "room::close": case "room::close":
this.roomClose(message, body); me.roomClose(message, body);
break; break;
} }
} }
@@ -718,9 +720,8 @@ class Taoyao {
}) })
); );
}); });
// TODO改为同步 // 等待终端准备就绪
//await this.request("media::consume", { this.request(
this.push(
protocol.buildMessage("media::consume", { protocol.buildMessage("media::consume", {
kind: consumer.kind, kind: consumer.kind,
type: consumer.type, type: consumer.type,

View File

@@ -5,10 +5,10 @@
<video ref="video"></video> <video ref="video"></video>
<p class="title">{{ client?.name || "" }}</p> <p class="title">{{ client?.name || "" }}</p>
<div class="buttons" :style="{'--volume': client?.volume}"> <div class="buttons" :style="{'--volume': client?.volume}">
<el-button type="danger" title="打开麦克风" :icon="Mute" circle /> <el-button v-show="!client.audioActive" type="primary" title="打开麦克风" :icon="Microphone" circle />
<el-button type="primary" title="关闭麦克风" :icon="Microphone" circle /> <el-button v-show="client.audioActive" type="danger" title="关闭麦克风" :icon="Mute" circle />
<el-button type="danger" title="打开摄像头" :icon="VideoPause" circle /> <el-button v-show="!client.videoActive" type="primary" title="打开摄像头" :icon="VideoPlay" circle />
<el-button type="primary" title="关闭摄像头" :icon="VideoPlay" circle /> <el-button v-show="client.videoActive" type="danger" title="关闭摄像头" :icon="VideoPause" circle />
<el-button title="交换媒体" :icon="Refresh" circle /> <el-button title="交换媒体" :icon="Refresh" circle />
<el-button title="拍照" :icon="Camera" circle /> <el-button title="拍照" :icon="Camera" circle />
<el-button title="录像" :icon="VideoCamera" circle /> <el-button title="录像" :icon="VideoCamera" circle />

View File

@@ -5,10 +5,10 @@
<video ref="video"></video> <video ref="video"></video>
<p class="title">{{ client?.name || "" }}</p> <p class="title">{{ client?.name || "" }}</p>
<div class="buttons" :style="{'--volume': client?.volume}"> <div class="buttons" :style="{'--volume': client?.volume}">
<el-button v-show="!client.audioActive" type="danger" title="打开麦克风" :icon="Mute" circle /> <el-button v-show="!client.audioActive" type="primary" title="打开麦克风" :icon="Microphone" circle />
<el-button v-show="client.audioActive" type="primary" title="关闭麦克风" :icon="Microphone" circle /> <el-button v-show="client.audioActive" type="danger" title="关闭麦克风" :icon="Mute" circle />
<el-button v-show="!client.videoActive" type="danger" title="打开摄像头" :icon="VideoPause" circle /> <el-button v-show="!client.videoActive" type="primary" title="打开摄像头" :icon="VideoPlay" circle />
<el-button v-show="client.videoActive" type="primary" title="关闭摄像头" :icon="VideoPlay" circle /> <el-button v-show="client.videoActive" type="danger" title="关闭摄像头" :icon="VideoPause" circle />
<el-button title="拍照" :icon="Camera" circle /> <el-button title="拍照" :icon="Camera" circle />
<el-button title="录像" :icon="VideoCamera" circle /> <el-button title="录像" :icon="VideoCamera" circle />
<el-button title="媒体信息" :icon="InfoFilled" circle /> <el-button title="媒体信息" :icon="InfoFilled" circle />

View File

@@ -714,7 +714,7 @@ class Taoyao extends RemoteClient {
remoteClient.audioTrack = track; remoteClient.audioTrack = track;
remoteClient.audioConsumer = consumer; remoteClient.audioConsumer = consumer;
} else if(track.kind === 'video') { } else if(track.kind === 'video') {
remoteClient.audioActive = false; remoteClient.videoActive = true;
remoteClient.videoTrack = track; remoteClient.videoTrack = track;
remoteClient.videoconsumer = consumer; remoteClient.videoconsumer = consumer;
} else { } else {
@@ -829,8 +829,8 @@ class Taoyao extends RemoteClient {
protocol.buildMessage("room::enter", { protocol.buildMessage("room::enter", {
roomId: roomId, roomId: roomId,
password: password, password: password,
rtpCapabilities: me.consume ? me.mediasoupDevice.rtpCapabilities : undefined, rtpCapabilities: (me.audioConsume || me.videoConsume || me.audioProduce || me.videoProduce) ? me.mediasoupDevice.rtpCapabilities : undefined,
sctpCapabilities: me.consume && me.dataProduce ? me.mediasoupDevice.sctpCapabilities : undefined, sctpCapabilities: (me.dataConsume || me.dataProduce) ? me.mediasoupDevice.sctpCapabilities : undefined,
}) })
); );
} }
@@ -1113,7 +1113,8 @@ class Taoyao extends RemoteClient {
// codec : this._mediasoupDevice.rtpCapabilities.codecs // codec : this._mediasoupDevice.rtpCapabilities.codecs
// .find((codec) => codec.mimeType.toLowerCase() === 'audio/pcma') // .find((codec) => codec.mimeType.toLowerCase() === 'audio/pcma')
}); });
self.audioActive = true;
self.track = track;
// TODO加密解密 // TODO加密解密
// if (this._e2eKey && e2e.isSupported()) { // if (this._e2eKey && e2e.isSupported()) {
// e2e.setupSenderTransform(this._micProducer.rtpSender); // e2e.setupSenderTransform(this._micProducer.rtpSender);
@@ -1233,6 +1234,8 @@ class Taoyao extends RemoteClient {
} else { } else {
console.warn("终端没有实现服务代理:", self); console.warn("终端没有实现服务代理:", self);
} }
self.videoActive = true;
self.track = track;
let codec; let codec;
let encodings; let encodings;
const codecOptions = { const codecOptions = {

View File

@@ -63,7 +63,7 @@ public class Consumer implements Closeable {
return; return;
} }
this.close = true; this.close = true;
log.info("关闭消费者:{}", this.consumerId); log.info("关闭消费者:{} - {}", this.streamId, this.consumerId);
this.getProducer().remove(this.consumerId); this.getProducer().remove(this.consumerId);
this.consumerClient.getConsumers().remove(this.consumerId); this.consumerClient.getConsumers().remove(this.consumerId);
EventPublisher.publishEvent(new MediaConsumerCloseEvent(this.consumerId, this.room)); EventPublisher.publishEvent(new MediaConsumerCloseEvent(this.consumerId, this.room));

View File

@@ -75,7 +75,7 @@ public class Producer implements Closeable {
return; return;
} }
this.close = true; this.close = true;
log.info("关闭生产者:{}", this.producerId); log.info("关闭生产者:{} - {}", this.streamId, this.producerId);
this.consumers.forEach((k, v) -> v.close()); this.consumers.forEach((k, v) -> v.close());
this.producerClient.getProducers().remove(this.producerId); this.producerClient.getProducers().remove(this.producerId);
EventPublisher.publishEvent(new MediaProducerCloseEvent(this.producerId, this.room)); EventPublisher.publishEvent(new MediaProducerCloseEvent(this.producerId, this.room));

View File

@@ -115,26 +115,21 @@ public class MediaConsumeProtocol extends ProtocolRoomAdapter implements Applica
*/ */
private void consume(Room room, ClientWrapper consumerClientWrapper, Producer producer, Message message) { private void consume(Room room, ClientWrapper consumerClientWrapper, Producer producer, Message message) {
final Client mediaClient = room.getMediaClient(); 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)) { if(consumerClientWrapper.consumed(producer)) {
// TODO没有清理干净 // 消费通道就绪
// 消费通道准备就绪
if(log.isDebugEnabled()) {
log.debug("消费通道准备就绪:{} - {}", consumerClientWrapper.getClientId(), producer.getStreamId());
}
mediaClient.push(message); mediaClient.push(message);
log.info("{}消费通道就绪:{}", consumerClientId, streamId);
} else { } 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 Transport recvTransport = consumerClientWrapper.getRecvTransport();
final ClientWrapper produceClientWrapper = producer.getProducerClient();
final Map<String, Object> body = new HashMap<>(); final Map<String, Object> body = new HashMap<>();
body.put(Constant.ROOM_ID, room.getRoomId()); body.put(Constant.ROOM_ID, room.getRoomId());
body.put(Constant.CLIENT_ID, clientId); body.put(Constant.CLIENT_ID, consumerClientId);
body.put(Constant.SOURCE_ID, produceClientWrapper.getClientId()); body.put(Constant.SOURCE_ID, producerClientId);
body.put(Constant.STREAM_ID, streamId); body.put(Constant.STREAM_ID, streamId);
body.put(Constant.PRODUCER_ID, producer.getProducerId()); body.put(Constant.PRODUCER_ID, producer.getProducerId());
body.put(Constant.TRANSPORT_ID, recvTransport.getTransportId()); 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()); body.put(Constant.SCTP_CAPABILITIES, consumerClientWrapper.getSctpCapabilities());
message.setBody(body); message.setBody(body);
mediaClient.push(message); mediaClient.push(message);
log.info("{}主动消费媒体:{} - {}", consumerClientId, producerClientId, streamId);
} }
} }

View File

@@ -60,7 +60,7 @@ public class MediaConsumerCloseProtocol extends ProtocolRoomAdapter implements A
final String consumerId = MapUtils.get(body, Constant.CONSUMER_ID); final String consumerId = MapUtils.get(body, Constant.CONSUMER_ID);
final Consumer consumer = room.consumer(consumerId); final Consumer consumer = room.consumer(consumerId);
if(consumer == null) { if(consumer == null) {
log.warn("关闭消费者无效:{}", consumerId); log.debug("关闭消费者无效:{}", consumerId);
} else { } else {
consumer.close(); consumer.close();
} }

View File

@@ -70,7 +70,7 @@ public class MediaProduceProtocol extends ProtocolRoomAdapter {
// 视频全收:广播音频 // 视频全收:广播音频
// 全部不收:全部广播 // 全部不收:全部广播
room.broadcast(responseMessage); room.broadcast(responseMessage);
log.info("{}生产媒体:{} - {} - {}", clientId, kind, streamId, producerId); log.info("{}生产媒体:{} - {}", clientId, streamId, producerId);
this.publishEvent(new MediaConsumeEvent(room, producer)); this.publishEvent(new MediaConsumeEvent(room, producer));
} }