diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js index 878d821..80c7b55 100644 --- a/taoyao-client-web/src/components/Taoyao.js +++ b/taoyao-client-web/src/components/Taoyao.js @@ -1969,15 +1969,6 @@ class Taoyao extends RemoteClient { })); } - /** - * 视频方向变化信令 - * - * @param {*} message 信令消息 - */ - defaultMediaVideoOrientationChange(message) { - console.debug("视频方向变化信令", message); - } - /** * 消费媒体信令 * @@ -2223,163 +2214,6 @@ class Taoyao extends RemoteClient { } } - /** - * 创建媒体发送通道 - */ - async createSendTransport() { - const me = this; - if ( - !me.dataProduce && - !me.audioProduce && - !me.videoProduce - ) { - console.debug("没有任何数据生产忽略创建媒体发送通道"); - return; - } - const response = await me.request(protocol.buildMessage("media::transport::webrtc::create", { - roomId : me.roomId, - forceTcp : me.forceTcp, - producing : true, - consuming : false, - sctpCapabilities: me.dataProduce ? me.mediasoupDevice.sctpCapabilities : undefined, - })); - const { - transportId, - iceCandidates, - iceParameters, - dtlsParameters, - sctpParameters, - } = response.body; - me.sendTransport = await me.mediasoupDevice.createSendTransport({ - id : transportId, - iceServers : [], - dtlsParameters : { - ...dtlsParameters, - role: "auto", - }, - proprietaryConstraints: { - optional: [{ - googDscp : true, - // googIPv6 : true, - // DtlsSrtpKeyAgreement: true, - }], - }, - iceCandidates, - iceParameters, - sctpParameters, - }); - me.sendTransport.on("connect", ({ - dtlsParameters - }, callback, errback) => { - me.request(protocol.buildMessage("media::transport::webrtc::connect", { - roomId : me.roomId, - transportId: me.sendTransport.id, - dtlsParameters, - })) - .then(callback) - .catch(errback); - }); - me.sendTransport.on("produce", ({ - kind, - appData, - rtpParameters - }, callback, errback) => { - me.request(protocol.buildMessage("media::produce", { - kind, - roomId: me.roomId, - appData, - transportId: me.sendTransport.id, - rtpParameters, - })) - .then((response) => { - const { streamId, producerId } = response.body; - callback({ - id: producerId - }); - }) - .catch(errback); - }); - me.sendTransport.on("producedata", ({ - label, - appData, - protocol, - sctpStreamParameters - }, callback, errback) => { - me.request(taoyaoProtocol.buildMessage("media::data::produce", { - roomId : me.roomId, - transportId: me.sendTransport.id, - label, - appData, - protocol, - sctpStreamParameters, - })) - .then((response) => { - const { treamId, producerId } = response.body; - callback({ - id: producerId - }); - }) - .catch(errback); - }); - } - - /** - * 创建媒体接收通道 - */ - async createRecvTransport() { - const me = this; - if ( - !me.dataConsume && - !me.audioConsume && - !me.videoConsume - ) { - console.debug("没有任何数据消费忽略创建媒体接收通道"); - } - const response = await me.request(protocol.buildMessage("media::transport::webrtc::create", { - roomId : me.roomId, - forceTcp : me.forceTcp, - producing : false, - consuming : true, - sctpCapabilities: me.dataProduce ? me.mediasoupDevice.sctpCapabilities : undefined, - })); - const { - transportId, - iceCandidates, - iceParameters, - dtlsParameters, - sctpParameters, - } = response.body; - me.recvTransport = await me.mediasoupDevice.createRecvTransport({ - id : transportId, - iceServers : [], - dtlsParameters : { - ...dtlsParameters, - role: "auto", - }, - proprietaryConstraints: { - optional: [{ - googDscp : true, - // googIPv6 : true, - // DtlsSrtpKeyAgreement: true, - }], - }, - iceCandidates, - iceParameters, - sctpParameters, - }); - me.recvTransport.on("connect", ({ - dtlsParameters - }, callback, errback) => { - me.request(protocol.buildMessage("media::transport::webrtc::connect", { - roomId: me.roomId, - transportId: me.recvTransport.id, - dtlsParameters, - })) - .then(callback) - .catch(errback); - }); - } - /** * 生产音频 * @@ -2698,6 +2532,177 @@ class Taoyao extends RemoteClient { } } + /** + * 创建媒体发送通道 + */ + async createSendTransport() { + if ( + !this.dataProduce && + !this.audioProduce && + !this.videoProduce + ) { + console.debug("没有任何数据生产忽略创建媒体发送通道"); + return; + } + const response = await this.request(protocol.buildMessage("media::transport::webrtc::create", { + roomId : this.roomId, + forceTcp : this.forceTcp, + producing : true, + consuming : false, + sctpCapabilities: this.dataProduce ? this.mediasoupDevice.sctpCapabilities : undefined, + })); + const { + transportId, + iceCandidates, + iceParameters, + dtlsParameters, + sctpParameters, + } = response.body; + this.sendTransport = await this.mediasoupDevice.createSendTransport({ + iceCandidates, + iceParameters, + sctpParameters, + id : transportId, + iceServers : [], + dtlsParameters: { + ...dtlsParameters, + role: "auto", + }, + proprietaryConstraints: { + optional: [{ + googDscp : true, + // googIPv6 : true, + // DtlsSrtpKeyAgreement: true, + }], + }, + }); + this.sendTransport.on("connect", ({ + dtlsParameters + }, callback, errback) => { + this.request(protocol.buildMessage("media::transport::webrtc::connect", { + dtlsParameters, + roomId : this.roomId, + transportId: this.sendTransport.id, + })) + .then(callback) + .catch(errback); + }); + this.sendTransport.on("produce", ({ + kind, + appData, + rtpParameters + }, callback, errback) => { + this.request(protocol.buildMessage("media::produce", { + kind, + appData, + rtpParameters, + roomId : this.roomId, + transportId: this.sendTransport.id, + })) + .then((response) => { + const { + streamId, + producerId + } = response.body; + callback({ + id: producerId + }); + }) + .catch(errback); + }); + this.sendTransport.on("producedata", ({ + label, + appData, + protocol, + sctpStreamParameters + }, callback, errback) => { + this.request(taoyaoProtocol.buildMessage("media::data::produce", { + label, + appData, + protocol, + sctpStreamParameters, + roomId : this.roomId, + transportId: this.sendTransport.id, + })) + .then((response) => { + const { + treamId, + producerId + } = response.body; + callback({ + id: producerId + }); + }) + .catch(errback); + }); + } + + /** + * 创建媒体接收通道 + */ + async createRecvTransport() { + if ( + !this.dataConsume && + !this.audioConsume && + !this.videoConsume + ) { + console.debug("没有任何数据消费忽略创建媒体接收通道"); + return; + } + const response = await this.request(protocol.buildMessage("media::transport::webrtc::create", { + roomId : this.roomId, + forceTcp : this.forceTcp, + producing : false, + consuming : true, + sctpCapabilities: this.dataProduce ? this.mediasoupDevice.sctpCapabilities : undefined, + })); + const { + transportId, + iceCandidates, + iceParameters, + dtlsParameters, + sctpParameters, + } = response.body; + this.recvTransport = await this.mediasoupDevice.createRecvTransport({ + iceCandidates, + iceParameters, + sctpParameters, + id : transportId, + iceServers : [], + dtlsParameters: { + ...dtlsParameters, + role: "auto", + }, + proprietaryConstraints: { + optional: [{ + googDscp : true, + // googIPv6 : true, + // DtlsSrtpKeyAgreement: true, + }], + }, + }); + this.recvTransport.on("connect", ({ + dtlsParameters + }, callback, errback) => { + this.request(protocol.buildMessage("media::transport::webrtc::connect", { + dtlsParameters, + roomId : this.roomId, + transportId: this.recvTransport.id, + })) + .then(callback) + .catch(errback); + }); + } + + /** + * 视频方向变化信令 + * + * @param {*} message 信令消息 + */ + defaultMediaVideoOrientationChange(message) { + console.debug("视频方向变化", message); + } + /** * 错误回调 * diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportWebRtcCreateProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportWebRtcCreateProtocol.java index 420c095..5965e00 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportWebRtcCreateProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaTransportWebRtcCreateProtocol.java @@ -65,11 +65,11 @@ public class MediaTransportWebRtcCreateProtocol extends ProtocolRoomAdapter { if(clientType.isClient()) { body.put(Constant.CLIENT_ID, clientId); final Message response = room.requestMedia(message); - final Map responseBody = response.body(); + final Map responseBody = response.body(); final Map transports = room.getTransports(); final String transportId = MapUtils.get(responseBody, Constant.TRANSPORT_ID); // 重写地址 - this.rewriteIp(client.getIP(), responseBody); + this.rewriteIP(client.getIP(), responseBody); // 处理逻辑 final ClientWrapper clientWrapper = room.clientWrapper(client); // 消费者 @@ -112,21 +112,21 @@ public class MediaTransportWebRtcCreateProtocol extends ProtocolRoomAdapter { /** * 重写IP地址 * - * @param clientIp 终端IP - * @param body 消息主体 + * @param clientIP 终端IP + * @param body 消息主体 */ - private void rewriteIp(String clientIp, Map body) { + private void rewriteIP(String clientIP, Map body) { final List> iceCandidates = MapUtils.get(body, Constant.ICE_CANDIDATES); if(CollectionUtils.isEmpty(iceCandidates)) { return; } iceCandidates.forEach(map -> { // 媒体服务返回IP - final String mediaIp = (String) map.get(Constant.IP); - if(StringUtils.isNotEmpty(mediaIp)) { - final String rewriteIp = NetUtils.rewriteIP(mediaIp, clientIp); - log.debug("重写地址:{} + {} -> {}", mediaIp, clientIp, rewriteIp); - map.put(Constant.IP, rewriteIp); + final String mediaIP = (String) map.get(Constant.IP); + if(StringUtils.isNotEmpty(mediaIP)) { + final String rewriteIP = NetUtils.rewriteIP(mediaIP, clientIP); + log.debug("重写地址:{} + {} -> {}", mediaIP, clientIP, rewriteIP); + map.put(Constant.IP, rewriteIP); } }); } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaVideoOrientationChangeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaVideoOrientationChangeProtocol.java index e5e8c61..c6fdf90 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaVideoOrientationChangeProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaVideoOrientationChangeProtocol.java @@ -20,8 +20,8 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; body = """ { "roomId" : "房间ID", - "camera" : "是否摄像头", "flip" : "是否翻转", + "camera" : "是否摄像头", "rotation": "旋转角度" } """,