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