From da084e2b3117896c6b991a584d194fc893eda929 Mon Sep 17 00:00:00 2001 From: pabloFuente Date: Tue, 10 Nov 2020 14:51:19 +0100 Subject: [PATCH] openvidu-browser: improve send videoData with interval --- openvidu-browser/src/OpenVidu/Publisher.ts | 6 +-- openvidu-browser/src/OpenVidu/Session.ts | 52 ++++++++++++++-------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/openvidu-browser/src/OpenVidu/Publisher.ts b/openvidu-browser/src/OpenVidu/Publisher.ts index b6fc847e..e4afac50 100644 --- a/openvidu-browser/src/OpenVidu/Publisher.ts +++ b/openvidu-browser/src/OpenVidu/Publisher.ts @@ -314,7 +314,7 @@ export class Publisher extends StreamManager { mediaStream.removeTrack(removedTrack); removedTrack.stop(); mediaStream.addTrack(track); - this.session.sendVideoData(this.stream.streamManager); + this.session.sendVideoData(this.stream.streamManager, 5, true, 5); } return new Promise((resolve, reject) => { @@ -613,8 +613,8 @@ export class Publisher extends StreamManager { .then(myConstraints => { if (!!myConstraints.videoTrack && !!myConstraints.audioTrack || - !!myConstraints.audioTrack && myConstraints.constraints?.video === false || - !!myConstraints.videoTrack && myConstraints.constraints?.audio === false) { + !!myConstraints.audioTrack && myConstraints.constraints?.video === false || + !!myConstraints.videoTrack && myConstraints.constraints?.audio === false) { // No need to call getUserMedia at all. MediaStreamTracks already provided successCallback(this.openvidu.addAlreadyProvidedTracks(myConstraints, new MediaStream())); // Return as we do not need to process further diff --git a/openvidu-browser/src/OpenVidu/Session.ts b/openvidu-browser/src/OpenVidu/Session.ts index 95b9de7c..832f2e05 100644 --- a/openvidu-browser/src/OpenVidu/Session.ts +++ b/openvidu-browser/src/OpenVidu/Session.ts @@ -385,7 +385,7 @@ export class Session extends EventDispatcher { this.connection.addStream(publisher.stream); publisher.stream.publish() .then(() => { - this.sendVideoData(publisher, 5); + this.sendVideoData(publisher, 8, true, 5); resolve(); }) .catch(error => { @@ -399,7 +399,7 @@ export class Session extends EventDispatcher { publisher.reestablishStreamPlayingEvent(); publisher.stream.publish() .then(() => { - this.sendVideoData(publisher, 5); + this.sendVideoData(publisher, 8, true, 5); resolve(); }) .catch(error => { @@ -1162,30 +1162,46 @@ export class Session extends EventDispatcher { return joinParams; } - sendVideoData(streamManager: StreamManager, intervalSeconds: number = 1) { + sendVideoData(streamManager: StreamManager, intervalSeconds: number = 1, doInterval: boolean = false, maxLoops: number = 1) { if ( platform.isChromeBrowser() || platform.isChromeMobileBrowser() || platform.isOperaBrowser() || platform.isOperaMobileBrowser() || platform.isElectron() || (platform.isSafariBrowser() && !platform.isIonicIos()) || platform.isAndroidBrowser() || platform.isSamsungBrowser() || platform.isIonicAndroid() || (platform.isIPhoneOrIPad() && platform.isIOSWithSafari()) ) { - setTimeout(async () => { - const statsMap = await streamManager.stream.getWebRtcPeer().pc.getStats(); - statsMap.forEach((stats) => { - if ("frameWidth" in stats) { - this.openvidu.sendRequest('videoData', { - height: stats.frameHeight, - width: stats.frameWidth, - videoActive: streamManager.stream.videoActive, - audioActive: streamManager.stream.audioActive - }, (error, response) => { - if (error) { - logger.error("Error sending 'videoData' event", error); - } - }); + const obtainAndSendVideo = async () => { + const statsMap = await streamManager.stream.getRTCPeerConnection().getStats(); + const arr: any[] = []; + statsMap.forEach(stats => { + if (("frameWidth" in stats) && ("frameHeight" in stats) && (arr.length === 0)) { + arr.push(stats); } }); - }, intervalSeconds * 1000); + if (arr.length > 0) { + this.openvidu.sendRequest('videoData', { + height: arr[0].frameHeight, + width: arr[0].frameWidth, + videoActive: streamManager.stream.videoActive != null ? streamManager.stream.videoActive : false, + audioActive: streamManager.stream.audioActive != null ? streamManager.stream.audioActive : false + }, (error, response) => { + if (error) { + logger.error("Error sending 'videoData' event", error); + } + }); + } + } + if (doInterval) { + let loops = 1; + let timer = setTimeout(async function myTimer() { + await obtainAndSendVideo(); + if (loops < maxLoops) { + loops++; + timer = setTimeout(myTimer, intervalSeconds * 1000); + } + }, intervalSeconds * 1000); + } else { + setTimeout(obtainAndSendVideo, intervalSeconds * 1000); + } } else if (platform.isFirefoxBrowser() || platform.isFirefoxMobileBrowser() || platform.isIonicIos()) { // Basic version for Firefox and Ionic iOS. They do not support stats this.openvidu.sendRequest('videoData', {