New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Handle video track stopped and restarted in multi streams example #299
Comments
Example implementation using Typescript that i use in production: export function listenToMediaStreamEnd(mediaStream: MediaStream, callback: (mediaStream?: MediaStream) => void) {
let ended = false;
const video = document.createElement('video');
video.srcObject = mediaStream;
const handleMediaEnd = () => {
if (!ended) {
ended = true;
video.removeEventListener('ended', handleMediaEnd);
video.srcObject = null;
mediaStream.removeEventListener('inactive', handleMediaEnd);
mediaStream.removeEventListener('ended', handleMediaEnd);
if (typeof callback === 'function') {
callback(mediaStream);
}
}
}
video.addEventListener('ended', handleMediaEnd);
// eneded, onremovetrack, onaddtrack
mediaStream.addEventListener('inactive', handleMediaEnd);
mediaStream.addEventListener('ended', handleMediaEnd);
const tracks = mediaStream.getTracks();
const handleTrackEnd = (track: MediaStreamTrack) => {
const trackIndex = tracks.indexOf(track);
if (trackIndex !== -1) {
tracks.splice(trackIndex, 1);
track.removeEventListener('ended', handleTrackEnds[track.id], false);
track.removeEventListener('inactive', handleTrackEnds[track.id], false);
delete handleTrackEnds[track.id];
}
if (tracks.length === 0 && !ended) {
handleMediaEnd()
}
};
const handleTrackEnds : any = {};
mediaStream.addEventListener('addtrack', (event: any) => {
const track = event.track;
tracks.push(track);
handleTrackEnds[track.id] = handleTrackEnd.bind(null, track);
track.addEventListener('ended', handleTrackEnds[track.id], false);
track.addEventListener('inactive', handleTrackEnds[track.id], false);
});
mediaStream.addEventListener('removetrack', (event: any) => {
handleTrackEnd(event.track);
});
tracks.forEach((track: MediaStreamTrack) => {
handleTrackEnds[track.id] = handleTrackEnd.bind(null, track);
track.addEventListener('ended', handleTrackEnds[track.id], false);
track.addEventListener('inactive', handleTrackEnds[track.id], false);
});
} |
Would love to see this fixed! @hthetiot Could you please explain how to use your solution ? Is it possible to implement it in JS? Thanks in advance! |
See also #320 (comment) |
Changes in #421 fix the issues. |
This work was sponsored by a private sponsor. Thank you! c-frame/sponsorship#4 |
See issues that need sponsors at https://github.com/c-frame/sponsorship |
Address the known issues of the multi streams example
networked-aframe/examples/basic-multi-streams.html
Lines 121 to 124 in a386198
see also comment #269 (comment)
The text was updated successfully, but these errors were encountered: