[*] 日常优化

This commit is contained in:
acgist
2023-07-13 08:36:26 +08:00
parent ccb4beea78
commit 0cf6777719
5 changed files with 120 additions and 174 deletions

View File

@@ -638,9 +638,7 @@ public final class Taoyao implements ITaoyao {
case "media::consume" -> this.mediaConsume(message, message.body()); case "media::consume" -> this.mediaConsume(message, message.body());
case "media::consumer::close" -> this.mediaConsumerClose(message, message.body()); case "media::consumer::close" -> this.mediaConsumerClose(message, message.body());
case "media::consumer::pause" -> this.mediaConsumerPause(message, message.body()); case "media::consumer::pause" -> this.mediaConsumerPause(message, message.body());
case "media::consumer::request::key::frame" -> this.mediaConsumerRequestKeyFrame(message, message.body());
case "media::consumer::resume" -> this.mediaConsumerResume(message, message.body()); case "media::consumer::resume" -> this.mediaConsumerResume(message, message.body());
case "media::consumer::set::preferred::layers" -> this.mediaConsumerSetPreferredLayers(message, message.body());
case "media::consumer::status" -> this.mediaConsumerStatus(message, message.body()); case "media::consumer::status" -> this.mediaConsumerStatus(message, message.body());
case "media::producer::close" -> this.mediaProducerClose(message, message.body()); case "media::producer::close" -> this.mediaProducerClose(message, message.body());
case "media::producer::pause" -> this.mediaProducerPause(message, message.body()); case "media::producer::pause" -> this.mediaProducerPause(message, message.body());
@@ -868,16 +866,6 @@ public final class Taoyao implements ITaoyao {
room.mediaConsumerPause(body); room.mediaConsumerPause(body);
} }
/**
* 请求关键帧信令
*
* @param message 信令消息
* @param body 信令主体
*/
private void mediaConsumerRequestKeyFrame(Message message, Map<String, Object> body) {
}
/** /**
* 恢复消费者信令 * 恢复消费者信令
* *
@@ -894,16 +882,6 @@ public final class Taoyao implements ITaoyao {
room.mediaConsumerResume(body); room.mediaConsumerResume(body);
} }
/**
* 修改最佳空间层和时间层信令
*
* @param message 信令消息
* @param body 信令主体
*/
private void mediaConsumerSetPreferredLayers(Message message, Map<String, Object> body) {
}
/** /**
* 查询消费者状态信令 * 查询消费者状态信令
* *

View File

@@ -2,6 +2,7 @@ const os = require("os");
/** /**
* 桃夭媒体服务地址 * 桃夭媒体服务地址
* 注意这里即使是本机也不能配置127.0.0.1
*/ */
const defaultTaoyaoHost = "192.168.1.110"; const defaultTaoyaoHost = "192.168.1.110";

View File

