所以我已经把这个小的测试代码建模与我所拥有的真实版本发生了什么。在它中,我在同一个文件中设置了2个对等连接,每个连接在html上都有一个专用的视频元素。问题是,当我开始共享屏幕时,流没有显示在另一个对等体(peer2
)上,这是我在代码的真实版本中得到的相同问题。
'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!');
}
index . 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>
重要:
已经找到解决方案了。
简单解释:我需要从peer2上接收到的音轨创建一个MediaStream。
peer2.ontrack = event => {
const video = new MediaStream([event.track]);
video2.srcObject = video;
};
更多细节:如果您在一端(peer1)上添加了一个轨道,那么如果您覆盖了peer2的方法ontrack
,则另一端(peer2)将接收一个包含轨道的事件。你以event.track
的身份进入赛道。从那个轨道,你可以创建一个MediaStream
对象通过调用new MediaStream()
和传递它的所有轨道的数组,你想基于你的流。新创建的流可以作为视频元素的源,用videoElement.srcObject = theMediaStream;
指定它。
。我设置iceccandidate响应的方式有一个问题,所以仔细看看代码,它在这里写得很正确,可能你也有同样的问题。