如何使用socketio作为非启动器动态添加具有多个用户的流



我已经得到了webRTC工作在我的快车服务器,但我希望能够动态地添加用户的流。我查找了一下simple-peer文档,发现了这个:

var Peer = require('simple-peer') // create peer without waiting for media
var peer1 = new Peer({ initiator: true }) // you don't need streams here
var peer2 = new Peer()
peer1.on('signal', data => {
peer2.signal(data)
})
peer2.on('signal', data => {
peer1.signal(data)
})
peer2.on('stream', stream => {
// got remote video stream, now let's show it in a video tag
var video = document.querySelector('video')
if ('srcObject' in video) {
video.srcObject = stream
} else {
video.src = window.URL.createObjectURL(stream) // for older browsers
}
video.play()
})
function addMedia (stream) {
peer1.addStream(stream) // <- add streams to peer dynamically
}
// then, anytime later...
navigator.mediaDevices.getUserMedia({
video: true,
audio: true
}).then(addMedia).catch(() => {})

Peer1动态地向Peer2发送一个流,但它在同一个浏览器中。我用的是socket。这样人们就可以加入不同的房间。我用这个例子来入门:https://github.com/Dirvann/webrtc-video-conference-simple-peer.

如果我使用上面的github示例,我明白我必须放入:

navigator.mediaDevices.getUserMedia(constraints).then(stream => {
console.log('Received local stream');
localVideo.srcObject = stream;
localStream = stream;
}).catch(e => alert(`getusermedia error ${e.name}`))

在函数中。调用init ();然后稍后调用该函数。但在简单对等的例子中,它称为addMedia(流),但如何peer2接收流参数,如果它不是在同一个浏览器?在github代码中,'stream'从不通过socket.emit发送。

更新:这是基于github链接。所以我从一开始就删除了getUserMedia,并让init()自己运行。

// add my stream to all peers in the room dynamically
function addMyStreamDynamic(stream) {
for (let index in peers) {
peers[index].addStream(stream);
}
}   
function addMyVideoStream() {
navigator.mediaDevices.getUserMedia(constraints).then(stream => {
localVideo.srcObject = stream;
localStream = stream;
addMyStreamDynamic(stream);
}).catch(e => alert(`getUserMedia error ${e.name}`))
}

调用addMyVideoStream时,它将流添加到其他对等体,但它不完整。当在用户加入之前运行它时,流不会被发送。

Update2:上面的代码工作,但只有当启动器调用它。

似乎动态添加流作为非启动器要复杂得多。我只是创建了一个虚拟流,稍后替换轨道。

相关内容

  • 没有找到相关文章

最新更新