我一直在尝试让WebRTC与广播公司和多个听众一起工作,但是当涉及转发描述和候选人通过信令(使用nodejs& socket.io)时,我会陷入困境。
我可以使用一个简单的nodejs套接字应用程序在两个浏览器之间工作,只需将描述和候选广播到其他已连接的客户端,但当我尝试存储描述并连接新打开的浏览器时,没有任何反应。
我基本上需要了解的是,我需要向一个浏览器提供什么,以便它开始与另一个浏览器进行通信?我正在进行的项目要求听众能够加入房间,进行身份验证,并开始收听正在发送的媒体。
以下是我的客户端代码:
var audioContext = new webkitAudioContext()
var client = null
var configuration =
{
'iceServers':
[{
'url': 'stun:stun.example.org'
}]
}
$(function ()
{
window.RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection
client = new RTCPeerConnection(configuration, { optional:[ { RtpDataChannels: true } ]})
client.onnegotiationneeded = function ()
{
console.log('Negotiation needed')
createOffer()
}
client.onicecandidate = function (event)
{
console.log('onicecandidate')
socket.emit('candidate', JSON.stringify({ 'candidate': event.candidate }))
}
client.onaddstream = function (event)
{
console.log('onaddstream')
$('#player').attr('src', URL.createObjectURL(event.stream))
player.play()
}
socket.on('candidate', function (event)
{
candidate(event)
})
socket.on('description', function (message)
{
if(!client) { return }
client.setRemoteDescription(new RTCSessionDescription(message.sdp), function () {
if (client.remoteDescription.type == 'offer')
client.createAnswer(function (description)
{
client.setLocalDescription(description, function ()
{
socket.emit('description', JSON.stringify({ 'sdp':client.localDescription }))
})
}, function (err)
{
console.log('error: ' + err)
})
}, function(err)
{
console.log('error: ' + err)
})
})
addStream()
})
function createOffer ()
{
if(!client) { return; }
client.createOffer(function (description)
{
console.log(description)
client.setLocalDescription(description, function ()
{
socket.emit('description', JSON.stringify({ 'sdp': client.localDescription }))
console.log('set local description')
})
})
}
function candidate (message)
{
if(message.candidate)
{
console.log('candidate')
client.addIceCandidate(new RTCIceCandidate(message.candidate))
}
}
function addStream ()
{
navigator.webkitGetUserMedia({audio: true, video: false}, function(stream)
{
client.addStream(stream)
})
}
我目前的服务器的信号部分是:
io.on 'connection', (socket) ->
socket.on 'description', (data) ->
parsed = JSON.parse data
socket.broadcast.emit 'description', parsed
socket.on 'candidate', (candidate) ->
parsed = JSON.parse candidate
socket.broadcast.emit 'candidate', parsed
我很欣赏对此的任何见解。感谢。
答案 0 :(得分:1)
名称表示的“PeerConnection”只能与另一个对等方使用。您无法缓存由一个PeerConnection实例生成的商品SDP,以将其与多个其他同行一起使用。
在您的情况下,您必须为每个要发送/接收音频和视频的浏览器创建PeerConnection,然后通过您的信号机制与这些浏览器交换相应的SDP服务和答案。
请随时浏览一些I have mentioned链接,了解WebRTC的工作原理。