*********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

Popular posts from this blog

MIDDLEWARE.JS

MODELS

AUTHENTICATION PAGE