Javascript 视频流未通过我的RTPeerConnection发送
因此,我提出了这个小测试代码来模拟我所拥有的真实版本的情况。在其中,我在同一个文件中设置了2个对等连接,每个连接在html上都有一个专用的视频元素。问题是,当我开始共享屏幕时,流没有显示在另一个对等端(Javascript 视频流未通过我的RTPeerConnection发送,javascript,webrtc,mediastream,rtcpeerconnection,Javascript,Webrtc,Mediastream,Rtcpeerconnection,因此,我提出了这个小测试代码来模拟我所拥有的真实版本的情况。在其中,我在同一个文件中设置了2个对等连接,每个连接在html上都有一个专用的视频元素。问题是,当我开始共享屏幕时,流没有显示在另一个对等端(peer2),这与我在真实版本的代码中遇到的问题相同 下面是js代码 'use strict'; const video1 = document.getElementById('video1'); const video2 = document.getElementById
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上接收到的曲目创建一个媒体流
peer2.ontrack = event => {
const video = new MediaStream([event.track]);
video2.srcObject = video;
};
更多详细信息:当两个对等方连接时(他们交换了提供答案和ICE候选项),如果您在一端(peer1)添加了一个曲目,另一端(peer2)将接收一个事件,其中包含该曲目,如果您覆盖了peer2的方法ontrack
。您可以通过事件访问曲目。曲目
。通过调用new MediaStream()
并向其传递一个包含所有要基于流的曲目的数组,可以从该曲目创建一个MediaStream
对象。新创建的流可以作为视频元素的源,使用videoElement.srcObject=theMediaStream分配它代码>
另外:我设置ICECandidate响应的方式有问题,因此仔细查看代码,这里写得正确,可能是您也有同样的问题。或者,peer1.addTrack(stream.getTracks()[0],stream)
,您现有的代码也可以工作。