【问题标题】:In Node Js, how can I write to file chunks uploaded from a video在 Node Js 中,我如何写入从视频上传的文件块
【发布时间】:2020-08-15 08:44:54
【问题描述】:

我正在尝试将网络摄像头或音频流上传到 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);

  }

  })

【问题讨论】:

    标签: javascript node.js express webrtc getusermedia


    【解决方案1】:

    您可以使用 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.');
            
        });
    });
    

    【讨论】:

      【解决方案2】:

      我会调查formidable,它为您提供了一些帮助文件上传的好东西。他们还有一个使用express 的示例。

      form.on('progress', (bytesReceived, bytesExpected) => {});

      试一试,如果您有其他问题,请告诉我们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-11
        • 2020-06-27
        相关资源
        最近更新 更多