@@ -803,15 +803,9 @@ class Taoyao extends RemoteClient {
case "media::consumer::pause": case "media::consumer::pause":
this.defaultMediaConsumerPause(message); this.defaultMediaConsumerPause(message);
break; break;
case "media::consumer::request::key::frame":
me.defaultMediaConsumerRequestKeyFrame(message);
break;
case "media::consumer::resume": case "media::consumer::resume":
this.defaultMediaConsumerResume(message); this.defaultMediaConsumerResume(message);
break; break;
case "media::consumer::set::preferred::layers":
me.defaultMediaConsumerSetPreferredLayers(message);
break;
case "media::consumer::status": case "media::consumer::status":
this.defaultMediaConsumerStatus(message); this.defaultMediaConsumerStatus(message);
break; break;
@@ -1129,10 +1123,6 @@ class Taoyao extends RemoteClient {
*/ */
controlServerRecord(clientId, enabled) { controlServerRecord(clientId, enabled) {
const me = this; const me = this;
if(!me.roomId) {
me.callbackError("没有进入房间");
return;
}
me.push(protocol.buildMessage("control::server::record", { me.push(protocol.buildMessage("control::server::record", {
to : clientId, to : clientId,
roomId : me.roomId, roomId : me.roomId,
@@ -1175,10 +1165,6 @@ class Taoyao extends RemoteClient {
*/ */
mediaConsumerClose(consumerId) { mediaConsumerClose(consumerId) {
const me = this; const me = this;
if(!me.roomId) {
me.callbackError("没有进入房间");
return;
}
me.push(protocol.buildMessage("media::consumer::close", { me.push(protocol.buildMessage("media::consumer::close", {
roomId : me.roomId, roomId : me.roomId,
consumerId: consumerId, consumerId: consumerId,
@@ -1210,10 +1196,6 @@ class Taoyao extends RemoteClient {
*/ */
mediaConsumerPause(consumerId) { mediaConsumerPause(consumerId) {
const me = this; const me = this;
if(!me.roomId) {
me.callbackError("没有进入房间");
return;
}
const consumer = me.consumers.get(consumerId); const consumer = me.consumers.get(consumerId);
if(consumer) { if(consumer) {
if(consumer.paused) { if(consumer.paused) {
@@ -1246,10 +1228,8 @@ class Taoyao extends RemoteClient {
} }
} }
// TODOcontinue
/** /**
* 请求关键帧 * 请求关键帧信令
* *
* @param {*} consumerId 消费者ID * @param {*} consumerId 消费者ID
*/ */
@@ -1257,11 +1237,11 @@ class Taoyao extends RemoteClient {
const me = this; const me = this;
const consumer = me.consumers.get(consumerId); const consumer = me.consumers.get(consumerId);
if(!consumer) { if(!consumer) {
me.callbackError("消费者无效:" + consumerId); me.callbackError("请求关键帧消费者无效");
return; return;
} }
if(consumer.kind !== "video") { if(consumer.kind !== "video") {
me.callbackError("消费者不是视频媒体:" + consumerId); me.callbackError("只能请求视频消费者关键帧");
return; return;
} }
me.push(protocol.buildMessage("media::consumer::request::key::frame", { me.push(protocol.buildMessage("media::consumer::request::key::frame", {
@@ -1269,16 +1249,9 @@ class Taoyao extends RemoteClient {
consumerId: consumerId, consumerId: consumerId,
})); }));
} }
/** /**
* 请求关键帧信令 * 恢复消费者信令
*
* @param {*} message 消息
*/
defaultMediaConsumerRequestKeyFrame(message) {
console.debug("defaultMediaConsumerRequestKeyFrame", message);
}
/**
* 恢复消费者
* *
* @param {*} consumerId 消费者ID * @param {*} consumerId 消费者ID
*/ */
@@ -1289,33 +1262,34 @@ class Taoyao extends RemoteClient {
if(!consumer.paused) { if(!consumer.paused) {
return; return;
} }
console.debug("mediaConsumerResume", consumerId); console.debug("恢复消费者", consumerId);
me.push(protocol.buildMessage("media::consumer::resume", { me.push(protocol.buildMessage("media::consumer::resume", {
roomId : me.roomId, roomId : me.roomId,
consumerId: consumerId, consumerId: consumerId,
})); }));
} else { } else {
console.debug("mediaConsumerResume non", consumerId); console.debug("恢复消费者无效", consumerId);
} }
} }
/** /**
* 恢复消费者信令 * 恢复消费者信令
* *
* @param {*} message 消息 * @param {*} message 信令消息
*/ */
defaultMediaConsumerResume(message) { defaultMediaConsumerResume(message) {
const me = this; const me = this;
const { roomId, consumerId } = message.body; const { roomId, consumerId } = message.body;
const consumer = me.consumers.get(consumerId); const consumer = me.consumers.get(consumerId);
if (consumer) { if (consumer) {
console.debug("恢复消费者", consumerId); console.debug("恢复消费者", consumerId);
consumer.resume(); consumer.resume();
} else { } else {
console.debug("恢复消费者无效", consumerId); console.debug("恢复消费者无效", consumerId);
} }
} }
/** /**
* 修改最佳空间层和时间层 * 修改最佳空间层和时间层信令
* *
* @param {*} consumerId 消费者ID * @param {*} consumerId 消费者ID
* @param {*} spatialLayer 空间层 * @param {*} spatialLayer 空间层
@@ -1325,11 +1299,11 @@ class Taoyao extends RemoteClient {
const me = this; const me = this;
const consumer = me.consumers.get(consumerId); const consumer = me.consumers.get(consumerId);
if(!consumer) { if(!consumer) {
me.callbackError("消费者无效:" + consumerId); me.callbackError("修改最佳空间层和时间层消费者无效");
return; return;
} }
if(consumer.kind !== "video") { if(consumer.kind !== "video") {
me.callbackError("消费者不是视频媒体:" + consumerId); me.callbackError("只能修改视频消费者最佳空间层和时间层");
return; return;
} }
me.push(protocol.buildMessage("media::consumer::set::preferred::layers", { me.push(protocol.buildMessage("media::consumer::set::preferred::layers", {
@@ -1339,91 +1313,95 @@ class Taoyao extends RemoteClient {
temporalLayer, temporalLayer,
})); }));
} }
/**
* 修改最佳空间层和时间层信令
*
* @param {*} message 消息
*/
defaultMediaConsumerSetPreferredLayers(message) {
console.debug("defaultMediaConsumerSetPreferredLayers", message);
}
/** /**
* 查询消费者状态信令 * 查询消费者状态信令
* *
* @param {*} message 消息 * @param {*} message 消息
*/ */
defaultMediaConsumerStatus(message) { defaultMediaConsumerStatus(message) {
console.info("defaultMediaConsumerStatus", message); console.debug("消费者状态", message);
} }
/** /**
* 关闭数据消费者信令 * 关闭数据消费者信令
* *
* @param {*} message 消息 * @param {*} message 信令消息
*/ */
defaultMediaDataConsumerClose(message) { defaultMediaDataConsumerClose(message) {
const me = this; const me = this;
const { roomId, consumerId } = message.body; const { roomId, consumerId } = message.body;
const dataConsumer = me.dataConsumers.get(consumerId); const dataConsumer = me.dataConsumers.get(consumerId);
if (dataConsumer) { if (dataConsumer) {
console.info("关闭数据消费者", consumerId); console.debug("关闭数据消费者", consumerId);
dataConsumer.close(); dataConsumer.close();
me.dataConsumers.delete(consumerId); me.dataConsumers.delete(consumerId);
} else { } else {
console.debug("关闭数据消费者无效", consumerId); console.debug("关闭数据消费者无效", consumerId);
} }
} }
/** /**
* 查询数据消费者状态信令 * 查询数据消费者状态信令
* *
* @param {*} message 消息 * @param {*} message 信令消息
*/ */
defaultMediaDataConsumerStatus(message) { defaultMediaDataConsumerStatus(message) {
console.info("defaultMediaDataConsumerStatus", message); console.debug("数据消费者状态", message);
} }
/** /**
* 关闭数据生产者信令 * 关闭数据生产者信令
* *
* @param {*} message 消息 * @param {*} message 信令消息
*/ */
defaultMediaDataProducerClose(message) { defaultMediaDataProducerClose(message) {
const me = this; const me = this;
const { roomId, producerId } = message.body; const { roomId, producerId } = message.body;
const producer = me.dataProducer; const producer = me.getProducer(producerId);
if (producer) { if (producer) {
console.debug("关闭数据生产者", producerId); console.debug("关闭数据生产者", producerId);
producer.close(); producer.close();
// TODO类型判断设置为空 me.dataProducer = null;
} else { } else {
console.debug("关闭数据生产者无效", producerId); console.debug("关闭数据生产者无效", producerId);
} }
} }
/** /**
* 关闭数据消费者信令 * 关闭数据消费者信令
* *
* @param {*} message 消息 * @param {*} message 消息
*/ */
defaultMediaDataProducerStatus(message) { defaultMediaDataProducerStatus(message) {
console.info("defaultMediaDataProducerStatus", message); console.info("数据生产者状态", message);
} }
/** /**
* 关闭生产者信令 * 关闭生产者信令
* *
* @param {*} message 消息 * @param {*} message 信令消息
*/ */
async defaultMediaProducerClose(message) { async defaultMediaProducerClose(message) {
const me = this; const me = this;
const { roomId, producerId } = message.body; const { roomId, producerId } = message.body;
const producer = me.getProducer(producerId); const producer = me.getProducer(producerId);
if (producer) { if (producer) {
console.debug("关闭生产者", producerId); console.debug("关闭生产者", producerId);
producer.close(); producer.close();
// TODO类型判断设置为空 if(producer.kind === "audio") {
me.audioProducer = null;
} else if(producer.kind === "video") {
me.videoProducer = null;
} else { } else {
console.debug("关闭生产者无效:", producerId); }
} else {
console.debug("关闭生产者无效", producerId);
} }
} }
/** /**
* 暂停生产者 * 暂停生产者信令
* *
* @param {*} producerId 生产者ID * @param {*} producerId 生产者ID
*/ */
@@ -1434,15 +1412,16 @@ class Taoyao extends RemoteClient {
if(producer.paused) { if(producer.paused) {
return; return;
} }
console.debug("mediaProducerPause", producerId); console.debug("暂停生产者", producerId);
me.push(protocol.buildMessage("media::producer::pause", { me.push(protocol.buildMessage("media::producer::pause", {
roomId : me.roomId, roomId : me.roomId,
producerId: producerId, producerId: producerId,
})); }));
} else { } else {
console.debug("mediaProducerPause non", producerId); console.debug("暂停生产者无效", producerId);
} }
} }
/** /**
* 暂停生产者信令 * 暂停生产者信令
* *
@@ -1453,14 +1432,15 @@ class Taoyao extends RemoteClient {
const { roomId, producerId } = message.body; const { roomId, producerId } = message.body;
const producer = me.getProducer(producerId); const producer = me.getProducer(producerId);
if (producer) { if (producer) {
console.debug("暂停生产者", producerId); console.debug("暂停生产者", producerId);
producer.pause(); producer.pause();
} else { } else {
console.debug("暂停生产者无效", producerId); console.debug("暂停生产者无效", producerId);
} }
} }
/** /**
* 恢复生产者 * 恢复生产者信令
* *
* @param {*} producerId 生产者ID * @param {*} producerId 生产者ID
*/ */
@@ -1471,65 +1451,71 @@ class Taoyao extends RemoteClient {
if(!producer.paused) { if(!producer.paused) {
return; return;
} }
console.debug("mediaProducerResume", producerId); console.debug("恢复生产者", producerId);
me.push(protocol.buildMessage("media::producer::resume", { me.push(protocol.buildMessage("media::producer::resume", {
roomId : me.roomId, roomId : me.roomId,
producerId: producerId, producerId: producerId,
})); }));
} else { } else {
console.debug("mediaProducerResume non", producerId); console.debug("恢复生产者无效", producerId);
} }
} }
/** /**
* 恢复生产者信令 * 恢复生产者信令
* *
* @param {*} message 消息 * @param {*} message 信令消息
*/ */
async defaultMediaProducerResume(message) { async defaultMediaProducerResume(message) {
const me = this; const me = this;
const { roomId, producerId } = message.body; const { roomId, producerId } = message.body;
const producer = me.getProducer(producerId); const producer = me.getProducer(producerId);
if (producer) { if (producer) {
console.debug("恢复生产者", producerId); console.debug("恢复生产者", producerId);
producer.resume(); producer.resume();
} else { } else {
console.debug("恢复生产者无效", producerId); console.debug("恢复生产者无效", producerId);
} }
} }
/** /**
* 重启ICE * 重启ICE信令
*/ */
async mediaIceRestart() { async mediaIceRestart() {
const me = this; const me = this;
if (me.sendTransport) { if (me.sendTransport) {
const response = await me.request(protocol.buildMessage( const response = await me.request(protocol.buildMessage('media::ice::restart', {
'media::ice::restart', transportId: me.sendTransport.id
{ transportId: me.sendTransport.id } }));
));
const { iceParameters } = response.body; const { iceParameters } = response.body;
await me.sendTransport.restartIce({ iceParameters }); await me.sendTransport.restartIce({ iceParameters });
} }
if (me.recvTransport) if (me.recvTransport) {
{ const response = await me.request(protocol.buildMessage('media::ice::restart', {
const response = await me.request(protocol.buildMessage( transportId: me.recvTransport.id
'media::ice::restart', }));
{ transportId: me.recvTransport.id }
));
const { iceParameters } = response; const { iceParameters } = response;
await me.recvTransport.restartIce({ iceParameters }); await me.recvTransport.restartIce({ iceParameters });
} }
} }
/** /**
* 视频方向变化信令 * 视频方向变化信令
* *
* @param {*} message 消息 * @param {*} message 信令消息
*/ */
defaultMediaVideoOrientationChange(message) { defaultMediaVideoOrientationChange(message) {
console.debug("视频方向变化信令", message); console.debug("视频方向变化信令", message);
} }
// TODOcontinue
/** /**
* 消费媒体信令 * 消费媒体信令
* 如果需要加密consumer.rtpReceiver
* const receiverStreams = receiver.createEncodedStreams();
* const readableStream = receiverStreams.readable || receiverStreams.readableStream;
* const writableStream = receiverStreams.writable || receiverStreams.writableStream;
* *
* @param {*} message 消息 * @param {*} message 消息
*/ */
@@ -1824,10 +1810,6 @@ class Taoyao extends RemoteClient {
*/ */
roomExpel(clientId) { roomExpel(clientId) {
const me = this; const me = this;
if(!me.roomId) {
this.callbackError("没有进入房间");
return;
}
me.push(protocol.buildMessage("room::expel", { me.push(protocol.buildMessage("room::expel", {
roomId: this.roomId, roomId: this.roomId,
clientId, clientId,
@@ -1849,10 +1831,6 @@ class Taoyao extends RemoteClient {
*/ */
roomInvite(clientId) { roomInvite(clientId) {
const me = this; const me = this;
if(!me.roomId) {
this.callbackError("没有进入房间");
return;
}
me.push(protocol.buildMessage("room::invite", { me.push(protocol.buildMessage("room::invite", {
roomId: this.roomId, roomId: this.roomId,
clientId, clientId,
@@ -1964,6 +1942,10 @@ class Taoyao extends RemoteClient {
/************************ 媒体 ************************/ /************************ 媒体 ************************/
/** /**
* 生产媒体 * 生产媒体
* 如果需要加密producer.rtpSender
* const senderStreams = sender.createEncodedStreams();
* const readableStream = senderStreams.readable || senderStreams.readableStream;
* const writableStream = senderStreams.writable || senderStreams.writableStream;
* *
* TODO优先使用外部传入数据 * TODO优先使用外部传入数据
*/ */
@@ -2005,6 +1987,7 @@ class Taoyao extends RemoteClient {
} = response.body; } = response.body;
self.sendTransport = self.mediasoupDevice.createSendTransport({ self.sendTransport = self.mediasoupDevice.createSendTransport({
id: transportId, id: transportId,
iceServers: [],
iceCandidates, iceCandidates,
iceParameters, iceParameters,
dtlsParameters: { dtlsParameters: {
@@ -2012,16 +1995,9 @@ class Taoyao extends RemoteClient {
role: "auto", role: "auto",
}, },
sctpParameters, sctpParameters,
// TODO:iceservers
iceServers: [],
// Google配置
proprietaryConstraints: { proprietaryConstraints: {
optional: [{ googDscp: true }], optional: [{ googDscp: true }],
}, },
additionalSettings: {
// TODO加密解密
encodedInsertableStreams: false
},
}); });
self.sendTransport.on( self.sendTransport.on(
"connect", "connect",
@@ -2100,6 +2076,7 @@ class Taoyao extends RemoteClient {
} = response.body; } = response.body;
self.recvTransport = self.mediasoupDevice.createRecvTransport({ self.recvTransport = self.mediasoupDevice.createRecvTransport({
id: transportId, id: transportId,
iceServers: [],
iceCandidates, iceCandidates,
iceParameters, iceParameters,
dtlsParameters: { dtlsParameters: {
@@ -2107,10 +2084,8 @@ class Taoyao extends RemoteClient {
role: "auto", role: "auto",
}, },
sctpParameters, sctpParameters,
iceServers: [], proprietaryConstraints: {
additionalSettings: { optional: [{ googDscp: true }],
// TODO加密解密
encodedInsertableStreams: false,
}, },
}); });
self.recvTransport.on( self.recvTransport.on(

View File

@@ -6,7 +6,6 @@ import com.acgist.taoyao.boot.annotation.Description;
import com.acgist.taoyao.boot.annotation.Protocol; import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.config.Constant;
import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.utils.MapUtils;
import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.client.ClientType; import com.acgist.taoyao.signal.client.ClientType;
import com.acgist.taoyao.signal.party.media.Room; import com.acgist.taoyao.signal.party.media.Room;
@@ -41,9 +40,6 @@ public class MediaConsumerRequestKeyFrameProtocol extends ProtocolRoomAdapter {
if(clientType.mediaClient()) { if(clientType.mediaClient()) {
body.put(Constant.CLIENT_ID, clientId); body.put(Constant.CLIENT_ID, clientId);
mediaClient.push(message); mediaClient.push(message);
} else if(clientType.mediaServer()) {
final String requestClientId = MapUtils.remove(body, Constant.CLIENT_ID);
room.unicast(requestClientId, message);
} else { } else {
this.logNoAdapter(clientType); this.logNoAdapter(clientType);
} }

View File

@@ -6,7 +6,6 @@ import com.acgist.taoyao.boot.annotation.Description;
import com.acgist.taoyao.boot.annotation.Protocol; import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.config.Constant;
import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.utils.MapUtils;
import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.client.ClientType; import com.acgist.taoyao.signal.client.ClientType;
import com.acgist.taoyao.signal.party.media.Room; import com.acgist.taoyao.signal.party.media.Room;
@@ -49,9 +48,6 @@ public class MediaConsumerSetPreferredLayersProtocol extends ProtocolRoomAdapter
if(clientType.mediaClient()) { if(clientType.mediaClient()) {
body.put(Constant.CLIENT_ID, clientId); body.put(Constant.CLIENT_ID, clientId);
mediaClient.push(message); mediaClient.push(message);
} else if(clientType.mediaServer()) {
final String requestClientId = MapUtils.remove(body, Constant.CLIENT_ID);
room.unicast(requestClientId, message);
} else { } else {
this.logNoAdapter(clientType); this.logNoAdapter(clientType);
} }