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