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 555d237..0000000 Binary files a/docs/flow/WebRTC.png and /dev/null differ 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 0000000..d50cf92 Binary files /dev/null and b/docs/sequence/Client.png differ diff --git a/docs/sequence/Live.iuml b/docs/sequence/Live.iuml new file mode 100644 index 0000000..2138d47 --- /dev/null +++ b/docs/sequence/Live.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/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 0000000..b286c56 Binary files /dev/null and b/docs/sequence/WebRTC.png differ diff --git a/docs/桃夭.jpg b/docs/桃夭.jpg new file mode 100644 index 0000000..82fee6d Binary files /dev/null and b/docs/桃夭.jpg differ 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