<!DOCTYPE html> <html> <head><title>Loopback test</title></head> <body> <video id="remoteVideo" autoplay muted></video> <script> var localStream, localPeerConnection, remotePeerConnection; var remoteVideo = document.getElementById("remoteVideo"); function start() { navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia; navigator.getUserMedia( { audio:false, video:{ "mandatory": { "minWidth": "1280", "minHeight": "720", } } }, gotLocalStream, gotError); } function gotLocalStream(stream) { localStream = stream; var servers = null; localPeerConnection = new webkitRTCPeerConnection(servers); localPeerConnection.onicecandidate = gotLocalIceCandidate; remotePeerConnection = new webkitRTCPeerConnection(servers); remotePeerConnection.onicecandidate = gotRemoteIceCandidate; remotePeerConnection.onaddstream = gotRemoteStream; localPeerConnection.addStream(localStream); localPeerConnection.createOffer(gotLocalDescription); } function gotError(error) { console.log("navigator.getUserMedia error: ", error); } function gotRemoteStream(event) { remoteVideo.src = URL.createObjectURL(event.stream); } function gotLocalDescription(description) { localPeerConnection.setLocalDescription(description); remotePeerConnection.setRemoteDescription(description); remotePeerConnection.createAnswer(gotRemoteDescription); } function gotRemoteDescription(description) { remotePeerConnection.setLocalDescription(description); localPeerConnection.setRemoteDescription(description); } function gotLocalIceCandidate(event) { if (event.candidate) remotePeerConnection.addIceCandidate(new RTCIceCandidate(event.candidate)); } function gotRemoteIceCandidate(event) { if (event.candidate) localPeerConnection.addIceCandidate(new RTCIceCandidate(event.candidate)); } window.onload=start; </script> </body> </html>