mirror of https://github.com/OpenVidu/openvidu.git
openvidu-browser: Publisher.replaceTrack method refactoring
parent
eb914b5418
commit
eae032405d
|
@ -304,7 +304,8 @@ export class Publisher extends StreamManager {
|
||||||
*/
|
*/
|
||||||
replaceTrack(track: MediaStreamTrack): Promise<void> {
|
replaceTrack(track: MediaStreamTrack): Promise<void> {
|
||||||
|
|
||||||
const replaceMediaStreamTrack = () => {
|
const replaceTrackInMediaStream = (): Promise<void> => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote! : this.stream.getMediaStream();
|
const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote! : this.stream.getMediaStream();
|
||||||
let removedTrack: MediaStreamTrack;
|
let removedTrack: MediaStreamTrack;
|
||||||
if (track.kind === 'video') {
|
if (track.kind === 'video') {
|
||||||
|
@ -315,15 +316,16 @@ export class Publisher extends StreamManager {
|
||||||
mediaStream.removeTrack(removedTrack);
|
mediaStream.removeTrack(removedTrack);
|
||||||
removedTrack.stop();
|
removedTrack.stop();
|
||||||
mediaStream.addTrack(track);
|
mediaStream.addTrack(track);
|
||||||
if (this.stream.isLocalStreamPublished) {
|
if (track.kind === 'video' && this.stream.isLocalStreamPublished) {
|
||||||
this.openvidu.sendNewVideoDimensionsIfRequired(this, 'trackReplaced', 50, 30);
|
this.openvidu.sendNewVideoDimensionsIfRequired(this, 'trackReplaced', 50, 30);
|
||||||
this.session.sendVideoData(this.stream.streamManager, 5, true, 5);
|
this.session.sendVideoData(this.stream.streamManager, 5, true, 5);
|
||||||
}
|
}
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const replaceTrackInRtcRtpSender = (): Promise<void> => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (this.stream.isLocalStreamPublished) {
|
|
||||||
// Only if the Publisher has been published is necessary to call native Web API RTCRtpSender.replaceTrack
|
|
||||||
const senders: RTCRtpSender[] = this.stream.getRTCPeerConnection().getSenders();
|
const senders: RTCRtpSender[] = this.stream.getRTCPeerConnection().getSenders();
|
||||||
let sender: RTCRtpSender | undefined;
|
let sender: RTCRtpSender | undefined;
|
||||||
if (track.kind === 'video') {
|
if (track.kind === 'video') {
|
||||||
|
@ -343,17 +345,44 @@ export class Publisher extends StreamManager {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
(sender as RTCRtpSender).replaceTrack(track).then(() => {
|
(sender as RTCRtpSender).replaceTrack(track).then(() => {
|
||||||
replaceMediaStreamTrack();
|
|
||||||
resolve();
|
resolve();
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
} else {
|
});
|
||||||
// Publisher not published. Simply modify local MediaStream tracks
|
}
|
||||||
replaceMediaStreamTrack();
|
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
// Set field "enabled" of the new track to the previous value
|
||||||
|
const trackOriginalEnabledValue: boolean = track.enabled;
|
||||||
|
if (track.kind === 'video') {
|
||||||
|
track.enabled = this.stream.videoActive;
|
||||||
|
} else if (track.kind === 'audio') {
|
||||||
|
track.enabled = this.stream.audioActive;
|
||||||
|
}
|
||||||
|
if (this.stream.isLocalStreamPublished) {
|
||||||
|
// Only if the Publisher has been published is necessary to call native Web API RTCRtpSender.replaceTrack
|
||||||
|
// If it has not been published yet, replacing it on the MediaStream object is enough
|
||||||
|
try {
|
||||||
|
await replaceTrackInRtcRtpSender();
|
||||||
|
await replaceTrackInMediaStream();
|
||||||
resolve();
|
resolve();
|
||||||
|
} catch (error) {
|
||||||
|
track.enabled = trackOriginalEnabledValue;
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Publisher not published. Simply replace the track on the local MediaStream
|
||||||
|
try {
|
||||||
|
await replaceTrackInMediaStream();
|
||||||
|
resolve();
|
||||||
|
} catch (error) {
|
||||||
|
track.enabled = trackOriginalEnabledValue;
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hidden methods */
|
/* Hidden methods */
|
||||||
|
|
Loading…
Reference in New Issue