我一直在尝试将webRTC广播源改为多对一
我认为一对多(广播)和多对一在这里有一点不同图像描述1:https://i.stack.imgur.com/zAzbt.png
他们有peerConnections,一切都很好。
呼叫者将MediaStream发送给所有被呼叫者。
所以我想
让我们从呼叫者到被呼叫者获取信令,并将MediaStream从被呼叫者传递到呼叫者。
所以我把这段代码放到被调用方
callee.js
socket.on('offer', (id, description) => {
peerConnection = new RTCPeerConnection(config);
navigator.mediaDevices
.getUserMedia(constraints)
.then((stream) => {
video.srcObject = stream;
})
.catch((error) => console.error(error));
let stream = video.srcObject;
stream
.getTracks()
.forEach((track) => peerConnection.addTrack(track, stream));
peerConnection
.setRemoteDescription(description)
.then(() => peerConnection.createAnswer())
.then((sdp) => peerConnection.setLocalDescription(sdp))
.then(() => {
socket.emit('answer', id, peerConnection.localDescription);
});
peerConnection.onicecandidate = (event) => {
if (event.candidate) {
socket.emit('candidate', id, event.candidate);
}
};
});caller.js
socket.on('answer', (id, description) => {
peerConnections[id].setRemoteDescription(description);
peerConnections.ontrack = (event) => {
video.srcObject = event.streams[0];
};
});我从callee.js中得到了“未捕获TypeError:无法读取null的属性'getTracks‘”这个错误
你能给我一些建议吗?
谢谢
发布于 2020-07-03 00:21:47
由于流是由Promise获取的,因此getTracks()将在getUserMedia()之前执行。因此,修改它,使其在promise之后执行。
exp:未测试
socket.on("offer", (id, description) => {
peerConnection = new RTCPeerConnection(config);
peerConnection.onicecandidate = event => {
if (event.candidate) {
socket.emit("candidate", id, event.candidate);
}
};
navigator.mediaDevices
.getUserMedia(constraints)
.then(stream => {
video.srcObject = stream;
stream.getTracks().forEach(track => peerConnection.addTrack(track, stream));
})
.then(peerConnection.setRemoteDescription(description))
.then(() => peerConnection.createAnswer())
.then(sdp => peerConnection.setLocalDescription(sdp))
.then(() => {
socket.emit("answer", id, peerConnection.localDescription);
})
.catch(error => console.error(error));
});https://stackoverflow.com/questions/62700376
复制相似问题