*********SCREEN SHARING *********
TO SHARE THE SCREEN WE USE A NAVIGATOR PROPERTY CALLED getDisplayMedia()
VIDEOCONFERENCE.JSX
<IconButton
onClick={handleScreenShare}
style={{ color: "white" }}
>
{screen === true ? (
<StopScreenShareTwoToneIcon />
) : (
<ScreenShareTwoToneIcon />
)}
</IconButton>
SCREEN SHARE FUNCTION
const handleScreenShare = () => {
console.log(screen);
if (screen) {
StopScreenShare();
} else {
if (navigator.mediaDevices.getDisplayMedia) {
navigator.mediaDevices
.getDisplayMedia({ video: true, audio: true })
.then(getDisplayMediaSuccess)
.catch((e) => console.log(e));
}
setScreen(true);
}
};
let getDisplayMediaSuccess = (stream) => {
//TO STOP EXISTING TRACKS
try {
window.localStream.getTracks().forEach((track) => track.stop());
} catch (e) {
console.log(e);
}
//ASSIGNING THE CURRENT STREAM
window.localStream = stream;
localVideoRef.current.srcObject = stream;
Object.entries(connections).forEach(([id, conn]) => {
if (id !== socketIdRef.current) {
const senders = conn.getSenders();
stream.getTracks().forEach((track) => {
const sender = senders.find((s) => s.track?.kind === track.kind);
// IF SENDER EXISTS WE REPLACE THE TRACK
if (sender) {
sender.replaceTrack(track);
} else {
// WE ADD A NEW TRACK
conn.addTrack(track, stream);
}
// CREATNG OFFER
conn.createOffer().then((description) => {
// SETTING LOCAL DESCRIPTION
conn
.setLocalDescription(description)
// EMITTING SIGNAL
.then(() => {
socketRef.current.emit(
"signal",
id,
JSON.stringify({ sdp: conn.localDescription })
);
})
.catch((e) => console.log(e));
});
});
}
});
// ON ENDING , WE STOP SCREEN SHARING
stream.getTracks().forEach((track) => {
track.onended = () => {
console.log("stopped");
StopScreenShare();
};
});
};
STOPPING SCREEN SHARING
let StopScreenShare = () => {
setScreen(false);
try {
//STOPPING THE STREAM (SCREEN SHARING)
let tracks = localVideoRef.current.srcObject.getTracks();
tracks.forEach((track) => track.stop());
} catch (e) {
console.log(e);
}
// ASSIGNING BACK THE CAMERA STREAM
navigator.mediaDevices
.getUserMedia({ video: true, audio: true })
.then((camStream) => {
window.localStream = camStream;
localVideoRef.current.srcObject = camStream;
Object.entries(connections).forEach(([id, conn]) => {
if (id === socketIdRef.current) return;
const senders = conn.getSenders();
camStream.getTracks().forEach((track) => {
const sender = senders.find((s) => s.track?.kind === track.kind);
if (sender) {
sender.replaceTrack(track);
} else {
conn.addTrack(track, camStream);
}
});
conn
.createOffer()
.then((desc) => conn.setLocalDescription(desc))
.then(() => {
socketRef.current.emit(
"signal",
id,
JSON.stringify({
sdp: conn.localDescription,
})
);
});
});
})
.catch((e) => console.log("Webcam error:", e));
};

Comments
Post a Comment