Node.js 将blob保存为单个webm文件

Node.js 将blob保存为单个webm文件,node.js,socket.io,sails.js,webrtc,get-display-media,Node.js,Socket.io,Sails.js,Webrtc,Get Display Media,我通过webrtc录制用户屏幕,然后使用MediaStreamRecorder每隔x秒发布一次视频blob。在服务器端,我在sails中设置了一个操作,将blob保存为webm文件 问题是我无法让它附加数据,并创建一个大的webm文件。当它追加文件时,文件大小会像预期的那样增加,因此数据会追加,但是当我播放文件时,它会播放第一秒,根本不播放,或者播放但不显示视频 可以将文件与ffmpeg合并,但如果可能的话,我宁愿避免这种情况 以下是客户端上的代码: 'use strict'; // Pol

我通过webrtc录制用户屏幕,然后使用MediaStreamRecorder每隔x秒发布一次视频blob。在服务器端,我在sails中设置了一个操作,将blob保存为webm文件

问题是我无法让它附加数据,并创建一个大的webm文件。当它追加文件时,文件大小会像预期的那样增加,因此数据会追加,但是当我播放文件时,它会播放第一秒,根本不播放,或者播放但不显示视频

可以将文件与ffmpeg合并,但如果可能的话,我宁愿避免这种情况

以下是客户端上的代码:

'use strict';


// Polyfill in Firefox.
// See https://blog.mozilla.org/webrtc/getdisplaymedia-now-available-in-adapter-js/
if (typeof adapter != 'undefined' && adapter.browserDetails.browser == 'firefox') {
  adapter.browserShim.shimGetDisplayMedia(window, 'screen');
}

io.socket.post('/processvideo', function(resData) {
    console.log("Response: " + resData);
});

function handleSuccess(stream) {
  const video = document.querySelector('video');
  video.srcObject = stream;

var mediaRecorder = new MediaStreamRecorder(stream);
mediaRecorder.mimeType = 'video/webm';
mediaRecorder.ondataavailable = function (blob) {
    console.log("Sending Data");
    //var rawIO = io.socket._raw;
    //rawIO.emit('some:event', "using native socket.io");

    io.socket.post('/processvideo', {"vidblob": blob}, function(resData) {
        console.log("Response: " + resData);
    });
};
mediaRecorder.start(3000);
}

function handleError(error) {
  errorMsg(`getDisplayMedia error: ${error.name}`, error);
}

function errorMsg(msg, error) {
  const errorElement = document.querySelector('#errorMsg');
  errorElement.innerHTML += `<p>${msg}</p>`;
  if (typeof error !== 'undefined') {
    console.error(error);
  }
}

if ('getDisplayMedia' in navigator) {
  navigator.getDisplayMedia({video: true})
    .then(handleSuccess)
    .catch(handleError);
} else {
  errorMsg('getDisplayMedia is not supported');
}

任何帮助都将不胜感激

我认为这很难开发,也不太符合项目要求。所以我决定建立一个电子应用程序。只需发布此消息,我就可以解决问题。

您应该能够简单地将数据连接在一起。MediaRecorder将生成有效的WebM文件。
module.exports = async function processVideo (req, res) {
    var fs          = require('fs'),
        path        = require('path'),
        upload_dir  = './assets/media/uploads',
        output_dir  = './assets/media/outputs',
        temp_dir = './assets/media/temp';

    var params = req.allParams();
    if(req.isSocket && req.method === 'POST') {
        _upload(params.vidblob, "test.webm");
        return res.send("Hi There");
    }
    else {
        return res.send("Unknown Error");
    }

    function _upload(file_content, file_name) {
        var fileRootName = file_name.split('.').shift(),
        fileExtension = file_name.split('.').pop(),
        filePathBase = upload_dir + '/',
        fileRootNameWithBase = filePathBase + fileRootName,
        filePath = fileRootNameWithBase + '.' + fileExtension,
        fileID = 2;



        /* Save all of the files as different files. */
        /*
        while (fs.existsSync(filePath)) {
            filePath = fileRootNameWithBase + fileID +  '.' + fileExtension;
            fileID += 1;
        }
        fs.writeFileSync(filePath, file_content);
        */

        /* Appends the binary data like you'd expect, but it's not playable. */
        fs.appendFileSync(upload_dir + '/' + 'test.file', file_content);

    }
}