From 46130cc15bae014cc7b895e847919c064a5a7091 Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Wed, 23 Nov 2022 08:43:57 +0800 Subject: [PATCH] [+] UML --- README.md | 2 + docs/Deploy.md | 1 + docs/flow/README.md | 33 -------- docs/flow/WebRTC.png | Bin 59950 -> 0 bytes docs/sequence/Client.iuml | 36 +++++++++ docs/sequence/Client.png | Bin 0 -> 23107 bytes docs/sequence/Live.iuml | 32 ++++++++ docs/sequence/MCU.iuml | 32 ++++++++ docs/sequence/Media.iuml | 32 ++++++++ docs/sequence/Meeting.iuml | 29 +++++++ docs/sequence/Mesh.iuml | 34 ++++++++ docs/sequence/SFU.iuml | 32 ++++++++ docs/sequence/WebRTC.iuml | 74 ++++++++++++++++++ docs/sequence/WebRTC.png | Bin 0 -> 53160 bytes docs/桃夭.jpg | Bin 0 -> 113910 bytes .../boot/config/BootAutoConfiguration.java | 3 + .../media/process/AggregateProcessor.java | 10 --- .../taoyao/media/process/Processor.java | 5 -- .../taoyao/media/process/ProcessorChain.java | 5 -- .../media/process/audio/DenoiseProcessor.java | 10 --- .../media/process/audio/MixProcessor.java | 10 --- .../media/process/audio/WhineProcessor.java | 10 --- .../media/process/video/BeautyHandler.java | 10 --- .../media/process/video/MarkHandler.java | 10 --- .../media/process/video/WatermarkHandler.java | 10 --- .../processor/MediaAggregateProcessor.java | 5 ++ .../processor/MediaParallelProcessor.java | 10 +++ .../media/processor/MediaRecordProcessor.java | 5 ++ .../audio/MediaDenoiseProcessor.java | 10 +++ .../processor/audio/MediaMixProcessor.java | 10 +++ .../processor/audio/MediaWhineProcessor.java | 10 +++ .../processor/video/MediaBeautyProcessor.java | 10 +++ .../processor/video/MediaMarkHandler.java | 10 +++ .../video/MediaWatermarkHandler.java | 10 +++ .../listener/MeetingCreateListener.java | 4 +- .../listener/MeetingEnterListener.java | 4 +- .../src/main/resources/application.yml | 2 +- .../resources/static/javascript/taoyao.js | 47 ++++++----- taoyao-signal/README.md | 25 +++--- .../signal/client/ClientSessionStatus.java | 5 ++ .../signal/event/ApplicationEventAdapter.java | 11 ++- .../event/client/ClientRegisterEvent.java | 4 +- .../event/media/MediaSubscribeEvent.java | 27 +++++++ .../event/meeting/MeetingCreateEvent.java | 9 ++- .../event/meeting/MeetingEnterEvent.java | 9 ++- .../signal/event/platform/ScriptEvent.java | 9 ++- .../listener/client/ClientCloseListener.java | 8 +- .../client/ClientRegisterListener.java | 15 ++-- .../listener/platform/ScriptListener.java | 3 +- ...erManager.java => MediaRouterManager.java} | 8 +- .../{Processor.java => MediaProcessor.java} | 4 +- .../media/processor/ProcessorChain.java | 5 ++ .../signal/media/router/MediaMixRouter.java | 5 ++ .../signal/media/router/MediaRouter.java | 26 ++++++ .../taoyao/signal/media/router/Router.java | 16 ---- ...entMediaHandler.java => MediaHandler.java} | 2 +- ...ediaPublisher.java => MediaPublisher.java} | 10 +-- ...lientMediaStream.java => MediaStream.java} | 2 +- ...amAdapter.java => MediaStreamAdapter.java} | 2 +- ...iaSubscriber.java => MediaSubscriber.java} | 4 +- .../client/ClientHeartbeatProtocol.java | 4 +- .../client/ClientRegisterProtocol.java | 2 +- .../media/MediaSubscribeProtocol.java | 25 +++++- .../meeting/MeetingCreateProtocol.java | 2 +- .../meeting/MeetingEnterProtocol.java | 2 +- .../protocol/platform/ScriptProtocol.java | 2 +- .../mesh/config/MeshAutoConfiguration.java | 25 ++++++ .../mesh/listener/MediaSubscribeListener.java | 18 +++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + 69 files changed, 629 insertions(+), 218 deletions(-) delete mode 100644 docs/flow/README.md delete mode 100644 docs/flow/WebRTC.png create mode 100644 docs/sequence/Client.iuml create mode 100644 docs/sequence/Client.png create mode 100644 docs/sequence/Live.iuml create mode 100644 docs/sequence/MCU.iuml create mode 100644 docs/sequence/Media.iuml create mode 100644 docs/sequence/Meeting.iuml create mode 100644 docs/sequence/Mesh.iuml create mode 100644 docs/sequence/SFU.iuml create mode 100644 docs/sequence/WebRTC.iuml create mode 100644 docs/sequence/WebRTC.png create mode 100644 docs/桃夭.jpg delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/AggregateProcessor.java delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/Processor.java delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/ProcessorChain.java delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/DenoiseProcessor.java delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/MixProcessor.java delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/WhineProcessor.java delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/BeautyHandler.java delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/MarkHandler.java delete mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/WatermarkHandler.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaAggregateProcessor.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaParallelProcessor.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaRecordProcessor.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaDenoiseProcessor.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaMixProcessor.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaWhineProcessor.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaBeautyProcessor.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaMarkHandler.java create mode 100644 taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaWatermarkHandler.java create mode 100644 taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaSubscribeEvent.java rename taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/{RouterManager.java => MediaRouterManager.java} (52%) rename taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/{Processor.java => MediaProcessor.java} (59%) create mode 100644 taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/ProcessorChain.java create mode 100644 taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaMixRouter.java create mode 100644 taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouter.java delete mode 100644 taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/Router.java rename taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/{ClientMediaHandler.java => MediaHandler.java} (92%) rename taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/{ClientMediaPublisher.java => MediaPublisher.java} (79%) rename taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/{ClientMediaStream.java => MediaStream.java} (96%) rename taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/{ClientMediaStreamAdapter.java => MediaStreamAdapter.java} (71%) rename taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/{ClientMediaSubscriber.java => MediaSubscriber.java} (86%) create mode 100644 taoyao-webrtc/taoyao-webrtc-mesh/src/main/java/com/acgist/taoyao/webrtc/mesh/config/MeshAutoConfiguration.java create mode 100644 taoyao-webrtc/taoyao-webrtc-mesh/src/main/java/com/acgist/taoyao/webrtc/mesh/listener/MediaSubscribeListener.java create mode 100644 taoyao-webrtc/taoyao-webrtc-mesh/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/README.md b/README.md index 96350eb..9d06d29 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,8 @@ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` +## 视频 + ## 直播 终端推流到服务端,由服务端分流。 diff --git a/docs/Deploy.md b/docs/Deploy.md index 42c85e9..b9ebfee 100644 --- a/docs/Deploy.md +++ b/docs/Deploy.md @@ -172,3 +172,4 @@ https://blog.csdn.net/ababab12345/article/details/115585378 https://blog.csdn.net/jisuanji111111/article/details/121634199 https://blog.csdn.net/weixin_48638578/article/details/120191152 https://blog.csdn.net/weixin_45565568/article/details/108929438 +https://lequ7.com/guan-yu-webrtc-yi-wen-xiang-jie-webrtc-ji-chu.html diff --git a/docs/flow/README.md b/docs/flow/README.md deleted file mode 100644 index c277ab8..0000000 --- a/docs/flow/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# 流程 - -## WebRTC流程 - -发起响应 - -## SFU流程 - -媒体流 - -## MCU流程 - -媒体流 - -## Mesh流程 - -媒体流 - -## 直播流程 - -创建直播,终端操作。 - -## 会议流程 - -创建会议,终端操作 - -## 终端流程 - -注册下线 - -## 媒体控制 - -拉流发布 diff --git a/docs/flow/WebRTC.png b/docs/flow/WebRTC.png deleted file mode 100644 index 555d2372ab60b2c9fef388b874b08964cf963889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59950 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 E0XZD_MgRZ+ diff --git a/docs/sequence/Client.iuml b/docs/sequence/Client.iuml new file mode 100644 index 0000000..55a4d83 --- /dev/null +++ b/docs/sequence/Client.iuml @@ -0,0 +1,36 @@ +@startuml + +title Client + +actor ClientA as ClientA +participant "Signal" as Signal +actor ClientB as ClientB +actor ClientC as ClientC + +autonumber + +ClientA -> Signal: 注册 +activate ClientA +activate Signal +Signal --> ClientA: 注册成功 +Signal -> ClientA: 下发配置 +Signal -> ClientB: ClientA上线 +Signal -> ClientC: ClientA上线 +loop 直到关闭 + ClientA -> Signal: 心跳 + Signal --> ClientA: 心跳 +end +deactivate Signal +deactivate ClientA + +ClientA -> Signal: 关闭 +activate Signal +activate ClientA +Signal -> ClientA: 关闭ClientA通道 +deactivate ClientA +Signal -> ClientB: ClientA下线 +Signal -> ClientC: ClientA下线 +Signal -> Signal: 释放ClientA资源(直播、会议、媒体) +deactivate Signal + +@enduml \ No newline at end of file diff --git a/docs/sequence/Client.png b/docs/sequence/Client.png new file mode 100644 index 0000000000000000000000000000000000000000..d50cf92e7d1d1d4dccebe89e0d9f80d2bd72592c GIT binary patch literal 23107 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 Signal: 进入房间 +activate ClientA +activate Signal +Signal -> ClientB: ClientA进入房间 +activate ClientB +ClientB -> Signal: 订阅ClientA +Signal -> ClientA: ClientB订阅ClientA +ClientA -> Signal: ClientA发布ClientB +Signal -> ClientB: ClientA发布 +deactivate ClientB +Signal -> ClientC: ClientA进入房间 +activate ClientC +ClientC -> Signal: 订阅ClientA +Signal -> ClientA: ClientC订阅ClientA +ClientA -> Signal: ClientA发布ClientC +Signal -> ClientC: ClientA发布 +deactivate ClientC +deactivate Signal +deactivate ClientA + +@enduml \ No newline at end of file diff --git a/docs/sequence/MCU.iuml b/docs/sequence/MCU.iuml new file mode 100644 index 0000000..2138d47 --- /dev/null +++ b/docs/sequence/MCU.iuml @@ -0,0 +1,32 @@ +@startuml + +title WebRTC-Mesh + +actor ClientA as ClientA +participant "Signal" as Signal +actor ClientB as ClientB +actor ClientC as ClientC + +autonumber + +ClientA -> Signal: 进入房间 +activate ClientA +activate Signal +Signal -> ClientB: ClientA进入房间 +activate ClientB +ClientB -> Signal: 订阅ClientA +Signal -> ClientA: ClientB订阅ClientA +ClientA -> Signal: ClientA发布ClientB +Signal -> ClientB: ClientA发布 +deactivate ClientB +Signal -> ClientC: ClientA进入房间 +activate ClientC +ClientC -> Signal: 订阅ClientA +Signal -> ClientA: ClientC订阅ClientA +ClientA -> Signal: ClientA发布ClientC +Signal -> ClientC: ClientA发布 +deactivate ClientC +deactivate Signal +deactivate ClientA + +@enduml \ No newline at end of file diff --git a/docs/sequence/Media.iuml b/docs/sequence/Media.iuml new file mode 100644 index 0000000..2138d47 --- /dev/null +++ b/docs/sequence/Media.iuml @@ -0,0 +1,32 @@ +@startuml + +title WebRTC-Mesh + +actor ClientA as ClientA +participant "Signal" as Signal +actor ClientB as ClientB +actor ClientC as ClientC + +autonumber + +ClientA -> Signal: 进入房间 +activate ClientA +activate Signal +Signal -> ClientB: ClientA进入房间 +activate ClientB +ClientB -> Signal: 订阅ClientA +Signal -> ClientA: ClientB订阅ClientA +ClientA -> Signal: ClientA发布ClientB +Signal -> ClientB: ClientA发布 +deactivate ClientB +Signal -> ClientC: ClientA进入房间 +activate ClientC +ClientC -> Signal: 订阅ClientA +Signal -> ClientA: ClientC订阅ClientA +ClientA -> Signal: ClientA发布ClientC +Signal -> ClientC: ClientA发布 +deactivate ClientC +deactivate Signal +deactivate ClientA + +@enduml \ No newline at end of file diff --git a/docs/sequence/Meeting.iuml b/docs/sequence/Meeting.iuml new file mode 100644 index 0000000..556c90c --- /dev/null +++ b/docs/sequence/Meeting.iuml @@ -0,0 +1,29 @@ +@startuml + +title Meeting + +actor ClientA as ClientA +participant "Signal" as Signal +participant "Media" as Media +actor ClientB as ClientB +actor ClientC as ClientC + +autonumber + +ClientA -> Signal: 创建会议 +activate Signal +activate ClientA +Signal -> ClientA: 创建会议 +deactivate ClientA +Signal -> ClientB: 创建会议 +Signal -> ClientC: 创建会议 +deactivate Signal + +ClientA -> Signal: 进入会议 +activate Signal +Signal -> ClientB: ClientA进入会议 +Signal -> ClientC: ClientA进入会议 +deactivate Signal + + +@enduml \ No newline at end of file diff --git a/docs/sequence/Mesh.iuml b/docs/sequence/Mesh.iuml new file mode 100644 index 0000000..dec8a79 --- /dev/null +++ b/docs/sequence/Mesh.iuml @@ -0,0 +1,34 @@ +@startuml + +title WebRTC-Mesh + +actor ClientA as ClientA +participant "Signal" as Signal +actor ClientB as ClientB +actor ClientC as ClientC + +autonumber + +ClientA -> Signal: 进入房间 + +activate ClientA +activate Signal +Signal -> ClientB: ClientA进入房间 +activate ClientB +ClientB -> Signal: 订阅ClientA +Signal -> ClientA: ClientB订阅ClientA +ClientA --> Signal: ClientA发布ClientB +Signal --> ClientB: ClientA发布 +deactivate ClientB + +Signal -> ClientC: ClientA进入房间 +activate ClientC +ClientC -> Signal: 订阅ClientA +Signal -> ClientA: ClientC订阅ClientA +ClientA --> Signal: ClientA发布ClientC +Signal --> ClientC: ClientA发布 +deactivate ClientC +deactivate Signal +deactivate ClientA + +@enduml \ No newline at end of file diff --git a/docs/sequence/SFU.iuml b/docs/sequence/SFU.iuml new file mode 100644 index 0000000..2138d47 --- /dev/null +++ b/docs/sequence/SFU.iuml @@ -0,0 +1,32 @@ +@startuml + +title WebRTC-Mesh + +actor ClientA as ClientA +participant "Signal" as Signal +actor ClientB as ClientB +actor ClientC as ClientC + +autonumber + +ClientA -> Signal: 进入房间 +activate ClientA +activate Signal +Signal -> ClientB: ClientA进入房间 +activate ClientB +ClientB -> Signal: 订阅ClientA +Signal -> ClientA: ClientB订阅ClientA +ClientA -> Signal: ClientA发布ClientB +Signal -> ClientB: ClientA发布 +deactivate ClientB +Signal -> ClientC: ClientA进入房间 +activate ClientC +ClientC -> Signal: 订阅ClientA +Signal -> ClientA: ClientC订阅ClientA +ClientA -> Signal: ClientA发布ClientC +Signal -> ClientC: ClientA发布 +deactivate ClientC +deactivate Signal +deactivate ClientA + +@enduml \ No newline at end of file diff --git a/docs/sequence/WebRTC.iuml b/docs/sequence/WebRTC.iuml new file mode 100644 index 0000000..7c3c605 --- /dev/null +++ b/docs/sequence/WebRTC.iuml @@ -0,0 +1,74 @@ +@startuml + +title WebRTC + +actor ClientA as ClientA +participant "Signal" as Signal +participant "Stun" as Stun +actor ClientB as ClientB + +autonumber + +ClientA -> Signal: Connect +activate Signal +ClientB -> Signal: Connect +deactivate Signal + +ClientA -> ClientA: new PeerConnection +activate ClientA +ClientA -> ClientA: addStream +deactivate ClientA + +ClientB -> ClientB: new PeerConnection +activate ClientB +ClientB -> ClientB: addStream +deactivate ClientB + +ClientA -> ClientA: createOffer & setLocalDescription +activate ClientA +ClientA -> Signal: Send Offer SDP +activate Signal +Signal -> ClientB: Relay Offer SDP +activate ClientB +ClientB -> ClientB: setRemoteDescription +ClientB -> ClientB: createAnswer & setLocalDescription +ClientB --> Signal: Send Answer SDP +deactivate ClientB +Signal --> ClientA: Relay Answer SDP +deactivate Signal +ClientA -> ClientA: setRemoteDescription +deactivate ClientA + +ClientA -> Stun: ICE Request +activate ClientA +activate Stun +Stun --> ClientA: onicecandidate +deactivate Stun +ClientA -> Signal: Send ICE Candidate +activate Signal +Signal -> ClientB: Relay ICE Candidate +activate ClientB +ClientB -> ClientB: addIceCandidate +ClientB -> Stun: ICE Request +activate Stun +Stun --> ClientB: onicecandidate +deactivate Stun +ClientB--> Signal: Send ICE Candidate +deactivate ClientB +Signal --> ClientA: Relay ICE Candidate +deactivate Signal +ClientA -> ClientA: addIceCandidate +deactivate ClientA + +ClientA <-> ClientB: Media +activate ClientA +activate ClientB +ClientA -> ClientA: onaddstream +ClientB -> ClientB: onaddstream +ClientA -> ClientA: onremovestream +ClientB -> ClientB: onremovestream +ClientA <-> ClientB: Media +deactivate ClientA +deactivate ClientB + +@enduml \ No newline at end of file diff --git a/docs/sequence/WebRTC.png b/docs/sequence/WebRTC.png new file mode 100644 index 0000000000000000000000000000000000000000..b286c56a11a7d77229b2126eb0a600c0e882795a GIT binary patch literal 53160 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 literal 0 HcmV?d00001 diff --git a/docs/桃夭.jpg b/docs/桃夭.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82fee6dd3c844e34161b94a5dae80c7adedc2e0b GIT binary patch literal 113910 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 NY3uLL(6qkve*j&jz)JuC literal 0 HcmV?d00001 diff --git a/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java b/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java index 75b119b..9421642 100644 --- a/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java +++ b/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java @@ -77,6 +77,8 @@ public class BootAutoConfiguration { @Value("${spring.application.name:taoyao}") private String name; + @Value("${taoyao.webrtc.model:SFU}") + private String model; @Autowired private ApplicationContext context; @@ -160,6 +162,7 @@ public class BootAutoConfiguration { this.context.getBeansOfType(TaskScheduler.class).forEach((k, v) -> { log.info("系统定时任务线程池:{}-{}", k, v); }); + log.info("WebRTC架构:{}", this.model); this.registerException(); } diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/AggregateProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/AggregateProcessor.java deleted file mode 100644 index 45a2b6f..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/AggregateProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.process; - -/** - * 责任链模式 - * - * @author acgist - */ -public class AggregateProcessor { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/Processor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/Processor.java deleted file mode 100644 index 49cf274..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/Processor.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.media.process; - -public class Processor { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/ProcessorChain.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/ProcessorChain.java deleted file mode 100644 index 3fbc6df..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/ProcessorChain.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.acgist.taoyao.media.process; - -public class ProcessorChain { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/DenoiseProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/DenoiseProcessor.java deleted file mode 100644 index 1e4e628..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/DenoiseProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.process.audio; - -/** - * 降噪 - * - * @author acgist - */ -public class DenoiseProcessor { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/MixProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/MixProcessor.java deleted file mode 100644 index 1234729..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/MixProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.process.audio; - -/** - * 混音 - * - * @author acgist - */ -public class MixProcessor { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/WhineProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/WhineProcessor.java deleted file mode 100644 index 466282d..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/audio/WhineProcessor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.process.audio; - -/** - * 变声器 - * - * @author acgist - */ -public class WhineProcessor { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/BeautyHandler.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/BeautyHandler.java deleted file mode 100644 index 670d8f1..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/BeautyHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.process.video; - -/** - * 美颜 - * - * @author acgist - */ -public class BeautyHandler { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/MarkHandler.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/MarkHandler.java deleted file mode 100644 index 0812121..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/MarkHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.process.video; - -/** - * AI识别 - * - * @author acgist - */ -public class MarkHandler { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/WatermarkHandler.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/WatermarkHandler.java deleted file mode 100644 index c6914b1..0000000 --- a/taoyao-media/src/main/java/com/acgist/taoyao/media/process/video/WatermarkHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.acgist.taoyao.media.process.video; - -/** - * 水印 - * - * @author acgist - */ -public class WatermarkHandler { - -} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaAggregateProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaAggregateProcessor.java new file mode 100644 index 0000000..6b0e1cc --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaAggregateProcessor.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.media.processor; + +public class MediaAggregateProcessor { + +} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaParallelProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaParallelProcessor.java new file mode 100644 index 0000000..71e35a5 --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaParallelProcessor.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.media.processor; + +/** + * 并行媒体处理器 + * + * @author acgist + */ +public class MediaParallelProcessor { + +} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaRecordProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaRecordProcessor.java new file mode 100644 index 0000000..7868119 --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/MediaRecordProcessor.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.media.processor; + +public class MediaRecordProcessor { + +} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaDenoiseProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaDenoiseProcessor.java new file mode 100644 index 0000000..9c92d46 --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaDenoiseProcessor.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.media.processor.audio; + +/** + * 降噪 + * + * @author acgist + */ +public class MediaDenoiseProcessor { + +} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaMixProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaMixProcessor.java new file mode 100644 index 0000000..888535d --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaMixProcessor.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.media.processor.audio; + +/** + * 混音 + * + * @author acgist + */ +public class MediaMixProcessor { + +} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaWhineProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaWhineProcessor.java new file mode 100644 index 0000000..dd6cb5a --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/audio/MediaWhineProcessor.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.media.processor.audio; + +/** + * 变声器 + * + * @author acgist + */ +public class MediaWhineProcessor { + +} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaBeautyProcessor.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaBeautyProcessor.java new file mode 100644 index 0000000..03cce09 --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaBeautyProcessor.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.media.processor.video; + +/** + * 美颜 + * + * @author acgist + */ +public class MediaBeautyProcessor { + +} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaMarkHandler.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaMarkHandler.java new file mode 100644 index 0000000..2f0624b --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaMarkHandler.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.media.processor.video; + +/** + * AI识别 + * + * @author acgist + */ +public class MediaMarkHandler { + +} diff --git a/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaWatermarkHandler.java b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaWatermarkHandler.java new file mode 100644 index 0000000..6a3410f --- /dev/null +++ b/taoyao-media/src/main/java/com/acgist/taoyao/media/processor/video/MediaWatermarkHandler.java @@ -0,0 +1,10 @@ +package com.acgist.taoyao.media.processor.video; + +/** + * 水印 + * + * @author acgist + */ +public class MediaWatermarkHandler { + +} diff --git a/taoyao-meeting/src/main/java/com/acgist/taoyao/meeting/listener/MeetingCreateListener.java b/taoyao-meeting/src/main/java/com/acgist/taoyao/meeting/listener/MeetingCreateListener.java index 1a6a1a3..1622552 100644 --- a/taoyao-meeting/src/main/java/com/acgist/taoyao/meeting/listener/MeetingCreateListener.java +++ b/taoyao-meeting/src/main/java/com/acgist/taoyao/meeting/listener/MeetingCreateListener.java @@ -8,7 +8,6 @@ import org.springframework.stereotype.Component; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.meeting.Meeting; import com.acgist.taoyao.meeting.MeetingManager; -import com.acgist.taoyao.signal.client.ClientSession; import com.acgist.taoyao.signal.event.meeting.MeetingCreateEvent; import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter; @@ -25,8 +24,7 @@ public class MeetingCreateListener extends ApplicationListenerAdapter body = event.getBody(); - final ClientSession session = event.getSession(); - final String sn = session.sn(); final String id = (String) body.get("id"); final Meeting meeting = this.meetingManager.meeting(id); meeting.addSn(sn); diff --git a/taoyao-server/src/main/resources/application.yml b/taoyao-server/src/main/resources/application.yml index 05f0078..7409c9a 100644 --- a/taoyao-server/src/main/resources/application.yml +++ b/taoyao-server/src/main/resources/application.yml @@ -69,7 +69,7 @@ taoyao: quality: high|standard|quick # WebRTC配置 webrtc: - model: SFU + model: MESH framework: JITSI stun: - stun:stun1.l.google.com:19302 diff --git a/taoyao-server/src/main/resources/static/javascript/taoyao.js b/taoyao-server/src/main/resources/static/javascript/taoyao.js index 6f30618..8a89d4e 100644 --- a/taoyao-server/src/main/resources/static/javascript/taoyao.js +++ b/taoyao-server/src/main/resources/static/javascript/taoyao.js @@ -5,14 +5,14 @@ const RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnectio const defaultAudioConfig = { // 音量:0~1 volume: 0.5, + // 延迟大小(单位毫秒):500毫秒以内较好 + latency: 0.4, // 设备 // deviceId : '', // 采样率:8000|16000|32000|48000 sampleRate: 48000, // 采样数:16 sampleSize: 16, - // 延迟大小(单位毫秒):500毫秒以内较好 - latency: 0.4, // 声道数量:1|2 channelCount : 1, // 是否开启自动增益:true|false @@ -43,16 +43,14 @@ const defaultVideoConfig = { const defaultRPCConfig = { // ICE代理的服务器 // iceServers: null, - // 证书 - // certificates: null, // 传输通道绑定策略:balanced|max-compat|max-bundle bundlePolicy: 'balanced', // RTCP多路复用策略:require|negotiate - rtcpMuxPolicy: 'negotiate', + rtcpMuxPolicy: 'require', // ICE传输策略:all|relay iceTransportPolicy: 'all' // ICE候选个数 - // iceCandidatePoolSize: 10 + // iceCandidatePoolSize: 8 } /** 信令配置 */ const signalConfig = { @@ -305,9 +303,13 @@ function TaoyaoClient( this.sn = sn; /** 视频对象 */ this.video = null; + /** 媒体信息 */ + this.audioTrack = null; + this.videoTrack = null; /** 媒体状态 */ this.audioStatus = true; this.videoStatus = true; + /** 录制状态 */ this.recordStatus = false; /** 媒体信息 */ this.audioStreamId = null; @@ -350,11 +352,9 @@ function TaoyaoClient( }; /** 设置音频流 */ this.buildAudioStream = function() { - }; /** 设置视频流 */ this.buildVideoStream = function() { - }; } /** 桃夭 */ @@ -378,14 +378,20 @@ function Taoyao( this.push = null; /** 本地终端 */ this.localClient = null; + this.localMediaChannel = null; /** 远程终端 */ this.remoteClient = []; + this.remoteMediaChannel = null; /** 信令通道 */ this.signalChannel = null; /** 检查设备 */ this.checkDevice = function() { let self = this; - if(navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) { + if( + navigator.mediaDevices && + navigator.mediaDevices.getUserMedia && + navigator.mediaDevices.enumerateDevices + ) { navigator.mediaDevices.enumerateDevices() .then(list => { let audioDevice = false; @@ -418,6 +424,8 @@ function Taoyao( self.videoEnabled = false; self.videoEnabled = false; }); + } else { + throw new Error('不支持的终端设备'); } return this; }; @@ -451,21 +459,12 @@ function Taoyao( console.debug('打开终端媒体', this.audioConfig, this.videoConfig); let self = this; return new Promise((resolve, reject) => { - if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { - navigator.mediaDevices.getUserMedia({ - audio: self.audioConfig, - video: self.videoConfig - }) - .then(resolve) - .catch(reject); - } else if(navigator.getUserMedia) { - navigator.getUserMedia({ - audio: self.audioConfig, - video: self.videoConfig - }, resolve, reject); - } else { - reject('打开本地媒体失败'); - } + navigator.mediaDevices.getUserMedia({ + audio: self.audioConfig, + video: self.videoConfig + }) + .then(resolve) + .catch(reject); }); }; /** 设置本地终端 */ diff --git a/taoyao-signal/README.md b/taoyao-signal/README.md index 4760381..2b19fe6 100644 --- a/taoyao-signal/README.md +++ b/taoyao-signal/README.md @@ -345,6 +345,8 @@ ### 发布信令(5000) +Offer/Answer + 控制终端推流(服务端拉流) ### 取消发布指令(5001) @@ -353,39 +355,38 @@ ### 订阅指令(5002) +Offer/Answer + 订阅终端媒体流(终端拉流) ### 取消订阅指令(5003) 取消订阅终端媒体流(终端取消拉流) -### 暂停指令(5004) +### 候选信令(5004) + +IceCandidate + +### 暂停信令(5004) 终端->服务端 暂停发布、订阅(不关媒体流通道) MCU/SFU模式有效 -### 恢复指令(5005) +### 恢复信令(5005) 终端->服务端 暂停发布、订阅(不关媒体流通道) MCU/SFU模式有效 -### 开启录像(5006) +### 开启录像信令(5006) -### 停止录像(5007) +### 停止录像信令(5007) -### 配置媒体(5008) +### 配置媒体信令(5008) 配置订阅媒体:码率、帧率、分辨率等等 - -### IceCandidate - -### Offer - -### Answer - ## 测试 ``` diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionStatus.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionStatus.java index 78abc41..d6a0fb3 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionStatus.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientSessionStatus.java @@ -18,6 +18,11 @@ import lombok.Setter; @Schema(title = "终端状态", description = "终端状态") public class ClientSessionStatus { + public static final String IP = "ip"; + public static final String MAC = "mac"; + public static final String SIGNAL = "signal"; + public static final String BATTERY = "battery"; + /** * 终端标识 */ diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java index 390b681..fc472e6 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java @@ -21,6 +21,10 @@ public abstract class ApplicationEventAdapter extends ApplicationEvent { private static final long serialVersionUID = 1L; + /** + * 终端标识 + */ + private String sn; /** * 主体 */ @@ -35,11 +39,16 @@ public abstract class ApplicationEventAdapter extends ApplicationEvent { private final ClientSession session; public ApplicationEventAdapter(Message message, ClientSession session) { - this(null, message, session); + this(session.sn(), null, message, session); } public ApplicationEventAdapter(Map body, Message message, ClientSession session) { + this(session.sn(), body, message, session); + } + + public ApplicationEventAdapter(String sn, Map body, Message message, ClientSession session) { super(session); + this.sn = sn; this.body = body; this.message = message; this.session = session; diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientRegisterEvent.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientRegisterEvent.java index d8a5af2..a70ebec 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientRegisterEvent.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/client/ClientRegisterEvent.java @@ -20,8 +20,8 @@ public class ClientRegisterEvent extends ApplicationEventAdapter { private static final long serialVersionUID = 1L; - public ClientRegisterEvent(Map body, Message message, ClientSession session) { - super(body, message, session); + public ClientRegisterEvent(String sn, Map body, Message message, ClientSession session) { + super(sn, body, message, session); } } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaSubscribeEvent.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaSubscribeEvent.java new file mode 100644 index 0000000..f88c9a8 --- /dev/null +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/media/MediaSubscribeEvent.java @@ -0,0 +1,27 @@ +package com.acgist.taoyao.signal.event.media; + +import java.util.Map; + +import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.client.ClientSession; +import com.acgist.taoyao.signal.event.ApplicationEventAdapter; + +import lombok.Getter; +import lombok.Setter; + +/** + * 订阅事件 + * + * @author acgist + */ +@Getter +@Setter +public class MediaSubscribeEvent extends ApplicationEventAdapter { + + private static final long serialVersionUID = 1L; + + public MediaSubscribeEvent(String sn, Map body, Message message, ClientSession session) { + super(sn, body, message, session); + } + +} diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingCreateEvent.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingCreateEvent.java index eb1ecf5..82949e1 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingCreateEvent.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingCreateEvent.java @@ -6,17 +6,22 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.client.ClientSession; import com.acgist.taoyao.signal.event.ApplicationEventAdapter; +import lombok.Getter; +import lombok.Setter; + /** * 创建会议事件 * * @author acgist */ +@Getter +@Setter public class MeetingCreateEvent extends ApplicationEventAdapter { private static final long serialVersionUID = 1L; - public MeetingCreateEvent(Map body, Message message, ClientSession session) { - super(body, message, session); + public MeetingCreateEvent(String sn, Map body, Message message, ClientSession session) { + super(sn, body, message, session); } } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingEnterEvent.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingEnterEvent.java index 570d636..7ce5df1 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingEnterEvent.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingEnterEvent.java @@ -6,17 +6,22 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.client.ClientSession; import com.acgist.taoyao.signal.event.ApplicationEventAdapter; +import lombok.Getter; +import lombok.Setter; + /** * 进入会议事件 * * @author acgist */ +@Getter +@Setter public class MeetingEnterEvent extends ApplicationEventAdapter { private static final long serialVersionUID = 1L; - public MeetingEnterEvent(Map body, Message message, ClientSession session) { - super(body, message, session); + public MeetingEnterEvent(String sn, Map body, Message message, ClientSession session) { + super(sn, body, message, session); } } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ScriptEvent.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ScriptEvent.java index 0c5f448..7521508 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ScriptEvent.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/platform/ScriptEvent.java @@ -6,17 +6,22 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.client.ClientSession; import com.acgist.taoyao.signal.event.ApplicationEventAdapter; +import lombok.Getter; +import lombok.Setter; + /** * 执行命令事件 * * @author acgist */ +@Getter +@Setter public class ScriptEvent extends ApplicationEventAdapter { private static final long serialVersionUID = 1L; - public ScriptEvent(Map body, Message message, ClientSession session) { - super(body, message, session); + public ScriptEvent(String sn, Map body, Message message, ClientSession session) { + super(sn, body, message, session); } } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java index 893c596..47cbe24 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java @@ -2,7 +2,6 @@ package com.acgist.taoyao.signal.listener.client; import java.util.Map; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -29,11 +28,11 @@ public class ClientCloseListener extends ApplicationListenerAdapter body = event.getBody(); final ClientSession session = event.getSession(); if (!session.authorized()) { return; } + final String sn = event.getSn(); + final Map body = event.getBody(); // 下发配置 session.push(this.configProtocol.build()); // 修改终端状态 final ClientSessionStatus status = session.status(); - status.setSn(session.sn()); - status.setIp((String) body.get("ip")); - status.setMac((String) body.get("mac")); - status.setSignal((Integer) body.get("signal")); - status.setBattery((Integer) body.get("battery")); + status.setSn(sn); + status.setIp((String) body.get(ClientSessionStatus.IP)); + status.setMac((String) body.get(ClientSessionStatus.MAC)); + status.setSignal((Integer) body.get(ClientSessionStatus.SIGNAL)); + status.setBattery((Integer) body.get(ClientSessionStatus.BATTERY)); // 广播上线事件 this.clientSessionManager.broadcast( - session.sn(), + sn, this.onlineProtocol.build(status) ); } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/ScriptListener.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/ScriptListener.java index 5259161..02007e3 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/ScriptListener.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/platform/ScriptListener.java @@ -24,11 +24,12 @@ public class ScriptListener extends ApplicationListenerAdapter { @Async @Override public void onApplicationEvent(ScriptEvent event) { + final String sn = event.getSn(); final Message message = event.getMessage(); final ClientSession session = event.getSession(); final Map body = event.getBody(); final String script = (String) body.get("script"); - log.debug("执行命令:{}", script); + log.debug("执行命令:{}-{}", sn, script); final String result = this.execute(script); message.setBody(Map.of("result", result)); session.push(message); diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RouterManager.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaRouterManager.java similarity index 52% rename from taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RouterManager.java rename to taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaRouterManager.java index 2174009..7cf0954 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RouterManager.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaRouterManager.java @@ -2,15 +2,15 @@ package com.acgist.taoyao.signal.media; import java.util.List; -import com.acgist.taoyao.signal.media.router.Router; +import com.acgist.taoyao.signal.media.router.MediaRouter; -public interface RouterManager { +public interface MediaRouterManager { void bindId(); - List from(); + List from(); - List to(); + List to(); void fromRouteTo(String from, String to); diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/Processor.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaProcessor.java similarity index 59% rename from taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/Processor.java rename to taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaProcessor.java index d2ca90a..8a191b3 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/Processor.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/MediaProcessor.java @@ -1,12 +1,12 @@ package com.acgist.taoyao.signal.media.processor; /** - * 媒体处理:混音、美颜等等 + * 媒体流处理器:混音、美颜等等 * * 处理完成发送订阅者 * * @author acgist */ -public interface Processor { +public interface MediaProcessor { } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/ProcessorChain.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/ProcessorChain.java new file mode 100644 index 0000000..df93a3c --- /dev/null +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/processor/ProcessorChain.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.media.processor; + +public class ProcessorChain { + +} diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaMixRouter.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaMixRouter.java new file mode 100644 index 0000000..b612af1 --- /dev/null +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaMixRouter.java @@ -0,0 +1,5 @@ +package com.acgist.taoyao.signal.media.router; + +public class MediaMixRouter { + +} diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouter.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouter.java new file mode 100644 index 0000000..38e2a03 --- /dev/null +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/MediaRouter.java @@ -0,0 +1,26 @@ +package com.acgist.taoyao.signal.media.router; + +/** + * 媒体流路由器 + * + * 发布者->订阅者 + * + * @author acgist + */ +public interface MediaRouter { + + void from(); + + void to(); + + void publisher(); + + void subscriber(); + + void stream(String fromOrTo); + + void streamFrom(String from); + + void streamTo(String to); + +} diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/Router.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/Router.java deleted file mode 100644 index de9e2e6..0000000 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/router/Router.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.acgist.taoyao.signal.media.router; - -/** - * 直播会议路由绑定 - * - * 发布者->订阅者 - * - * @author acgist - */ -public interface Router { - - void from(); - - void to(); - -} diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaHandler.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandler.java similarity index 92% rename from taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaHandler.java rename to taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandler.java index 450f8a6..c96f957 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaHandler.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaHandler.java @@ -7,7 +7,7 @@ package com.acgist.taoyao.signal.media.stream; * * @author acgist */ -public interface ClientMediaHandler { +public interface MediaHandler { /** * 打开 diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaPublisher.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaPublisher.java similarity index 79% rename from taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaPublisher.java rename to taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaPublisher.java index 1d0feca..8bfd8e8 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaPublisher.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaPublisher.java @@ -9,17 +9,15 @@ import lombok.extern.slf4j.Slf4j; /** * 终端媒体流发布者(终端推流) * - * 通过处理器发送给订阅者 - * * @author acgist */ @Slf4j -public class ClientMediaPublisher implements ClientMediaHandler { +public class MediaPublisher implements MediaHandler { /** * 发布终端媒体流 */ - private Map streams = new ConcurrentHashMap<>(); + private Map streams = new ConcurrentHashMap<>(); /** * 发布 @@ -57,7 +55,7 @@ public class ClientMediaPublisher implements ClientMediaHandler { @Override public void resume(String id) { - final ClientMediaStream stream = this.streams.get(id); + final MediaStream stream = this.streams.get(id); if(stream != null) { try { stream.resume(); @@ -69,7 +67,7 @@ public class ClientMediaPublisher implements ClientMediaHandler { @Override public void close(String id) { - final ClientMediaStream stream = this.streams.get(id); + final MediaStream stream = this.streams.get(id); try { stream.close(); } catch (IOException e) { diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaStream.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStream.java similarity index 96% rename from taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaStream.java rename to taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStream.java index 8ec5de7..b9407d7 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaStream.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStream.java @@ -7,7 +7,7 @@ import java.io.IOException; * * @author acgist */ -public interface ClientMediaStream { +public interface MediaStream { /** * 终端媒体类型 diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaStreamAdapter.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStreamAdapter.java similarity index 71% rename from taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaStreamAdapter.java rename to taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStreamAdapter.java index c3f63e4..62917d6 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaStreamAdapter.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaStreamAdapter.java @@ -5,7 +5,7 @@ package com.acgist.taoyao.signal.media.stream; * * @author acgist */ -public abstract class ClientMediaStreamAdapter implements ClientMediaStream { +public abstract class MediaStreamAdapter implements MediaStream { /** * 媒体标识 diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaSubscriber.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaSubscriber.java similarity index 86% rename from taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaSubscriber.java rename to taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaSubscriber.java index ed89d4d..549e91f 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/ClientMediaSubscriber.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/stream/MediaSubscriber.java @@ -8,12 +8,12 @@ import java.util.concurrent.CopyOnWriteArrayList; * * @author acgist */ -public class ClientMediaSubscriber implements ClientMediaHandler { +public class MediaSubscriber implements MediaHandler { /** * 订阅终端媒体流 */ - private List streams = new CopyOnWriteArrayList<>(); + private List streams = new CopyOnWriteArrayList<>(); /** * 订阅 diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java index 8d5aa8c..c3d6e71 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientHeartbeatProtocol.java @@ -30,8 +30,8 @@ public class ClientHeartbeatProtocol extends ProtocolMapAdapter { session.push(message.cloneWidthoutBody()); // 设置状态 final ClientSessionStatus status = session.status(); - status.setSignal((Integer) body.get("signal")); - status.setBattery((Integer) body.get("battery")); + status.setSignal((Integer) body.get(ClientSessionStatus.SIGNAL)); + status.setBattery((Integer) body.get(ClientSessionStatus.BATTERY)); status.setLastHeartbeat(LocalDateTime.now()); } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java index 714760f..6957b82 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java @@ -48,7 +48,7 @@ public class ClientRegisterProtocol extends ProtocolMapAdapter { // 推送消息 session.push(message.cloneWidthoutBody()); // 发送事件 - this.publishEvent(new ClientRegisterEvent(body, message, session)); + this.publishEvent(new ClientRegisterEvent(sn, body, message, session)); } } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaSubscribeProtocol.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaSubscribeProtocol.java index a20fe2e..eb5beb0 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaSubscribeProtocol.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaSubscribeProtocol.java @@ -1,5 +1,28 @@ package com.acgist.taoyao.signal.protocol.media; -public class MediaSubscribeProtocol { +import java.util.Map; + +import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.client.ClientSession; +import com.acgist.taoyao.signal.event.media.MediaSubscribeEvent; +import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter; + +/** + * 订阅指令 + * + * @author acgist + */ +public class MediaSubscribeProtocol extends ProtocolMapAdapter { + + public static final Integer PID = 5002; + + public MediaSubscribeProtocol() { + super(PID, "订阅指令"); + } + + @Override + public void execute(String sn, Map body, Message message, ClientSession session) { + this.publishEvent(new MediaSubscribeEvent(sn, body, message, session)); + } } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCreateProtocol.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCreateProtocol.java index 4989702..e6b5aae 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCreateProtocol.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCreateProtocol.java @@ -25,7 +25,7 @@ public class MeetingCreateProtocol extends ProtocolMapAdapter { @Override public void execute(String sn, Map body, Message message, ClientSession session) { - this.publishEvent(new MeetingCreateEvent(body, message, session)); + this.publishEvent(new MeetingCreateEvent(sn, body, message, session)); } } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingEnterProtocol.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingEnterProtocol.java index 9602e44..ba46985 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingEnterProtocol.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingEnterProtocol.java @@ -25,7 +25,7 @@ public class MeetingEnterProtocol extends ProtocolMapAdapter { @Override public void execute(String sn, Map body, Message message, ClientSession session) { - this.publishEvent(new MeetingEnterEvent(body, message, session)); + this.publishEvent(new MeetingEnterEvent(sn, body, message, session)); } } diff --git a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ScriptProtocol.java b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ScriptProtocol.java index 2d8d9cc..4de3e66 100644 --- a/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ScriptProtocol.java +++ b/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/ScriptProtocol.java @@ -22,7 +22,7 @@ public class ScriptProtocol extends ProtocolMapAdapter { @Override public void execute(String sn, Map body, Message message, ClientSession session) { - this.publishEvent(new ScriptEvent(body, message, session)); + this.publishEvent(new ScriptEvent(sn, body, message, session)); } } diff --git a/taoyao-webrtc/taoyao-webrtc-mesh/src/main/java/com/acgist/taoyao/webrtc/mesh/config/MeshAutoConfiguration.java b/taoyao-webrtc/taoyao-webrtc-mesh/src/main/java/com/acgist/taoyao/webrtc/mesh/config/MeshAutoConfiguration.java new file mode 100644 index 0000000..a00d1f1 --- /dev/null +++ b/taoyao-webrtc/taoyao-webrtc-mesh/src/main/java/com/acgist/taoyao/webrtc/mesh/config/MeshAutoConfiguration.java @@ -0,0 +1,25 @@ +package com.acgist.taoyao.webrtc.mesh.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.acgist.taoyao.webrtc.mesh.listener.MediaSubscribeListener; + +/** + * Mesh自动配置 + * + * @author acgist + */ +@Configuration +@ConditionalOnProperty(prefix = "taoyao.webrtc", name = "model", havingValue = "MESH", matchIfMissing = false) +public class MeshAutoConfiguration { + + @Bean + @ConditionalOnMissingBean + public MediaSubscribeListener mediaSubscribeListener() { + return new MediaSubscribeListener(); + } + +} diff --git a/taoyao-webrtc/taoyao-webrtc-mesh/src/main/java/com/acgist/taoyao/webrtc/mesh/listener/MediaSubscribeListener.java b/taoyao-webrtc/taoyao-webrtc-mesh/src/main/java/com/acgist/taoyao/webrtc/mesh/listener/MediaSubscribeListener.java new file mode 100644 index 0000000..a884220 --- /dev/null +++ b/taoyao-webrtc/taoyao-webrtc-mesh/src/main/java/com/acgist/taoyao/webrtc/mesh/listener/MediaSubscribeListener.java @@ -0,0 +1,18 @@ +package com.acgist.taoyao.webrtc.mesh.listener; + +import com.acgist.taoyao.signal.event.media.MediaSubscribeEvent; +import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter; + +/** + * 媒体订阅监听 + * + * @author acgist + */ +public class MediaSubscribeListener extends ApplicationListenerAdapter { + + @Override + public void onApplicationEvent(MediaSubscribeEvent event) { + + } + +} diff --git a/taoyao-webrtc/taoyao-webrtc-mesh/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/taoyao-webrtc/taoyao-webrtc-mesh/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..65458e5 --- /dev/null +++ b/taoyao-webrtc/taoyao-webrtc-mesh/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.acgist.taoyao.webrtc.mesh.config.MeshAutoConfiguration \ No newline at end of file