WebRTC both remote and local video is displayed with local stream

后端 未结 1 441
慢半拍i
慢半拍i 2020-11-30 14:31

hello i am newbie in WebRTC and i tried this code

  const yourVideo = document.querySelector(\"#face_cam_vid\");
 const theirVideo = document.querySelector         


        
相关标签:
1条回答
  • 2020-11-30 15:07

    You're confusing a local-loop demo—what you have—with a chat room.

    A local-loop demo is a short-circuit client-only proof-of-concept, linking two peer connections on the same page to each other. Utterly useless, except to prove the API works and the browser can talk to itself.

    It contains localPeerConnection and remotePeerConnection—or pc1 and pc2—and is not how one would typically write WebRTC code. It leaves out signaling.

    Signaling is hard to demo without a server, but I show people this tab demo. Right-click and open it in two adjacent windows, and click the Call! button on one to call the other. It uses localSocket, a non-production hack I made using localStorage for signaling.

    Just as useless, a tab-demo looks more like real code:

    const pc = new RTCPeerConnection();
    
    call.onclick = async () => {
      video.srcObject = await navigator.mediaDevices.getUserMedia({video:true, audio:true});
      for (const track of video.srcObject.getTracks()) {
        pc.addTrack(track, video.srcObject);
      }
    };
    
    pc.ontrack = e => video.srcObject = e.streams[0];
    pc.oniceconnectionstatechange = e => console.log(pc.iceConnectionState);
    pc.onicecandidate = ({candidate}) => sc.send({candidate});
    pc.onnegotiationneeded = async e => {
      await pc.setLocalDescription(await pc.createOffer());
      sc.send({sdp: pc.localDescription});
    }
    
    const sc = new localSocket();
    sc.onmessage = async ({data: {sdp, candidate}}) => {
      if (sdp) {
        await pc.setRemoteDescription(sdp);
        if (sdp.type == "offer") {
          await pc.setLocalDescription(await pc.createAnswer());
          sc.send({sdp: pc.localDescription});
        }
      } else if (candidate) await pc.addIceCandidate(candidate);
    }
    

    There's a single pc—your half of the call—and there's an onmessage signaling callback to handle the timing-critical asymmetric offer/answer negotiation correctly. Same JS on both sides.

    This still isn't a chat-room. For that you need server logic to determine how people meet, and a web socket server for signaling. Try this tutorial on MDN which culminates in a chat demo.

    0 讨论(0)
提交回复
热议问题