[+] 架构优化:Moon=MCU+SFU

This commit is contained in:
acgist
2022-12-02 22:22:49 +08:00
parent 4a0e1ebbc7
commit b1ed244d4d
17 changed files with 132 additions and 95 deletions

View File

@@ -1,7 +1,6 @@
# 桃夭
基于WebRTC实现信令服务,实现Mesh、MCU和SFU三种媒体通信架构支持直播会议两种场景。<br />
项目提供WebRTC服务信令终端已有H5示例其他终端需要自己实现。
桃夭是套`WebRTC`信令服务,综合`Mesh``MCU``SFU`三种媒体通信架构,支持直播会议两种场景。
## 模块
@@ -16,9 +15,8 @@
|taoyao-server|服务|启动服务|
|taoyao-meeting|会议|会议模式、广播模式、单人对讲|
|taoyao-webrtc|WebRTC|WebRTC模块|
|taoyao-webrtc-sfu|SFU架构|SFU架构|
|taoyao-webrtc-mcu|MCU架构|MCU架构|
|taoyao-webrtc-mesh|MESH架构|MESH架构|
|taoyao-webrtc-mesh|Mesh架构|Mesh架构|
|taoyao-webrtc-moon|Moon架构|Moon架构|
|taoyao-webrtc-kurento|kurento框架|WebRTC协议簇kurento实现|
## 模块关系
@@ -31,7 +29,7 @@
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| taoyao-media |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| taoyao-sfu / taoyao-mcu | |
| taoyao-moon(MCU/SFU) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ taoyao-mesh +
| taoyao-kurento | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -53,13 +51,17 @@
* ~~直播~~
* 会议:一对一、~~多对多~~
* ~~媒体:录制、降噪、美颜等等~~
* ~~媒体:降噪、变声、美颜录制、等等~~
* 可能需要自己搭建`coturn`服务实现`STUN`/`TURN`内网穿透功能
### MCU/SFU
### Moon
终端推流到服务端,由服务端处理后分流。
综合`MCU`/`SFU`两种架构,终端推流到服务端,由服务端处理后分流。
> 为什么叫`Moon`:因为这是古诗词中最美丽的意象
#### 注意事项
* 需要安装[KMS服务](./docs/Deploy.md#kmskurento-media-server)
* 提供混音、变声、美颜、录制等等媒体功能
* 终端推送给服务端最高质量媒体,再由服务端根据订阅终端按配置分流。

91
docs/nginx/nginx.conf Normal file
View File

@@ -0,0 +1,91 @@
user nginx;
worker_processes auto;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log notice;
events {
use epoll;
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main buffer=32k flush=10s;
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
default_type application/octet-stream;
gzip on;
gzip_types text/xml text/css text/plain text/javascript image/gif image/png image/jpg image/webp image/jpeg image/x-icon image/svg+xml application/json application/javascript font/woff application/octet-stream application/vnd.ms-fontobject;
gzip_min_length 1k;
sendfile on;
# tcp_nopush on;
server_tokens off;
keepalive_timeout 60;
client_max_body_size 16m;
fastcgi_intercept_errors on;
upstream taoyao {
server https://localhost:8888;
keepalive 60;
}
server {
listen 80 default_server;
listen 443 ssl default_server;
ssl_certificate /data/ssl/taoyao.acgist.pem;
ssl_certificate_key /data/ssl/taoyao.acgist.key;
error_page 497 https://$host:$server_port$request_uri;
return 301 https://taoyao.acgist.com$request_uri;
}
server {
listen 443 ssl http2;
server_name taoyao.acgist.com;
access_log /var/log/nginx/taoyao.acgist.com.log main buffer=32k flush=10s;
ssl_certificate /data/ssl/taoyao.acgist.com.pem;
ssl_certificate_key /data/ssl/taoyao.acgist.com.key;
ssl_ciphers TLS13-AES-128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-CBC-SHA256:ECDHE-ECDSA-AES128-CBC-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_timeout 30m;
ssl_prefer_server_ciphers on;
# proxy_http_version 1.1;
proxy_http_version 2.0;
# proxy_set_header Connection close;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
# proxy_set_header Host $host:$server_port;
# proxy_set_header X-Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Http-scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Server $host;
add_header Strict-Transport-Security "max-age=15552000; includeSubdomains; preload";
location = /websocket.signal {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
keepalive_timeout 1200s;
proxy_read_timeout 1200s;
proxy_send_timeout 1200s;
proxy_connect_timeout 30s;
proxy_pass taoyao;
}
location / {
proxy_pass taoyao;
}
}
}

View File

17
pom.xml
View File

@@ -17,7 +17,7 @@
<url>https://gitee.com/acgist/taoyao</url>
<name>taoyao</name>
<description>桃夭:基于WebRTC实现信令服务,实现Mesh、MCU和SFU三种媒体通信架构支持直播会议两种场景。</description>
<description>桃夭:桃夭是套WebRTC信令服务综合Mesh、MCU和SFU三种媒体通信架构支持直播会议两种场景。</description>
<inceptionYear>2022</inceptionYear>
<properties>
@@ -143,21 +143,16 @@
<artifactId>taoyao-webrtc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-sfu</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-mcu</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-mesh</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-moon</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-kurento</artifactId>

View File

@@ -77,7 +77,7 @@ public class BootAutoConfiguration {
@Value("${spring.application.name:taoyao}")
private String name;
@Value("${taoyao.webrtc.framework:SFU}")
@Value("${taoyao.webrtc.framework:MOON}")
private String framework;
@Autowired

View File

@@ -24,18 +24,14 @@ public class WebrtcProperties {
*/
public enum Framework {
/**
* SFU架构
*/
SFU,
/**
* MCU架构
*/
MCU,
/**
* MESH架构
*/
MESH;
MESH,
/**
* MOON架构
*/
MOON;
}

View File

@@ -14,21 +14,17 @@
<packaging>jar</packaging>
<name>taoyao-media</name>
<description>媒体录制、视频美颜、AI识别、音频混音、变声、降噪</description>
<description>媒体:录制、视频(水印、美颜、AI识别、音频降噪、混音、变声)</description>
<dependencies>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-mcu</artifactId>
</dependency>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-sfu</artifactId>
</dependency>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-mesh</artifactId>
</dependency>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-moon</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -377,13 +377,13 @@
终端->服务端
暂停发布、订阅(不关媒体流通道)
MCU/SFU模式有效
Moon模式有效
### 恢复信令5005
终端->服务端
暂停发布、订阅(不关媒体流通道)
MCU/SFU模式有效
Moon模式有效
### 开启录像信令5006

View File

@@ -17,8 +17,7 @@
<description>WebRTC模块</description>
<modules>
<module>taoyao-webrtc-sfu</module>
<module>taoyao-webrtc-mcu</module>
<module>taoyao-webrtc-moon</module>
<module>taoyao-webrtc-mesh</module>
<module>taoyao-webrtc-kurento</module>
</modules>

View File

@@ -14,7 +14,7 @@
<packaging>jar</packaging>
<name>taoyao-webrtc-mesh</name>
<description>WebRTC MESH架构实现</description>
<description>WebRTC Mesh架构实现</description>
<dependencies></dependencies>

View File

@@ -10,11 +10,11 @@
<version>1.0.0</version>
</parent>
<artifactId>taoyao-webrtc-mcu</artifactId>
<artifactId>taoyao-webrtc-moon</artifactId>
<packaging>jar</packaging>
<name>taoyao-webrtc-mcu</name>
<description>WebRTC MCU架构实现</description>
<name>taoyao-webrtc-moon</name>
<description>WebRTC Moon架构实现</description>
<dependencies>
<dependency>

View File

@@ -1,15 +1,15 @@
package com.acgist.taoyao.webrtc.mcu.config;
package com.acgist.taoyao.webrtc.moon.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
/**
* MCU自动配置
* MOON自动配置
*
* @author acgist
*/
@Configuration
@ConditionalOnProperty(prefix = "taoyao.webrtc", name = "framework", havingValue = "MCU", matchIfMissing = false)
public class McuAutoConfiguration {
@ConditionalOnProperty(prefix = "taoyao.webrtc", name = "framework", havingValue = "MOON", matchIfMissing = false)
public class MoonAutoConfiguration {
}

View File

@@ -0,0 +1 @@
com.acgist.taoyao.webrtc.moon.config.MoonAutoConfiguration

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>taoyao-webrtc-sfu</artifactId>
<packaging>jar</packaging>
<name>taoyao-webrtc-sfu</name>
<description>WebRTC SFU架构实现</description>
<dependencies>
<dependency>
<groupId>com.acgist</groupId>
<artifactId>taoyao-webrtc-kurento</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,15 +0,0 @@
package com.acgist.taoyao.webrtc.sfu.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
/**
* SFU自动配置
*
* @author acgist
*/
@Configuration
@ConditionalOnProperty(prefix = "taoyao.webrtc", name = "framework", havingValue = "SFU", matchIfMissing = true)
public class SfuAutoConfiguration {
}