node.js - 使用 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 内部
解决方案
我已经检测到为什么我的凭据与代码不一样的问题,这是因为我忘记运行 watchify 来修改基于 main.js 的 bundle.js 脚本
这些是我的新 webRTC chrome 内部结构。现在凭据匹配,但它仍然没有运行。谢谢你,伊戈尔·赫沃斯坚科夫。
这是运行新仓库的应用程序的链接:https ://bolx-tests.herokuapp.com/
推荐阅读
- python - 如何使用 Python 在 for 循环中将 json 对象写入和读取到谷歌云中的文件
- primefaces - 如何在过滤后更新和显示 p:dataTable 中的记录数?
- excel - 工作表声明出错
- c++ - 在 mac 命令行开发人员工具中找不到执行头 C++
- sed - 使用 sed 更新 json - Docker 容器
- android - Cordova Android 不发送 AJAX 请求
- python - 寻找第 n 个回文素数 - 我哪里做错了?
- objective-c - Objective-C 类属性类型未暴露给 Swift
- javascript - 在 ReactJs 中将状态从一个组件传递到另一个组件
- streaming - 如何部署将文件加载到内存中的 Google 数据流工作者?