首页 > 解决方案 > 使用 simple-peer 直播网络摄像头视频。Node.js

问题描述

我正在尝试使用简单对等库将实时视频流从网络摄像头广播到服务器,然后从服务器广播到多个用户。我目前在使用 stun/turn 服务器时遇到问题。我正在使用 Xirsys。该程序在本地运行没有问题,但是当我在 Heroku 上运行它时却没有。我是 NodeJs 的新手。

有谁知道为什么它在本地运行,而不是在全球运行?

客户端:

let Peer = require('simple-peer')
let socket = io()
const video = document.querySelector('video')
let client = {}

var configuration={
    iceServers: [{
        urls: [ "stun:sp-turn1.xirsys.com" ]
     }, {
        username: "LdzgXD2MWspU8qKuKIa9nYv02AqPhqD_qOeFSCsJfBjaCwq5mN-LsbrHReCmgGLwAAAAAF4HabRjYW1pbG9oaW5vam9zYQ==",
        credential: "320899dc-2980-11ea-810a-06374c00029e",
        urls: [
            "turn:sp-turn1.xirsys.com:80?transport=udp",
            "turn:sp-turn1.xirsys.com:3478?transport=udp",
            "turn:sp-turn1.xirsys.com:80?transport=tcp",
        ]
     }]
}

function CreateVideo(stream){
    video.srcObject = stream
    video.play()
}

document.getElementById('stream').onclick=function(){
    navigator.mediaDevices.getUserMedia({ video: true, audio: true })
    .then(stream=>{
        socket.emit('NewClientStreamer')
        video.srcObject = stream
        video.play()

        socket.on('CreateClientStreamerPeer',function(){
            let peer = new Peer({ 
                initiator:true,
                config:configuration,
                iceTransportPolicy: 'relay', 
                stream: stream, 
                trickle:true
            })
            peer.on('stream',function(stream){
                CreateVideo(stream)
            })
            peer.on('close',function(){
                document.getElementById("peerVideo").remove()
                peer.destroy()
            })
            peer.on('signal', function(data){
                if(!client.gotAnswer)
                    socket.emit('Offer',data)
            })
            client.peer=peer
        })

        socket.on('Answer',function(answer){
            client.gotAnswer=true
            client.peer.signal(answer)        
        })

    })
    .catch(err=>document.write(err))
}

document.getElementById('receive').onclick=function(){

    socket.emit('NewClientReceiver')

    socket.on('Offer',function(offer){
        let peer = new Peer({ 
            initiator: false,
            trickle:true
         })
        peer.on('stream',function(stream){
            CreateVideo(stream)
        })
        peer.on('signal', function(data){
            socket.emit('ClientAnswer',data)
        })
        peer.signal(offer)
        client.peer=peer
    })
}

服务器端:

const express = require('express')
const app = express()
const http = require('http').Server(app)
const io = require('socket.io')(http)
const port = process.env.PORT || 3000

const Peer=require('simple-peer')
const wrtc=require('wrtc')

var Streamer={}
var Receiver={}



var configuration={
    iceServers: [{
        urls: [ "stun:sp-turn1.xirsys.com" ]
     }, {
        username: "LdzgXD2MWspU8qKuKIa9nYv02AqPhqD_qOeFSCsJfBjaCwq5mN-LsbrHReCmgGLwAAAAAF4HabRjYW1pbG9oaW5vam9zYQ==",
        credential: "320899dc-2980-11ea-810a-06374c00029e",
        urls: [
            "turn:sp-turn1.xirsys.com:80?transport=udp",
            "turn:sp-turn1.xirsys.com:3478?transport=udp",
            "turn:sp-turn1.xirsys.com:80?transport=tcp",
        ]
     }]
}

app.use(express.static(__dirname + "/public"))

io.on('connection', function(socket){

    socket.on('NewClientStreamer',function(){
        socket.emit('CreateClientStreamerPeer')
    })

    function InitializeReceiver(offer){
        var receiver={}
        let peer = new Peer({
            initiator:false,
            config:configuration,
            iceTransportPolicy: 'any',
            wrtc:wrtc,
            trickle:true
         })
        peer.on('signal', (data) => {
            socket.emit('Answer',data)
        })
        peer.on('close',function(){
            //
        })
        peer.on('stream',function(stream){
            receiver.stream=stream
            receiver.peer=peer
            Receiver=receiver
        })
        peer.signal(offer)
    }

    socket.on('Offer',function(offer){
        InitializeReceiver(offer)
    })

    socket.on('NewClientReceiver',function(){
        var streamer={}
        streamer.gotAnswer=false
        let peer = new Peer({
            initiator:true,
            config:configuration,
            iceTransportPolicy: 'any',
            wrtc:wrtc,
            stream: Receiver.stream, 
            trickle:true
        })
        peer.on('signal', function(offer){
            if(!streamer.gotAnswer)
                socket.emit('Offer',offer)
        })
        peer.on('connect',function(){
            Streamer=streamer
        })
        streamer.peer=peer

        socket.on('ClientAnswer',function(data){    
            streamer.gotAnswer=true
            streamer.peer.signal(data)  
        })
    })




})

http.listen(port,() => console.log(`Active on ${port} port`))

WebRTC -Chrome-webRTC 内部

标签: node.jsvideo-streamingwebrtcbroadcastmulticast

解决方案


我已经检测到为什么我的凭据与代码不一样的问题,这是因为我忘记运行 watchify 来修改基于 main.js 的 bundle.js 脚本

这些是我的新 webRTC chrome 内部结构。现在凭据匹配,但它仍然没有运行。谢谢你,伊戈尔·赫沃斯坚科夫。

这是运行新仓库的应用程序的链接:https ://bolx-tests.herokuapp.com/


推荐阅读