[*] 日常优化
This commit is contained in:
14
taoyao-client-media/.env.work
Normal file
14
taoyao-client-media/.env.work
Normal 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
|
||||||
@@ -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"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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通道信令
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询生产者状态信令
|
* 查询生产者状态信令
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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": 是否开启sctp(true|false),
|
"enableSctp" : 是否开启SCTP(true|false),
|
||||||
"numSctpStreams": sctp数量,
|
"numSctpStreams": SCTP数量,
|
||||||
"enableSrtp": 是否开启srtp(true|false),
|
"enableSrtp" : 是否开启SRTP(true|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" : "密钥"
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user