WebRTC:将多个侦听器连接到一个客户端,一次一个

时间:2014-02-03 14:25:35

标签: html5 node.js socket.io webrtc

我一直在尝试让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

我很欣赏对此的任何见解。感谢。

1 个答案:

答案 0 :(得分:1)

名称表示的“PeerConnection”只能与另一个对等方使用。您无法缓存由一个PeerConnection实例生成的商品SDP,以将其与多个其他同行一起使用。

在您的情况下,您必须为每个要发送/接收音频和视频的浏览器创建PeerConnection,然后通过您的信号机制与这些浏览器交换相应的SDP服务和答案。

请随时浏览一些I have mentioned链接,了解WebRTC的工作原理。