WebRTC 通过暴露发送者的 SDP 进行单向通信

问题描述 投票:0回答:1

所以在提供者上我有这个代码。它具有将 SDP 发送到数据库的功能。

const videoConstraints = {
  'video': true,
  'audio': false
}

var localStream = new MediaStream();

try {
  navigator.mediaDevices.getUserMedia(videoConstraints).then((stream) => {
    localStream = stream;
    video = document.getElementById("video");
    video.srcObject = stream;
  })
} catch (error) {
  console.log(error);
}

const turnConfig = {
  iceServers: [
//servers
  ]
}

const createOfferer = () => {
  var peer = new RTCPeerConnection(turnConfig);

  localStream.getTracks().forEach(track => {
    peer.addTrack(track, localStream);
  });

  peer.createOffer()
    .then((offer) => {
      fetch(window.location.href, {
        method: "POST",
        body: JSON.stringify(offer),
        headers: {
          "Content-Type": "application/json"
        }
      });
    })  
}

从那里,SDP被应答者获取,然后调用createAnswerer:

const setOnTrack = (peer, remoteVideo) => {
  var remoteStream = new MediaStream();

  remoteVideo.srcObject = remoteStream;

  peer.addEventListener('track', async (e) => {
    remoteStream.addTrack(e.track, remoteStream);
  })
}

const createAnswererForSeat = (offer) => {
  var peer = new RTCPeerConnection(turnConfig);

  var remoteVideo = createVideoForSeat(); //this function only creates the video element
  setOnTrack(peer, remoteVideo);

  peer.setRemoteDescription(offer)
    .then(() => {
      return peer.createAnswer();
    })
    .then((answer) => {
      peer.setLocalDescription(answer);
    });
}

出于某种原因,在 Chrome 上,应答者端没有摄像头,而在 Firefox 上,我收到 WebRTC 错误。

为什么它不起作用?我是 WebRTC 的新手,所以如果我遗漏了一些明显的东西,抱歉 :)

谢谢。

html video webrtc getusermedia
1个回答
0
投票

在报价者中,您需要在创建报价后设置本地描述:

  peer.createOffer()
    .then((offer) => {
      peer.setLocalDescription(offer) // <--- here
      fetch(window.location.href, {
        method: "POST",
        body: JSON.stringify(offer),
        headers: {
          "Content-Type": "application/json"
        }
      });
    })  

在回答者中,您需要将答案发送回提供者并将其设置为远程描述。应该是这样的:

const onAnswer = async (answer) => {
    await peer.setRemoteDescription(answer)
}

此外,RTCPeerConnection 应该存储在回调之外的某个地方,否则它将在函数退出后被垃圾收集。

© www.soinside.com 2019 - 2024. All rights reserved.