[*] rtp
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -5,7 +5,7 @@ package com.acgist.taoyao.signal.party.media;
|
||||
*
|
||||
* @author acgist
|
||||
*/
|
||||
public enum RouteType {
|
||||
public enum RouterType {
|
||||
|
||||
// 对讲:只有两个人之间的媒体相互路由
|
||||
ONE_TO_ONE,
|
||||
@@ -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())
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package com.acgist.taoyao.signal.protocol.media;
|
||||
|
||||
/**
|
||||
* 创建RTP输出通道信令
|
||||
*
|
||||
* @author acgist
|
||||
*/
|
||||
public class MediaTransportPlainOutProtocol {
|
||||
|
||||
}
|
||||
@@ -22,7 +22,10 @@ import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* 创建RTP输入通道信令
|
||||
* TODO:srtp
|
||||
* 注意:
|
||||
* 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": 是否开启sctp(true|false),
|
||||
"numSctpStreams": sctp数量,
|
||||
"enableSrtp": 是否开启srtp(true|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);
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user