首页 > 解决方案 > 在 Node Js 中,我如何写入从视频上传的文件块

问题描述

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

//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);

  }

  })

标签: javascriptnode.jsexpresswebrtcgetusermedia

解决方案


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

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.');
        
    });
});

推荐阅读