0

所以我用这个小测试代码模拟了我所拥有的真实版本的情况。在其中,我在同一个文件中设置了 2 个对等连接,每个连接在 html 上都有一个专用的视频元素。问题是,当我开始共享屏幕时,流没有显示在其他对等方(peer2)上,这与我在真实版本的代码中遇到的问题相同。

这是js代码

'use strict';    
    const video1 = document.getElementById('video1');
    const video2 = document.getElementById('video2');
    let peer1 = new RTCPeerConnection();
    let peer2 = new RTCPeerConnection();

peer1.onicecandidate = ev => {
  console.log('peer1 oncandidate event');
  if (ev.candidate) {
    const c = new RTCIceCandidate(ev.candidate);
    peer2.addIceCandidate(c);
  }
};

peer2.onicecandidate = ev => {
  console.log('peer2 oncandidate event');
  if (ev.candidate) {
    const c = new RTCIceCandidate(ev.candidate);
    peer1.addIceCandidate(c);
  }
};

peer2.onaddtrack = ev => addStreamSource;

function startVideoStream() {
  const videoOptions = {
    video: true,
    audio: true
  };

  navigator.mediaDevices.getDisplayMedia(videoOptions)
    .then(gotLocalMediaStream)
    .catch(logError);
}

function gotLocalMediaStream(stream) {
  console.log('setting the stream');
  console.log(stream.getTracks());
  peer1.addTrack(stream.getTracks()[0]);
  video1.srcObject = stream;
  peer1.createOffer()
    .then(desc => {
      peer1.setLocalDescription(desc);
      peer2.setRemoteDescription(desc);
      peer2.createAnswer()
        .then(des => {
          peer2.setLocalDescription(des);
          peer1.setRemoteDescription(des);
        })
        .catch(logError);
    })
    .catch(logError);
}

function addStreamSource(event) {
  console.log('ADDING STREAM SOURCE:');
  video2.srcObject = event.streams[0];
}

function logError(e) {
  console.error(`Bad thing: ${e}`);
}

function logSuccess() {
  console.log('Promise Success!');
}

索引.html

<html>

<head>
  <title>Pretty cinema</title>
  <link rel="stylesheet" href="index.css">
</head>

<body>
  <h1 style="text-align:center;" id="text">
    Pretty video streaming service
  </h1>
  <br />
  <div id="vids">
    <video id="video1" autoplay controls>
      <source type='video/mp4' ; codecs="H.264" />
    </video>
    <video id="video2" autoplay controls>
      <source type='video/mp4' ; codecs="H.264" />
    </video>
  </div>
  <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
  <script src="./checking_peers.js"></script>
  <div>
    <div class="buttonsDiv">
      <button onclick="startVideoStream()" type="button">Share</button>
    </div>
  </div>
</body>

</html>

重要的:

4

1 回答 1

1

已经找到解决方案。

简单的解释:我需要从 peer2 上收到的轨道创建一个 MediaStream。

peer2.ontrack = event => {
  const video = new MediaStream([event.track]);
  video2.srcObject = video;
};

更多详细信息:如果您在一端 (peer1) 添加轨道,则在两个对等点连接的那一刻(他们已经交换了 offer-answer 和 ICE 候选),另一端 (peer2) 将接收包含轨道的事件如果您已经覆盖了ontrackpeer2 的方法,则它。您以event.track. 从该轨道中,您可以MediaStream通过调用new MediaStream()并传递一个包含您想要作为流基础的所有轨道的数组来创建一个对象。新创建的流可以用作视频元素的源,将其分配给videoElement.srcObject = theMediaStream;.

另外:我设置 ICECandidate 响应的方式存在问题,因此请仔细查看代码,它在此处编写正确,可能是您遇到了同样的问题。

于 2021-02-28T19:18:20.187 回答