Node.js 如何在我的服务器实时节点js中保存我的cam流?
如何在node js服务器中实时保存转换为blob的流块 client.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)
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或二进制文件存储到一个视频文件中。如果不尝试实现此功能(抱歉,现在没有时间),我建议如下:
http.IncomingMessage
,它是一个可读的流。这可以通过管道传输到另一个基于流的API中fs.createWriteStream
之类的函数,这些函数可以处理块流并附加到文件中,路径由您选择这似乎是的副本,但目前没有可接受的答案。我也在将我的答案从那篇文章复制到这篇文章中: 通过使用
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,这看起来像是一个副本。这上面有悬赏,所以不确定你现在是否可以删除它。。。如果没有,我很乐意在这里提供我的答案:):)