mirror of https://github.com/OpenVidu/openvidu.git
openvidu-browser: Publiser.replaceTrack may be used without publishing to Session
parent
8eb4ce6610
commit
9dcd8d73ae
|
@ -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
|
* @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> {
|
replaceTrack(track: MediaStreamTrack): Promise<any> {
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const senders: RTCRtpSender[] = this.stream.getRTCPeerConnection().getSenders();
|
const replaceMediaStreamTrack = () => {
|
||||||
let sender: RTCRtpSender | undefined;
|
const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote : this.stream.getMediaStream();
|
||||||
|
let removedTrack: MediaStreamTrack;
|
||||||
if (track.kind === 'video') {
|
if (track.kind === 'video') {
|
||||||
sender = senders.find(s => !!s.track && s.track.kind === 'video');
|
removedTrack = mediaStream.getVideoTracks()[0];
|
||||||
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 {
|
} else {
|
||||||
reject(new Error('Unknown track kind ' + track.kind));
|
removedTrack = mediaStream.getAudioTracks()[0];
|
||||||
}
|
}
|
||||||
(<any>sender).replaceTrack(track).then(() => {
|
mediaStream.removeTrack(removedTrack);
|
||||||
const mediaStream: MediaStream = this.stream.displayMyRemote() ? this.stream.localMediaStreamWhenSubscribedToRemote : this.stream.getMediaStream();
|
removedTrack.stop();
|
||||||
let removedTrack: MediaStreamTrack;
|
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') {
|
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 {
|
} else {
|
||||||
removedTrack = mediaStream.getAudioTracks()[0];
|
reject(new Error('Unknown track kind ' + track.kind));
|
||||||
}
|
}
|
||||||
mediaStream.removeTrack(removedTrack);
|
(<any>sender).replaceTrack(track).then(() => {
|
||||||
removedTrack.stop();
|
replaceMediaStreamTrack();
|
||||||
mediaStream.addTrack(track);
|
resolve();
|
||||||
|
}).catch(error => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Publisher not published. Simply modify local MediaStream tracks
|
||||||
|
replaceMediaStreamTrack();
|
||||||
resolve();
|
resolve();
|
||||||
}).catch(error => {
|
}
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -672,4 +684,4 @@ export class Publisher extends StreamManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue