This commit is contained in:
acgist
2023-03-14 07:53:32 +08:00
parent 72e4b34630
commit 0cd054dbb0
25 changed files with 242 additions and 203 deletions

View File

@@ -1,6 +1,5 @@
package com.acgist.taoyao.signal.configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -13,6 +12,7 @@ import com.acgist.taoyao.signal.event.EventPublisher;
import com.acgist.taoyao.signal.protocol.ProtocolManager;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
/**
* 信令自动配置
@@ -20,13 +20,13 @@ import jakarta.annotation.PostConstruct;
* @author acgist
*/
@AutoConfiguration
@RequiredArgsConstructor
@EnableConfigurationProperties({
CameraProperties.class
})
public class SignalAutoConfiguration {
@Autowired
private ApplicationContext applicationContext;
private final ApplicationContext applicationContext;
@PostConstruct
public void init() {

View File

@@ -17,6 +17,7 @@ import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
/**
* 终端
@@ -26,6 +27,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
@Tag(name = "终端", description = "终端管理")
@RestController
@RequestMapping("/client")
@RequiredArgsConstructor
public class ClientController {
private final ClientManager clientManager;
@@ -33,16 +35,6 @@ public class ClientController {
private final ClientRebootProtocol clientRebootProtocol;
private final ClientShutdownProtocol clientShutdownProtocol;
public ClientController(
ClientManager clientManager, ClientWakeupProtocol clientWakeupProtocol,
ClientRebootProtocol clientRebootProtocol, ClientShutdownProtocol clientShutdownProtocol
) {
this.clientManager = clientManager;
this.clientWakeupProtocol = clientWakeupProtocol;
this.clientRebootProtocol = clientRebootProtocol;
this.clientShutdownProtocol = clientShutdownProtocol;
}
@Operation(summary = "终端列表", description = "终端列表")
@GetMapping("/list")
@ApiResponse(content = @Content(schema = @Schema(implementation = ClientStatus.class)))

View File

@@ -15,6 +15,7 @@ import com.acgist.taoyao.signal.protocol.Protocol;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
@@ -26,14 +27,11 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequestMapping("/protocol")
@RequiredArgsConstructor
public class ProtocolController {
private final ApplicationContext applicationContext;
public ProtocolController(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Operation(summary = "信令列表", description = "信令列表Markdown")
@GetMapping("/list")
public String list() {

View File

@@ -19,6 +19,7 @@ import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
/**
* 房间
@@ -29,14 +30,11 @@ import io.swagger.v3.oas.annotations.tags.Tag;
@Validated
@RestController
@RequestMapping("/room")
@RequiredArgsConstructor
public class RoomController {
private final RoomManager roomManager;
public RoomController(RoomManager roomManager) {
this.roomManager = roomManager;
}
@Operation(summary = "房间信息", description = "房间信息")
@GetMapping("/log")
public Message log() {

View File

@@ -5,7 +5,7 @@ package com.acgist.taoyao.signal.party.media;
*
* @author acgist
*/
public enum RouteType {
public enum RouterType {
// 对讲只有两个人之间的媒体相互路由
ONE_TO_ONE,

View File

@@ -67,11 +67,16 @@ public class MediaConsumeProtocol extends ProtocolRoomAdapter implements Applica
final ClientWrapper produceClientWrapper = producer.getProducerClient();
room.getClients().values().stream()
.filter(v -> v != produceClientWrapper)
.filter(v -> v.getRecvTransport() != null)
.filter(v -> v.getSubscribeType().canConsume(producer))
.forEach(v -> this.consume(room, v, producer, this.build()));
} else if(event.getClientWrapper() != null) {
// 创建WebRTC消费通道消费其他终端
final ClientWrapper consumeClientWrapper = event.getClientWrapper();
if(consumeClientWrapper.getRecvTransport() == null) {
log.debug("没有消费通道:{}", consumeClientWrapper.getClientId());
return;
}
room.getClients().values().stream()
.filter(v -> v != consumeClientWrapper)
.flatMap(v -> v.getProducers().values().stream())

View File

@@ -0,0 +1,34 @@
package com.acgist.taoyao.signal.protocol.media;
import java.util.Map;
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.media.Room;
import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter;
/**
* 设置路由类型信令
* 注意:不会添加移除消费者生产者,只会暂停恢复操作。
*
* @author acgist
*/
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

@@ -1,10 +0,0 @@
package com.acgist.taoyao.signal.protocol.media;
/**
* 创建RTP输出通道信令
*
* @author acgist
*/
public class MediaTransportPlainOutProtocol {
}

View File

@@ -22,7 +22,10 @@ import lombok.extern.slf4j.Slf4j;
/**
* 创建RTP输入通道信令
* TODOsrtp
* 注意
* 3. ffmpeg不支持rtcpMux
* 2. comedia必须开启srtp功能
* 1. 如果关闭comedia不会自动升级双向通道
*
* @author acgist
*/
@@ -34,14 +37,21 @@ import lombok.extern.slf4j.Slf4j;
"roomId": "房间ID",
"rtcpMux": RTP和RTCP端口复用true|false,
"comedia": 自动终端端口true|false,
"enableSctp": 是否开启sctptrue|false,
"numSctpStreams": sctp数量,
"enableSrtp": 是否开启srtptrue|false,
"srtpCryptoSuite": {
"cryptoSuite": "算法AEAD_AES_256_GCM|AEAD_AES_128_GCM|AES_CM_128_HMAC_SHA1_80|AES_CM_128_HMAC_SHA1_32",
"keyBase64": "密钥"
}
}
"""
)
public class MediaTransportPlainInProtocol extends ProtocolRoomAdapter {
public class MediaTransportPlainProtocol extends ProtocolRoomAdapter {
public static final String SIGNAL = "media::transport::plain::in";
public static final String SIGNAL = "media::transport::plain";
public MediaTransportPlainInProtocol() {
public MediaTransportPlainProtocol() {
super("创建RTP输入通道信令", SIGNAL);
}
@@ -65,6 +75,7 @@ public class MediaTransportPlainInProtocol extends ProtocolRoomAdapter {
log.warn("发送通道已经存在:{}", transportId);
}
clientWrapper.setSendTransport(sendTransport);
// TODO双向队列
// 拷贝属性
sendTransport.copy(responseBody);
client.push(response);

View File

@@ -40,6 +40,8 @@ public class RoomExpelProtocol extends ProtocolRoomAdapter {
if(clientType.mediaClient()) {
final String expelClientId = MapUtils.get(body, Constant.CLIENT_ID);
room.unicast(expelClientId, message);
// 如果需要强制提出
// room.leave(this.clientManager.clients(expelClientId));
} else {
this.logNoAdapter(clientType);
}