【问题标题】:Video stream from client to server in NodeJSNodeJS中从客户端到服务器的视频流
【发布时间】:2022-01-21 17:08:38
【问题描述】:

我目前正在开发一个应用程序,用于在 NodeJS 中将视频源从客户端流式传输到服务器。服务端代码如下图

server.js

const express = require('express')
const app = express()
const morgan = require('morgan')
const server = require('http').Server(app)
const io = require('socket.io')(server)
const auth = require('./routes/auth')
const video = require('./routes/videoproc')(io)


const bodyParser = require('body-parser')


app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(morgan('dev'))
app.use("/users", auth)
app.use("/exam", video);


server.listen(3000)

videoproc.js

const express = require('express')
const video = express.Router()
const ss = require('socket.io-stream')
const fs  = require('fs')
const path = require('path')

module.exports = (io) => {
    video.post('/video', (req, res) => {
        io.on('connection', (socket) => {
            ss(socket).on('video', (stream, data) => {
                const fileName = path.basename('test')
                stream.pipe(fs.createWriteStream(fileName))
            })
        })
    })
    return video
}

这是客户端代码

var io = require('socket.io-client');
var ss = require('socket.io-stream');
var fs = require('fs')
var socket = io.connect('http://localhost:3000/exam/video/');
var stream = ss.createStream();
var filename = './test.webm';
 
ss(socket).emit('video', stream, {name: filename});
fs.createReadStream(filename).pipe(stream);

作为测试,我已经向服务器发送了一个视频源,但该文件没有被存储,感谢您帮助解决这个问题。

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    您应该使用的服务器:

    const bodyParser = require('body-parser')
    
    
    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({extended: true}))
    app.use(morgan('dev'))
    // app.use("/users", auth)
    app.use("/exam", video);
    
    io.on('connection', (socket) => {
        console.log('CONNECTED');
        ss(socket).on('video', (stream, data) => {
            console.log('RECEIVED');
            const fileName = path.basename('test')
            stream.pipe(fs.createWriteStream(fileName))
        })
    })
    server.listen(3000)
    

    和客户端:连接函数中的参数只是“http://localhost:3000/”,排除路由

    var socket = io.connect('http://localhost:3000/');
    var stream = ss.createStream();
    var filename = './test.webm';
     
    ss(socket).emit('video', stream, {name: filename});
    fs.createReadStream(filename).pipe(stream);
    

    在客户端:连接到域,而不是路由: ref

    在服务器端:你将 io.on 放在路由上,io.on 只是在你调用路由时监听。如果你想在服务器启动时运行,你应该把 io.on 放在路由之外

    【讨论】:

    • 感谢您的回复,当我从网络摄像头流式传输时,文件会保存为块吗?
    • 网络摄像头在流式传输时使用什么协议?文件的保存方式取决于您要保存的格式。您可以控制此
    • 如果上面的答案可以解决你的问题,请给它一个绿色的勾
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多