在Node Js中,如何写入从视频上传的文件块 [英] In Node Js, how can I write to file chunks uploaded from a video

查看:78
本文介绍了在Node Js中,如何写入从视频上传的文件块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想做的是将网络摄像头或音频流上传到Nodejs并将其保存到磁盘.目的是在数据可用后立即将数据块发送到服务器.我已经从gerUserMedia中获取了流,设置了mediaRecorder,当数据可用时,我将blob转换为arrayBuffer并将其发送到服务器.我知道代码是错误的,因为我不确定正确的方法是什么,但是当数据发送到服务器时,将保存一个文件,但仅保存1kb的文件,该文件应为大视频文件.我该怎么办?

What I'm trying to do is upload a webcam or audio stream to Nodejs and save it to disk. The goal is to send the data chunks to the server as soon as the data becomes available. I've grabbed the stream from gerUserMedia, setup mediaRecorder and when data is available, I turn the blob into a arrayBuffer and send it to the server. I know the code is wrong as I'm not sure what the proper way is, but when the data is sent to the server, a file is saved, but only 1kb file, where it should be a large video file. How can I do this?

//Client Side

recorder.ondataavailable = (event) => {
      const reader = new FileReader();
      reader.onload = (event) =>{
        recordedChunks.push(event.data);
        sendDataToServer(event.target.result)
      }
      reader.readAsArrayBuffer(event.data)
    }
reader.readAsArrayBuffer(event.data)


//Server-Side

app.post('/media', function (req, res, next) { 

  try {
    const { data } = req.body;
    const dataBuffer = new Buffer(data, 'base64');
    const fileStream = fs.createWriteStream('video.webm');
    fileStream.write(dataBuffer);

  } catch (error) {
    console.log(error);

  }

  })

推荐答案

您可以使用WebSockets将记录的块从客户端发送到节点js服务器

you can use WebSockets to send recorded chunks from your client to your node js server

const ws = new WebSocket("your server websocket url");
ws.onopen = function () {
  console.log('WebSocket Client Connected');
  
};
ws.onmessage = function (e) {
  console.log("Received: '" + e.data + "'");
};

rec.ondataavailable = (event) => {
  console.log(event.data)
  this.blobs.push(event.data);
  this.blob = new Blob(this.blobs, { type: 'video/webm' });

  if (event.data && event.data.size > 0) {
    ws.send(event.data)

  }
};

//服务器

const http = require('http');
var WebSocketServer = require('websocket').server;
var fs = require('fs');

const hostname = 'localhost';
const port = 8080;
const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello Worldss12');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

wsServer = new WebSocketServer({
    httpServer: server,
    maxReceivedFrameSize: 2048000,    // Added this line
    maxReceivedMessageSize: 2048000,    // And this line
    
});


wsServer.on('request', function (request) {
    const connection = request.accept(null, request.origin);
    connection.binaryType = 'blob';
    let fileStream = fs.createWriteStream('recording.webm', { flags: 'a' });

    connection.on('message', function (message) {


        if (message.type === 'utf8') {
            console.log('Received Message: ' + message.utf8Data)
            connection.sendUTF('Hi this is WebSocket servers');
        }
        else if (message.type === 'binary') {
            var fileBuffer = new Buffer(message.binaryData, 'base64');
            fileStream.write(fileBuffer);
            connection.sendUTF(message.binaryData.length)
            //connection.sendBytes(message.binaryData)
            
        }
        

    });
    connection.on('close', function (reasonCode, description) {
        console.log('Client has disconnected.');
        
    });
});

这篇关于在Node Js中,如何写入从视频上传的文件块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