openvidu-browser: Publiser.replaceTrack may be used without publishing to Session

pull/419/head
pabloFuente 2020-04-01 17:48:22 +02:00
parent 8eb4ce6610
commit 9dcd8d73ae
1 changed files with 37 additions and 25 deletions

View File

@ -290,37 +290,49 @@ export class Publisher extends StreamManager {
* @returns A Promise (to which you can optionally subscribe to) that is resolved if the track was successfully replaced and rejected with an Error object in other case
*/
replaceTrack(track: MediaStreamTrack): Promise<any> {
return new Promise((resolve, reject) => {
const senders: RTCRtpSender[] = this.stream.getRTCPeerConnection().getSenders();
let sender: RTCRtpSender | undefined;
const replaceMediaStreamTrack = () => {
const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote : this.stream.getMediaStream();
let removedTrack: MediaStreamTrack;
if (track.kind === 'video') {
sender = senders.find(s => !!s.track && s.track.kind === 'video');
if (!sender) {
reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object'))
}
} else if (track.kind === 'audio') {
sender = senders.find(s => !!s.track && s.track.kind === 'audio');
if (!sender) {
reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object'))
}
removedTrack = mediaStream.getVideoTracks()[0];
} else {
reject(new Error('Unknown track kind ' + track.kind));
removedTrack = mediaStream.getAudioTracks()[0];
}
(<any>sender).replaceTrack(track).then(() => {
const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote : this.stream.getMediaStream();
let removedTrack: MediaStreamTrack;
mediaStream.removeTrack(removedTrack);
removedTrack.stop();
mediaStream.addTrack(track);
}
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();
let sender: RTCRtpSender | undefined;
if (track.kind === 'video') {
removedTrack = mediaStream.getVideoTracks()[0];
sender = senders.find(s => !!s.track && s.track.kind === 'video');
if (!sender) {
reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object'))
}
} else if (track.kind === 'audio') {
sender = senders.find(s => !!s.track && s.track.kind === 'audio');
if (!sender) {
reject(new Error('There\'s no replaceable track for that kind of MediaStreamTrack in this Publisher object'))
}
} else {
removedTrack = mediaStream.getAudioTracks()[0];
reject(new Error('Unknown track kind ' + track.kind));
}
mediaStream.removeTrack(removedTrack);
removedTrack.stop();
mediaStream.addTrack(track);
(<any>sender).replaceTrack(track).then(() => {
replaceMediaStreamTrack();
resolve();
}).catch(error => {
reject(error);
});
} else {
// Publisher not published. Simply modify local MediaStream tracks
replaceMediaStreamTrack();
resolve();
}).catch(error => {
reject(error);
});
}
});
}
@ -672,4 +684,4 @@ export class Publisher extends StreamManager {
}
}
}
}