// Get local audio and video streams
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(stream => {
// Show local video stream
document.getElementById('localVideo').srcObject = stream;
// Create an RTCPeerConnection instance
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'stun::19302' }] // Use a public STUN server
});
// Add local stream to connection
stream.getTracks().forEach(track => pc.addTrack(track, stream));
// Create an offer
pc.createOffer({ offerToReceiveVideo: true })
.then(offer => {
// Set local description and send an offer
pc.setLocalDescription(offer);
// Send an offer through the signaling server
sendSignalingMessage('video-offer', offer);
});
// Handle remote description
pc.setRemoteDescription = new RTCSessionDescription({
type: 'answer',
sdp: 'remote_sdp_answer'
});
// Listen to remote streams
pc.ontrack = event => {
document.getElementById('remoteVideo').srcObject = event.streams[0];
};
// Process ICE candidates
pc.onicecandidate = event => {
if (event.candidate) {
sendSignalingMessage('new-ice-candidate', event.candidate);
}
};
});
// Send signaling messages
function sendSignalingMessage(type, data) {
const message = JSON.stringify({ type, ...data });
// Send signaling messages via WebSocket
websocket.send(message);
}