如何解决视频流不是通过我的 RTCPeerConnection 发送的
所以我提出了这个小测试代码来模拟我所拥有的真实版本的情况。在其中,我在同一个文件中设置了 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!');
}
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) 添加轨道,则两个对等方连接的那一刻(他们交换了 offer-answer 和 ICE 候选)如果您覆盖了 peer2 的方法 ontrack
,则将接收包含轨道的事件。您以 event.track
的身份访问曲目。从该轨道中,您可以通过调用 MediaStream
并将其传递给您希望作为流基础的所有轨道的数组来创建 new MediaStream()
对象。新创建的流可以作为您的视频元素的源,使用 videoElement.srcObject = theMediaStream;
进行分配。
另外:我设置 ICECandidate 响应的方式存在问题,因此请仔细查看代码,这里写得正确,可能您也遇到了同样的问题。 >
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。