****************MAKING VIDEO CALL ********************
STEP-1:
TO GET MEDIA (AUDIO,VIDEO) WE USE NAVIGATOR
AND TO STREAM IT WE USE VIDEO TAG AND TO ADD THAT STREAM WE USE localVideoRef.current.srcObject
import React, { useEffect, useRef, useState } from "react";
import "../styles/VC.css";
import Button from "@mui/material/Button";
import TextField from "@mui/material/TextField";
export default function VideoConference() {
let [username, setUsername] = useState("");
let [askForUsername, setAskForUsername] = useState(true);
let [videoAvailable, setVideoAvailable] = useState(false);
let [audioAvailable, setAudioAvailable] = useState(false);
const localVideoRef = useRef();
useEffect(() => {
getPermissions();
},[]);
const getPermissions = async () => {
let videoPermission = await navigator.mediaDevices.getUserMedia({
video: true,
});
if (videoPermission) {
setVideoAvailable(true);
console.log("video permission granted!");
} else {
console.log("video permission denied!");
}
let audioPermission = await navigator.mediaDevices.getUserMedia({
audio: true,
});
if (audioPermission) {
setAudioAvailable(true);
console.log("audio Permission granted!");
} else {
console.log("audio permission denied!");
}
const userMedia = await navigator.mediaDevices
.getUserMedia({
audio: true,
video: true,
})
localVideoRef.current.srcObject = userMedia;
};
console.log(localVideoRef);
let connect = () => {
setAskForUsername(false);
};
return (
<>
{askForUsername ? (
<>
<TextField
className="inputsRequired"
label="enter username"
value={username}
onChange={(e) => {
setUsername(e.target.value);
}}
/>
<Button variant="contained" onClick={connect}>
connect
</Button>
<video ref={localVideoRef} autoPlay playsInline></video>
</>
) : (
<></>
)}
</>
);
}
import React, { useEffect, useRef, useState } from "react";
import "../styles/VC.css";
import Button from "@mui/material/Button";
import TextField from "@mui/material/TextField";
import { io, Socket } from "socket.io-client";
export default function VideoConference() {
let [username, setUsername] = useState("");
let [askForUsername, setAskForUsername] = useState(true);
let [videoAvailable, setVideoAvailable] = useState(false);
let [audioAvailable, setAudioAvailable] = useState(false);
const localVideoRef = useRef();
const socketRef = useRef();
useEffect(() => {
getPermissions();
socketRef.current = io.connect("https://localhost:8080");
socketRef.current.on("signal", handleSignal);
}, []);
const getPermissions = async () => {
try {
let videoPermission = await navigator.mediaDevices.getUserMedia({
video: true,
});
if (videoPermission) {
setVideoAvailable(true);
console.log("video permission granted!");
} else {
console.log("video permission denied!");
}
let audioPermission = await navigator.mediaDevices.getUserMedia({
audio: true,
});
if (audioPermission) {
setAudioAvailable(true);
console.log("audio Permission granted!");
} else {
console.log("audio permission denied!");
}
const userMedia = await navigator.mediaDevices.getUserMedia({
audio: true,
video: true,
});
if (userMedia) {
window.localStream = userMedia;
if (localVideoRef.current) {
localVideoRef.current.srcObject = userMedia;
}
}
} catch (e) {
console.log(e);
}
};
console.log(localVideoRef.current.srcObject.getTracks());
let addTracks = async () => {
const stream = localVideoRef.current.srcObject;
stream.getTracks().forEach((track) => {
peerConnection.addTrack(track, stream);
});
};
let CreatingOffer = async (fromId) => {
try {
let offer = await peerConnection.createOffer();
await peerConnection.setLocalDescription(offer);
// STEP-5 SENDING OFFER
socketRef.current.emit(
"signal",
fromId,
JSON.stringify({ sdp: peerConnection.current.localDescription })
);
} catch (e) {
console.log(e);
}
};
let handleSignal = async (fromId, message) => {
let signal = JSON.parse(message);
try {
if (signal.sdp.type === "offer") {
// STEP-6 RECEIVING OFFER
await peerConnection.setRemoteDescription(
new RTCSessionDescription(signal.sdp)
);
// STEP-7 CREATING ANSWER
const answer = await peerConnection.createAnswer();
await peerConnection.setLocalDescription(answer);
socketRef.current.emit(
"signal",
fromId,
JSON.stringify({
sdp: peerConnection.localDescription,
})
);
} else if (signal.sdp.type === "answer") {
await peerConnection.setRemoteDescription(
new RTCSessionDescription(signal.sdp)
);
}
} catch (e) {
console.log(e);
}
};
let connect = async () => {
setAskForUsername(false);
//STEP-2 ESTABLISHING CONNECTION
const peerConnection = new RTCPeerConnection({
iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
});
peerConnection.event.onincecandidate = () => {
if (event.candidate) {
socketRef.current.emit(
"signal",
JSON.stringify({ ice: event.candidate })
);
}
};
// STEP-10 DISPLAYING
peerConnection.ontrack = (event) => {
localVideoRef.srcObject = event.streams[0];
};
await addTracks();
await CreatingOffer();
};
return (
<>
{askForUsername ? (
<>
<TextField
className="inputsRequired"
label="enter username"
value={username}
onChange={(e) => {
setUsername(e.target.value);
}}
/>
<Button variant="contained" onClick={connect}>
connect
</Button>
<video ref={localVideoRef} autoPlay playsInline></video>
</>
) : (
<></>
)}
</>
);
}

Comments
Post a Comment