Как сохранить мой кулачковый поток в моем узле сервера в реальном времени js? - PullRequest
0 голосов
/ 29 июня 2019

как я могу сохранить свои куски потоков, которые конвертируются в BLOB-объекты в моем узле на сервере js в режиме реального времени

client.js | Я являюсь моим кулачковым потоком как двоичный файл для моего узла js server

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

как я могу сохранить входящие двоичные объекты или двоичный файл в одном видеофайле по окончании видеозаписи.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Похоже, что это дубликат Как объединить куски входящего двоичного файла в узел видео (webm) файла js? , но в настоящее время он не имеет принятого ответа. Я также копирую свой ответ из этого поста в этот:

Я смог заставить это работать, преобразовав кодировку base64 на интерфейс с API FileReader. На сервере создайте новый Buffer из отправленного фрагмента данных и запишите его в поток файлов. Некоторые ключевые вещи с моим примером кода:

  1. Я использую fetch, потому что я не хотел вытягивать axios.
  2. При использовании fetch необходимо убедиться, что вы используете bodyParser на бэкэнде
  3. Я не уверен, сколько данных вы собираете в своих чанках (т. Е. Значение продолжительности, передаваемое методу start объекта MediaRecorder), но вы захотите убедиться, что ваш бэкэнд может обработать размер входящего фрагмента данных. Я установил свой очень высокий на 50MB, но это может не быть необходимым.
  4. Я никогда не закрываю поток записи явно ... вы могли бы сделать это в вашем /final маршруте. В противном случае createWriteStream по умолчанию имеет значение AutoClose, поэтому процесс node сделает это автоматически.

Полный рабочий пример ниже:

Внешний интерфейс:

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

Back End:

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});
  }
});
0 голосов
/ 04 июля 2019

Не пытаясь реализовать это (извините, сейчас нет времени), я бы предложил следующее:

  1. Считайте в Stream Stream API Node, объект экспресс-запроса - http.IncomingMessage,который является читаемым потоком.Это может быть передано в другом потоковом API.https://nodejs.org/api/stream.html#stream_api_for_stream_consumers

  2. Прочитано в API файловой системы Node, оно содержит такие функции, как fs.createWriteStream, которые могут обрабатывать поток чанков и добавлять их в файл с указанием пути по вашему выбору.https://nodejs.org/api/fs.html#fs_class_fs_writestream

  3. После завершения потока в файл, при условии, что имя файла имеет правильное расширение, файл должен воспроизводиться, поскольку буфер, отправляемый через браузер, является просто двоичным потоком.Дальнейшее чтение в Node's Buffer API будет стоить вашего времени.https://nodejs.org/api/buffer.html#buffer_buffer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...