From ec9a0ff37a0d43a3baef47fdbab97ae5f2ebbb7a Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Wed, 9 Nov 2022 08:28:37 +0800 Subject: [PATCH] [*] init --- .gitignore | 69 +--- README.md | 71 ++++ docs/assembly/dev.xml | 58 +++ docs/assembly/release.xml | 58 +++ docs/assembly/test.xml | 58 +++ docs/bin/deploy.sh | 36 ++ docs/bin/startup.sh | 46 +++ docs/bin/stop.sh | 24 ++ docs/bin/wait.sh | 33 ++ pom.xml | 349 ++++++++++++++++++ taoyao-live/pom.xml | 21 ++ taoyao-media/pom.xml | 21 ++ taoyao-meeting/pom.xml | 21 ++ taoyao-model/pom.xml | 21 ++ taoyao-server/pom.xml | 26 ++ .../com/acgist/taoyao/TaoyaoApplication.java | 13 + .../src/main/resources/application.properties | 1 + .../acgist/taoyao/TaoyaoApplicationTests.java | 13 + taoyao-signal/pom.xml | 26 ++ taoyao-webrtc/pom.xml | 26 ++ taoyao-webrtc/taoyao-webrtc-mcu/pom.xml | 21 ++ taoyao-webrtc/taoyao-webrtc-mesh/pom.xml | 21 ++ taoyao-webrtc/taoyao-webrtc-native/pom.xml | 21 ++ taoyao-webrtc/taoyao-webrtc-sfu/pom.xml | 21 ++ 24 files changed, 1014 insertions(+), 61 deletions(-) create mode 100644 README.md create mode 100644 docs/assembly/dev.xml create mode 100644 docs/assembly/release.xml create mode 100644 docs/assembly/test.xml create mode 100644 docs/bin/deploy.sh create mode 100644 docs/bin/startup.sh create mode 100644 docs/bin/stop.sh create mode 100644 docs/bin/wait.sh create mode 100644 pom.xml create mode 100644 taoyao-live/pom.xml create mode 100644 taoyao-media/pom.xml create mode 100644 taoyao-meeting/pom.xml create mode 100644 taoyao-model/pom.xml create mode 100644 taoyao-server/pom.xml create mode 100644 taoyao-server/src/main/java/com/acgist/taoyao/TaoyaoApplication.java create mode 100644 taoyao-server/src/main/resources/application.properties create mode 100644 taoyao-server/src/test/java/com/acgist/taoyao/TaoyaoApplicationTests.java create mode 100644 taoyao-signal/pom.xml create mode 100644 taoyao-webrtc/pom.xml create mode 100644 taoyao-webrtc/taoyao-webrtc-mcu/pom.xml create mode 100644 taoyao-webrtc/taoyao-webrtc-mesh/pom.xml create mode 100644 taoyao-webrtc/taoyao-webrtc-native/pom.xml create mode 100644 taoyao-webrtc/taoyao-webrtc-sfu/pom.xml diff --git a/.gitignore b/.gitignore index 1dc7a9d..ae58190 100644 --- a/.gitignore +++ b/.gitignore @@ -1,63 +1,10 @@ -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings -.loadpath -.recommenders -.classpath -.project -.class +*.log +*.project +*.settings +*.classpath +*.factorypath -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# PyDev specific (Python IDE for Eclipse) -*.pydevproject - -# CDT-specific (C/C++ Development Tooling) -.cproject - -# CDT- autotools -.autotools - -# Java annotation processor (APT) -.factorypath - -# PDT-specific (PHP Development Tools) -.buildpath - -# sbteclipse plugin -.target - -# Tern plugin -.tern-project - -# TeXlipse plugin -.texlipse - -# STS (Spring Tool Suite) -.springBeans - -# Code Recommenders -.recommenders/ - -# Annotation Processing +logs/ +target/ .apt_generated/ -.apt_generated_test/ - -# Scala IDE specific (Scala & Java development for Eclipse) -.cache-main -.scala_dependencies -.worksheet - -# Uncomment this line if you wish to ignore the project description file. -# Typically, this file would be tracked if it contains build/dependency configurations: -#.project +.apt_generated_tests/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..370ddb8 --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# 桃夭 + +基于WebRTC实现信令服务,实现Mesh、MCU和SFU三种媒体通信架构,支持直播会议两种场景。 + +## 模块 + +|模块|名称|描述| +|:--|:--|:--| +|taoyao|桃夭|桃之夭夭灼灼其华| +|taoyao-nat|内网穿透|STUN/TURN暂不实现(公共服务或者搭建coturn服务)| +|taoyao-live|直播|直播、连麦| +|taoyao-model|模型|数据模型| +|taoyao-media|媒体|录制、视频(美颜、AI识别)、音频(混音、变声)| +|taoyao-client|终端|帐号、摄像头| +|taoyao-signal|信令|信令服务| +|taoyao-server|服务|启动服务| +|taoyao-meeting|会议|会议模式、广播模式、单人对讲| +|taoyao-webrtc|WebRTC模块|| +|taoyao-webrtc-sfu|WebRTC SFU架构实现|| +|taoyao-webrtc-mcu|WebRTC MCU架构实现|| +|taoyao-webrtc-mesh|WebRTC MESH架构实现|| +|taoyao-webrtc-native|WebRTC底层实现|MCU/SFU底层媒体服务| + +## STUN/TURN公共服务 + +``` +stun:stun1.l.google.com:19302 +stun:stun2.l.google.com:19302 +stun:stun3.l.google.com:19302 +stun:stun4.l.google.com:19302 +stun:stun.stunprotocol.org:3478 +``` + +## 终端 + +帐号可以管理媒体,摄像头只能被动管理。 + +### 功能 + +|功能|场景|描述|帐号|摄像头| +注册 +注销 +心跳 +推流 +拉流 +邀请 +踢出 +绑定设备 +解绑设备 +进入会议:没有自动创建 +关闭会议: +订阅 +取消订阅 +暂停推流 +恢复推流 +掉线重连 + +### 信息 + +IP +MAC +信号 +电量 +通话状态 +录制状态 + +## 直播 + +## 会议 + +## \ No newline at end of file diff --git a/docs/assembly/dev.xml b/docs/assembly/dev.xml new file mode 100644 index 0000000..602a2b5 --- /dev/null +++ b/docs/assembly/dev.xml @@ -0,0 +1,58 @@ + + + dev + + + dir + + + false + + + + ${system.maven.basedir}/docs + ./ + + README.md + + + + ${system.maven.basedir}/docs/bin + bin + 0755 + true + + + src/main/resources + config + true + + *.yml + *.properties + + + + src/main/resources + config + + *.jks + + + + target + logs + + **/* + + + + + + + lib + + + + diff --git a/docs/assembly/release.xml b/docs/assembly/release.xml new file mode 100644 index 0000000..57c1398 --- /dev/null +++ b/docs/assembly/release.xml @@ -0,0 +1,58 @@ + + + release + + + zip + + + false + + + + ${system.maven.basedir}/docs + ./ + + README.md + + + + ${system.maven.basedir}/docs/bin + bin + 0755 + true + + + src/main/resources + config + true + + *.yml + *.properties + + + + src/main/resources + config + + *.jks + + + + target + logs + + **/* + + + + + + + lib + + + + diff --git a/docs/assembly/test.xml b/docs/assembly/test.xml new file mode 100644 index 0000000..94fb775 --- /dev/null +++ b/docs/assembly/test.xml @@ -0,0 +1,58 @@ + + + test + + + dir + + + false + + + + ${system.maven.basedir}/docs + ./ + + README.md + + + + ${system.maven.basedir}/docs/bin + bin + 0755 + true + + + src/main/resources + config + true + + *.yml + *.properties + + + + src/main/resources + config + + *.jks + + + + target + logs + + **/* + + + + + + + lib + + + + diff --git a/docs/bin/deploy.sh b/docs/bin/deploy.sh new file mode 100644 index 0000000..1163ef0 --- /dev/null +++ b/docs/bin/deploy.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# 进入目录 +base=$(readlink -f $(dirname $0)) +cd $base +echo "环境目录:$base" +echo "当前目录:$(pwd)" + +# 更新代码 +if [ -z $gited ]; then + echo "更新代码:${project.artifactId}-${project.version}" + git pull +fi + +# 编译代码 +if [ -z $mvned ]; then + echo "编译代码:${project.artifactId}-${project.version}" + mvn clean package install -pl "${project.groupId}:${project.artifactId}" -am -D skipTests -P ${env} +fi + +# 删除文件:注意不要删除日志 +rm -rf $base/../deploy/${project.artifactId}/bin +rm -rf $base/../deploy/${project.artifactId}/lib +rm -rf $base/../deploy/${project.artifactId}/config +# 运行目录 +echo "拷贝文件:${project.artifactId}-${project.version}" +if [ ! -d "$base/../deploy/${project.artifactId}" ]; then + mkdir -p $base/../deploy/${project.artifactId} +fi +# 拷贝文件 +cp -rf ${project.basedir}/target/${project.artifactId}-${project.version}/* $base/../deploy/${project.artifactId} +cp -rf ${project.basedir}/target/${project.artifactId}-${project.version}.jar $base/../deploy/${project.artifactId} + +# 启动服务 +cd $base/../deploy/${project.artifactId} +sh bin/startup.sh diff --git a/docs/bin/startup.sh b/docs/bin/startup.sh new file mode 100644 index 0000000..2dc7253 --- /dev/null +++ b/docs/bin/startup.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# 启动目录 +bin=$(readlink -f $(dirname $0)) +base=${bin%/*} +cd $base +echo "启动目录:$base" + +# Java运行环境 +JAVA=$(which java) +if [ -z "$JAVA" ] ; then + echo "必须安装${java.version}+JDK" + exit 1 +fi + +# 结束任务 +if [ ! -f "/.dockerenv" ]; then + sh bin/stop.sh +fi + +# 启动参数 +JAVA_OPTS_GC="-XX:+UseG1GC -Xlog:gc:./logs/gc.log:time,level" +JAVA_OPTS_MEM="-server ${system.maven.jvm.mem}" +JAVA_OPTS_EXT="-Dfile.encoding=${system.maven.encoding} -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true" +JAVA_OPTS_APP="-Dspring.profiles.active=${profile}" +JAVA_OPTS="$JAVA_OPTS_MEM $JAVA_OPTS_EXT $JAVA_OPTS_APP ${system.maven.jvm.arg}" +echo "启动参数:$JAVA_OPTS" + +# 启动应用 +echo "启动应用:${project.artifactId}-${project.version}" +if [ ! -f "/.dockerenv" ]; then + # 其他启动 + nohup $JAVA $JAVA_OPTS -jar $base/lib/${project.artifactId}-${project.version}.jar > /dev/null 2>&1 & +else + # 使用docker启动:后台启动不能查看控制台的信息 + $JAVA $JAVA_OPTS -jar $base/lib/${project.artifactId}-${project.version}.jar +fi + +# 等待任务 +if [ ! -f "/.dockerenv" ]; then + sh bin/wait.sh +else + echo -e "\033[32m启动成功:${project.artifactId}-${project.version}\033[0m" +fi + +echo "--------------------------------" diff --git a/docs/bin/stop.sh b/docs/bin/stop.sh new file mode 100644 index 0000000..f6e0418 --- /dev/null +++ b/docs/bin/stop.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# 结束任务 +killIndex=0 +processId=$(ps -aux | grep "${project.artifactId}" | grep java | awk '{print $2}') +if [ ! -z "$processId" ]; then + echo "关闭应用:${project.artifactId}-${project.version} - $processId" + while [ ! -z "$processId" ] + do + echo -n "." + if [ $killIndex -le 0 ]; then + # 优雅关机 + kill -15 $processId + elif [ $killIndex -ge 10 ]; then + echo -n '强制关闭' + # 强制关机 + kill -9 $processId + fi + sleep 1 + killIndex=$((killIndex+1)) + processId=$(ps -aux | grep "${project.artifactId}" | grep java | awk '{print $2}') + done + echo "" +fi diff --git a/docs/bin/wait.sh b/docs/bin/wait.sh new file mode 100644 index 0000000..4e78cc5 --- /dev/null +++ b/docs/bin/wait.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# 等待任务 +startTime=$(date +%s) +processId=$(ps -aux | grep "${project.artifactId}" | grep java | awk '{print $2}') +if [ ! -z "$processId" ]; then + waitIndex=0 + processPortNumber=$(netstat -anop | grep $processId | grep LISTEN | wc -l) + while [ $waitIndex -le 120 ] && [ ! -z "$processId" ] && [ $processPortNumber -lt 1 ] + do + sleep 1 + waitIndex=$((waitIndex+1)) + processId=$(ps -aux | grep "${project.artifactId}" | grep java | awk '{print $2}') + if [ ! -z "$processId" ]; then + processPortNumber=$(netstat -anop | grep $processId | grep LISTEN | wc -l) + else + processPortNumber=0 + fi + echo -n "." + done + echo "" +fi +if [ $processPortNumber -lt 1 ]; then + echo -e "\033[31m启动失败:${project.artifactId}-${project.version}\033[0m" + sh bin/stop.sh + exit 0 +else + finishTime=$(date +%s) + processTime=$((finishTime-startTime)) + echo -e "\033[32m启动成功:${project.artifactId}-${project.version} - $processId\033[0m" + echo "启动端口:$(netstat -anop | grep $processId | grep LISTEN | awk '{print $4}')" + echo "启动耗时:$processTime S" +fi diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..140e14a --- /dev/null +++ b/pom.xml @@ -0,0 +1,349 @@ + + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.7.5 + + + + com.acgist + taoyao + 1.0.0 + pom + + https://gitee.com/acgist/taoyao + 桃夭 + 基于WebRTC实现信令服务,实现Mesh、MCU和SFU三种媒体通信架构,支持直播会议两种场景。 + 2022 + + + + 17 + 1.18.24 + 3.0.0 + 1.5.3.Final + 4.4 + + ${project.basedir} + UTF-8 + true + + + + taoyao-nat + taoyao-live + taoyao-model + taoyao-media + taoyao-client + taoyao-signal + taoyao-webrtc + taoyao-server + taoyao-meeting + + + + + org.apache.commons + commons-lang3 + + + org.apache.commons + commons-collections4 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + com.acgist + taoyao-nat + ${project.version} + + + com.acgist + taoyao-live + ${project.version} + + + com.acgist + taoyao-model + ${project.version} + + + com.acgist + taoyao-media + ${project.version} + + + com.acgist + taoyao-client + ${project.version} + + + com.acgist + taoyao-signal + ${project.version} + + + com.acgist + taoyao-server + ${project.version} + + + com.acgist + taoyao-meeting + ${project.version} + + + com.acgist + taoyao-webrtc + ${project.version} + + + com.acgist + taoyao-webrtc-sfu + ${project.version} + + + com.acgist + taoyao-webrtc-mcu + ${project.version} + + + com.acgist + taoyao-webrtc-mesh + ${project.version} + + + com.acgist + taoyao-webrtc-native + ${project.version} + + + + org.mapstruct + mapstruct + ${mapstruct.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + + org.projectlombok + lombok + ${lombok.version} + + + + org.apache.commons + commons-collections4 + ${collections4.version} + + + + io.springfox + springfox-boot-starter + ${springfox.version} + + + + + + + + src/main/resources + + **/*.yml + **/*.properties + + true + + + src/main/resources + + + + **/*.* + + + **/*.yml + **/*.properties + + false + + + + ./ + false + META-INF/ + + LICENSE + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${system.maven.encoding} + + + + org.apache.maven.plugins + maven-jar-plugin + + + + *.jks + *.yml + *.properties + + + + + ../config/ + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assembly + package + + single + + + false + ${system.maven.skip.assembly} + false + + + + + + + + + + + dev + + true + + + dev + + -Xms512M -Xmx1024M -XX:NewRatio=1 -XX:SurvivorRatio=2 + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + ${system.maven.basedir}/docs/assembly/dev.xml + + + + + + + + test + + test + + -Xms512M -Xmx1024M -XX:NewRatio=1 -XX:SurvivorRatio=2 + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + ${system.maven.basedir}/docs/assembly/test.xml + + + + + + + + + io.springfox + springfox-boot-starter + ${springfox.version} + provided + + + + + + release + + release + -Dtaoyao.password=123456 + -Xms2048M -Xmx4096M -XX:NewRatio=1 -XX:SurvivorRatio=2 + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + ${system.maven.basedir}/docs/assembly/release.xml + + + + + + + + + io.springfox + springfox-boot-starter + ${springfox.version} + provided + + + + + + + \ No newline at end of file diff --git a/taoyao-live/pom.xml b/taoyao-live/pom.xml new file mode 100644 index 0000000..ed6b908 --- /dev/null +++ b/taoyao-live/pom.xml @@ -0,0 +1,21 @@ + + + + + 4.0.0 + + + com.acgist + taoyao + 1.0.0 + + + taoyao-live + jar + + 直播 + 直播、连麦 + + + + \ No newline at end of file diff --git a/taoyao-media/pom.xml b/taoyao-media/pom.xml new file mode 100644 index 0000000..f400995 --- /dev/null +++ b/taoyao-media/pom.xml @@ -0,0 +1,21 @@ + + + + + 4.0.0 + + + com.acgist + taoyao + 1.0.0 + + + taoyao-media + jar + + 媒体 + 录制、视频(美颜、AI识别)、音频(混音、变声) + + + + \ No newline at end of file diff --git a/taoyao-meeting/pom.xml b/taoyao-meeting/pom.xml new file mode 100644 index 0000000..f0b6741 --- /dev/null +++ b/taoyao-meeting/pom.xml @@ -0,0 +1,21 @@ + + + + + 4.0.0 + + + com.acgist + taoyao + 1.0.0 + + + taoyao-meeting + jar + + 会议 + 会议模式、广播模式、单人对讲 + + + + \ No newline at end of file diff --git a/taoyao-model/pom.xml b/taoyao-model/pom.xml new file mode 100644 index 0000000..fb25e96 --- /dev/null +++ b/taoyao-model/pom.xml @@ -0,0 +1,21 @@ + + + + + 4.0.0 + + + com.acgist + taoyao + 1.0.0 + + + taoyao-model + jar + + 模型 + 数据模型 + + + + \ No newline at end of file diff --git a/taoyao-server/pom.xml b/taoyao-server/pom.xml new file mode 100644 index 0000000..0d1255b --- /dev/null +++ b/taoyao-server/pom.xml @@ -0,0 +1,26 @@ + + + + + 4.0.0 + + + com.acgist + taoyao + 1.0.0 + + + taoyao-server + jar + + 服务 + 启动服务 + + + + org.springframework.boot + spring-boot-starter-web + + + + \ No newline at end of file diff --git a/taoyao-server/src/main/java/com/acgist/taoyao/TaoyaoApplication.java b/taoyao-server/src/main/java/com/acgist/taoyao/TaoyaoApplication.java new file mode 100644 index 0000000..88743ef --- /dev/null +++ b/taoyao-server/src/main/java/com/acgist/taoyao/TaoyaoApplication.java @@ -0,0 +1,13 @@ +package com.acgist.taoyao; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TaoyaoApplication { + + public static void main(String[] args) { + SpringApplication.run(TaoyaoApplication.class, args); + } + +} diff --git a/taoyao-server/src/main/resources/application.properties b/taoyao-server/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/taoyao-server/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/taoyao-server/src/test/java/com/acgist/taoyao/TaoyaoApplicationTests.java b/taoyao-server/src/test/java/com/acgist/taoyao/TaoyaoApplicationTests.java new file mode 100644 index 0000000..02104d5 --- /dev/null +++ b/taoyao-server/src/test/java/com/acgist/taoyao/TaoyaoApplicationTests.java @@ -0,0 +1,13 @@ +package com.acgist.taoyao; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class TaoyaoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/taoyao-signal/pom.xml b/taoyao-signal/pom.xml new file mode 100644 index 0000000..c4ea483 --- /dev/null +++ b/taoyao-signal/pom.xml @@ -0,0 +1,26 @@ + + + + + 4.0.0 + + + com.acgist + taoyao + 1.0.0 + + + taoyao-signal + jar + + 信令 + 信令服务 + + + + org.springframework.boot + spring-boot-starter-websocket + + + + \ No newline at end of file diff --git a/taoyao-webrtc/pom.xml b/taoyao-webrtc/pom.xml new file mode 100644 index 0000000..41f4857 --- /dev/null +++ b/taoyao-webrtc/pom.xml @@ -0,0 +1,26 @@ + + + + + 4.0.0 + + + com.acgist + taoyao + 1.0.0 + + + taoyao-webrtc + pom + + WebRTC模块 + WebRTC模块 + + + taoyao-webrtc-sfu + taoyao-webrtc-mcu + taoyao-webrtc-mesh + taoyao-webrtc-native + + + \ No newline at end of file diff --git a/taoyao-webrtc/taoyao-webrtc-mcu/pom.xml b/taoyao-webrtc/taoyao-webrtc-mcu/pom.xml new file mode 100644 index 0000000..640d6f1 --- /dev/null +++ b/taoyao-webrtc/taoyao-webrtc-mcu/pom.xml @@ -0,0 +1,21 @@ + + + + + 4.0.0 + + + com.acgist + taoyao-webrtc + 1.0.0 + + + taoyao-webrtc-mcu + jar + + WebRTC MCU架构实现 + WebRTC MCU架构实现 + + + + \ No newline at end of file diff --git a/taoyao-webrtc/taoyao-webrtc-mesh/pom.xml b/taoyao-webrtc/taoyao-webrtc-mesh/pom.xml new file mode 100644 index 0000000..0108376 --- /dev/null +++ b/taoyao-webrtc/taoyao-webrtc-mesh/pom.xml @@ -0,0 +1,21 @@ + + + + + 4.0.0 + + + com.acgist + taoyao-webrtc + 1.0.0 + + + taoyao-webrtc-mesh + jar + + WebRTC MESH架构实现 + WebRTC MESH架构实现 + + + + \ No newline at end of file diff --git a/taoyao-webrtc/taoyao-webrtc-native/pom.xml b/taoyao-webrtc/taoyao-webrtc-native/pom.xml new file mode 100644 index 0000000..662516c --- /dev/null +++ b/taoyao-webrtc/taoyao-webrtc-native/pom.xml @@ -0,0 +1,21 @@ + + + + + 4.0.0 + + + com.acgist + taoyao-webrtc + 1.0.0 + + + taoyao-webrtc-native + jar + + WebRTC底层实现 + MCU/SFU底层媒体服务 + + + + \ No newline at end of file diff --git a/taoyao-webrtc/taoyao-webrtc-sfu/pom.xml b/taoyao-webrtc/taoyao-webrtc-sfu/pom.xml new file mode 100644 index 0000000..81ec2cb --- /dev/null +++ b/taoyao-webrtc/taoyao-webrtc-sfu/pom.xml @@ -0,0 +1,21 @@ + + + + + 4.0.0 + + + com.acgist + taoyao-webrtc + 1.0.0 + + + taoyao-webrtc-sfu + jar + + WebRTC SFU架构实现 + WebRTC SFU架构实现 + + + + \ No newline at end of file