[*] 日常优化

This commit is contained in:
acgist
2023-08-09 08:09:07 +08:00
parent f3705db94e
commit d8f6b4b5af
11 changed files with 128 additions and 90 deletions

View File

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

View File

@@ -9,6 +9,7 @@
"scripts": { "scripts": {
"dev" : "node src/Server.js", "dev" : "node src/Server.js",
"prd" : "cross-env NODE_ENV=prd 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-a": "cross-env NODE_ENV=node-a node src/Server.js",
"node-b": "cross-env NODE_ENV=node-b node src/Server.js" "node-b": "cross-env NODE_ENV=node-b node src/Server.js"
}, },

View File

@@ -465,6 +465,9 @@ class Taoyao {
case "media::transport::plain": case "media::transport::plain":
me.mediaTransportPlain(message, body); me.mediaTransportPlain(message, body);
break; break;
case "media::transport::status":
me.mediaTransportStatus(message, body);
break;
case "media::transport::webrtc::connect": case "media::transport::webrtc::connect":
me.mediaTransportWebrtcConnect(message, body); me.mediaTransportWebrtcConnect(message, body);
break; break;
@@ -1657,6 +1660,32 @@ class Taoyao {
me.push(message); 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通道信令 * 连接WebRTC通道信令
* *

View File

@@ -843,6 +843,9 @@ class Taoyao extends RemoteClient {
case "media::producer::score": case "media::producer::score":
me.defaultMediaProducerScore(message); me.defaultMediaProducerScore(message);
break; break;
case "media::transport::close":
me.defaultMediaTransportClose(message);
break;
case "media::video::orientation::change": case "media::video::orientation::change":
me.defaultMediaVideoOrientationChange(message); me.defaultMediaVideoOrientationChange(message);
break; break;
@@ -1878,6 +1881,57 @@ class Taoyao extends RemoteClient {
console.debug("生产者评分", message); 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
}));
}
/** /**
* 查询生产者状态信令 * 查询生产者状态信令
* *

View File

@@ -28,7 +28,7 @@ public class RtpTest {
final InputStream inputStream = socket.getInputStream(); final InputStream inputStream = socket.getInputStream();
final OutputStream outputStream = socket.getOutputStream(); final OutputStream outputStream = socket.getOutputStream();
// 随机密码https://localhost:8888/config/socket // 随机密码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 encrypt = CipherUtils.buildCipher(Cipher.ENCRYPT_MODE, Encrypt.DES, secret);
final Cipher decrypt = CipherUtils.buildCipher(Cipher.DECRYPT_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.flip();
buffer.get(message); buffer.get(message);
buffer.compact(); 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);
}
} }
} }
} }

View File

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

View File

@@ -24,13 +24,14 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter;
} }
""", """,
""" """
{ "roomId" : "房间标识",
"rtpCapabilities": {
"codec" : "编码解码", "codec" : "编码解码",
"headerExtensions": "扩展" "headerExtensions": "扩展"
} }
""" """
}, },
flow = { "终端=>信令服务->媒体服务->信令服务->终端"} flow = { "终端=>信令服务->媒体服务"}
) )
public class MediaRouterRtpCapabilitiesProtocol extends ProtocolRoomAdapter { public class MediaRouterRtpCapabilitiesProtocol extends ProtocolRoomAdapter {

View File

@@ -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<String, Object> body) {
if(clientType.mediaClient()) {
// TODO路由类型
} else {
this.logNoAdapter(clientType);
}
}
}

View File

@@ -27,13 +27,14 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@Protocol @Protocol
@Description( @Description(
memo = "关闭通过回调实现所以不能同步响应",
body = """ body = """
{ {
"roomId" : "房间ID" "roomId" : "房间ID"
"transportId": "通道ID" "transportId": "通道ID"
} }
""", """,
flow = "终端->信令服务->媒体服务->信令服务+)终端" flow = "终端->信令服务->媒体服务->信令服务->终端"
) )
public class MediaTransportCloseProtocol extends ProtocolRoomAdapter implements ApplicationListener<TransportCloseEvent> { public class MediaTransportCloseProtocol extends ProtocolRoomAdapter implements ApplicationListener<TransportCloseEvent> {
@@ -67,7 +68,7 @@ public class MediaTransportCloseProtocol extends ProtocolRoomAdapter implements
transport.close(); transport.close();
} else if(clientType.mediaServer()) { } else if(clientType.mediaServer()) {
transport.remove(); transport.remove();
room.broadcast(message); transport.getClient().push(message);
} else { } else {
this.logNoAdapter(clientType); this.logNoAdapter(clientType);
} }

View File

@@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
/** /**
* 创建RTP输入通道信令 * 创建RTP输入通道信令
*
* 注意: * 注意:
* 1. ffmpeg不支持rtcpMux * 1. ffmpeg不支持rtcpMux
* 2. comedia必须开启srtp功能 * 2. comedia必须开启srtp功能
@@ -32,14 +33,15 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@Protocol @Protocol
@Description( @Description(
memo = "用来接入RTP终端",
body = """ body = """
{ {
"roomId" : "房间ID", "roomId" : "房间ID",
"rtcpMux" : RTP和RTCP端口复用true|false, "rtcpMux" : RTP和RTCP端口复用true|false,
"comedia": 自动终端端口true|false, "comedia" : 自动识别终端端口true|false,
"enableSctp": 是否开启sctptrue|false, "enableSctp" : 是否开启SCTPtrue|false,
"numSctpStreams": sctp数量, "numSctpStreams": SCTP数量,
"enableSrtp": 是否开启srtptrue|false, "enableSrtp" : 是否开启SRTPtrue|false,
"srtpCryptoSuite": { "srtpCryptoSuite": {
"cryptoSuite": "算法AEAD_AES_256_GCM|AEAD_AES_128_GCM|AES_CM_128_HMAC_SHA1_80|AES_CM_128_HMAC_SHA1_32", "cryptoSuite": "算法AEAD_AES_256_GCM|AEAD_AES_128_GCM|AES_CM_128_HMAC_SHA1_80|AES_CM_128_HMAC_SHA1_32",
"keyBase64" : "密钥" "keyBase64" : "密钥"

View File

@@ -23,7 +23,7 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter;
"transportId": "通道ID" "transportId": "通道ID"
} }
""", """,
flow = "终端=>信令服务->媒体服务->信令服务->终端" flow = "终端=>信令服务->媒体服务"
) )
public class MediaTransportStatusProtocol extends ProtocolRoomAdapter { public class MediaTransportStatusProtocol extends ProtocolRoomAdapter {