Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在我的服务器实时节点js中保存我的cam流?_Node.js_Express_Getusermedia_Navigator_Mediadevices - Fatal编程技术网

Node.js 如何在我的服务器实时节点js中保存我的cam流?

Node.js 如何在我的服务器实时节点js中保存我的cam流?,node.js,express,getusermedia,navigator,mediadevices,Node.js,Express,Getusermedia,Navigator,Mediadevices,如何在node js服务器中实时保存转换为blob的流块 client.js |我是节点js服务器的二进制cam流 handleBlobs = async (blob) => { let arrayBuffer = await new Response(blob).arrayBuffer() let binary = new Uint8Array(arrayBuffer) this.postBlob(binary)

如何在node js服务器中实时保存转换为blob的流块

client.js |我是节点js服务器的二进制cam流

    handleBlobs = async (blob) => {

        let arrayBuffer = await new Response(blob).arrayBuffer()

        let binary = new Uint8Array(arrayBuffer)

        this.postBlob(binary)


    };

 postBlob = blob => {

        axios.post('/api',{blob})
            .then(res => {
                console.log(res)
            })
    };
server.js

app.post('/api', (req, res) => {
    console.log(req.body)
});

如何在视频录制完成后将传入的blob或二进制文件存储到一个视频文件中。

如果不尝试实现此功能(抱歉,现在没有时间),我建议如下:

  • 读入节点的流API,express请求对象是一个
    http.IncomingMessage
    ,它是一个可读的流。这可以通过管道传输到另一个基于流的API中

  • 读入节点的文件系统API,它包含诸如
    fs.createWriteStream
    之类的函数,这些函数可以处理块流并附加到文件中,路径由您选择

  • 完成流到文件后,只要文件名具有正确的扩展名,文件就应该可以播放,因为通过浏览器发送的缓冲区只是一个二进制流。进一步阅读节点的缓冲区API是值得的。


  • 这似乎是的副本,但目前没有可接受的答案。我也在将我的答案从那篇文章复制到这篇文章中:

    通过使用
    FileReader
    api在前端转换为base64编码,我能够实现这一点。在后端,从发送的数据块创建一个新的
    缓冲区
    ,并将其写入文件流。我的代码示例中的一些关键内容:

  • 我正在使用
    fetch
    ,因为我不想拉入
    axios
  • 使用
    fetch
    时,必须确保在后端使用
    bodyParser
  • 我不确定在块中收集了多少数据(即传递给
    MediaRecorder
    对象上的
    start
    方法的持续时间值),但您需要确保后端能够处理传入的数据块的大小。我将我的设置为非常高的
    50MB
    ,但这可能不是必需的
  • 我从不显式关闭写入流。。。您可以在您的
    /final
    路线中执行此操作。否则,
    createWriteStream
    默认为自动关闭,因此
    节点将自动关闭
    完整的工作示例如下:

    前端:

    const mediaSource = new MediaSource();
    mediaSource.addEventListener('sourceopen', handleSourceOpen, false);
    let mediaRecorder;
    let sourceBuffer;
    
    function customRecordStream(stream) {
      // should actually check to see if the given mimeType is supported on the browser here.
      let options = { mimeType: 'video/webm;codecs=vp9' };
      recorder = new MediaRecorder(window.stream, options);
      recorder.ondataavailable = postBlob 
      recorder.start(INT_REC)
    };
    
    function postBlob(event){
      if (event.data && event.data.size > 0) {
        sendBlobAsBase64(event.data);
      }
    }
    
    function handleSourceOpen(event) {
      sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"');
    } 
    
    function sendBlobAsBase64(blob) {
      const reader = new FileReader();
    
      reader.addEventListener('load', () => {
        const dataUrl = reader.result;
        const base64EncodedData = dataUrl.split(',')[1];
        console.log(base64EncodedData)
        sendDataToBackend(base64EncodedData);
      });
    
      reader.readAsDataURL(blob);
    };
    
    function sendDataToBackend(base64EncodedData) {
      const body = JSON.stringify({
        data: base64EncodedData
      });
      fetch('/api', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body
      }).then(res => {
        return res.json()
      }).then(json => console.log(json));
    }; 
    
    
    const fs = require('fs');
    const path = require('path');
    const express = require('express');
    const bodyParser = require('body-parser');
    const app = express();
    const server = require('http').createServer(app);
    
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json({ limit: "50MB", type:'application/json'}));
    
    app.post('/api', (req, res) => {
      try {
        const { data } = req.body;
        const dataBuffer = new Buffer(data, 'base64');
        const fileStream = fs.createWriteStream('finalvideo.webm', {flags: 'a'});
        fileStream.write(dataBuffer);
        console.log(dataBuffer);
        return res.json({gotit: true});
      } catch (error) {
        console.log(error);
        return res.json({gotit: false});
      }
    });
    
    后端:

    const mediaSource = new MediaSource();
    mediaSource.addEventListener('sourceopen', handleSourceOpen, false);
    let mediaRecorder;
    let sourceBuffer;
    
    function customRecordStream(stream) {
      // should actually check to see if the given mimeType is supported on the browser here.
      let options = { mimeType: 'video/webm;codecs=vp9' };
      recorder = new MediaRecorder(window.stream, options);
      recorder.ondataavailable = postBlob 
      recorder.start(INT_REC)
    };
    
    function postBlob(event){
      if (event.data && event.data.size > 0) {
        sendBlobAsBase64(event.data);
      }
    }
    
    function handleSourceOpen(event) {
      sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"');
    } 
    
    function sendBlobAsBase64(blob) {
      const reader = new FileReader();
    
      reader.addEventListener('load', () => {
        const dataUrl = reader.result;
        const base64EncodedData = dataUrl.split(',')[1];
        console.log(base64EncodedData)
        sendDataToBackend(base64EncodedData);
      });
    
      reader.readAsDataURL(blob);
    };
    
    function sendDataToBackend(base64EncodedData) {
      const body = JSON.stringify({
        data: base64EncodedData
      });
      fetch('/api', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body
      }).then(res => {
        return res.json()
      }).then(json => console.log(json));
    }; 
    
    
    const fs = require('fs');
    const path = require('path');
    const express = require('express');
    const bodyParser = require('body-parser');
    const app = express();
    const server = require('http').createServer(app);
    
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json({ limit: "50MB", type:'application/json'}));
    
    app.post('/api', (req, res) => {
      try {
        const { data } = req.body;
        const dataBuffer = new Buffer(data, 'base64');
        const fileStream = fs.createWriteStream('finalvideo.webm', {flags: 'a'});
        fileStream.write(dataBuffer);
        console.log(dataBuffer);
        return res.json({gotit: true});
      } catch (error) {
        console.log(error);
        return res.json({gotit: false});
      }
    });
    

    看看这个:看起来他做了一些类似于你想要的事情。感谢分享我已经读了那篇文章,但是我从客户那里得到了大量数据,所以这篇文章可能没有帮助。Hi-Nane,这看起来像是一个副本。这上面有悬赏,所以不确定你现在是否可以删除它。。。如果没有,我很乐意在这里提供我的答案:):)