javascript - 在 Node Js 中,我如何写入从视频上传的文件块
问题描述
我想要做的是将网络摄像头或音频流上传到 Nodejs 并将其保存到磁盘。目标是在数据可用时立即将数据块发送到服务器。我从 gerUserMedia 中获取了流,设置了 mediaRecorder,当数据可用时,我将 blob 转换为 arrayBuffer 并将其发送到服务器。我知道代码是错误的,因为我不确定正确的方法是什么,但是当数据发送到服务器时,会保存一个文件,但只有 1kb 的文件,它应该是一个大的视频文件。我怎样才能做到这一点?
//Client Side
recorder.ondataavailable = (event) => {
const reader = new FileReader();
reader.onload = (event) =>{
recordedChunks.push(event.data);
sendDataToServer(event.target.result)
}
reader.readAsArrayBuffer(event.data)
}
reader.readAsArrayBuffer(event.data)
//Server-Side
app.post('/media', function (req, res, next) {
try {
const { data } = req.body;
const dataBuffer = new Buffer(data, 'base64');
const fileStream = fs.createWriteStream('video.webm');
fileStream.write(dataBuffer);
} catch (error) {
console.log(error);
}
})
解决方案
您可以使用 WebSockets 将记录的块从您的客户端发送到您的节点 js 服务器
const ws = new WebSocket("your server websocket url");
ws.onopen = function () {
console.log('WebSocket Client Connected');
};
ws.onmessage = function (e) {
console.log("Received: '" + e.data + "'");
};
rec.ondataavailable = (event) => {
console.log(event.data)
this.blobs.push(event.data);
this.blob = new Blob(this.blobs, { type: 'video/webm' });
if (event.data && event.data.size > 0) {
ws.send(event.data)
}
};
//服务器
const http = require('http');
var WebSocketServer = require('websocket').server;
var fs = require('fs');
const hostname = 'localhost';
const port = 8080;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello Worldss12');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
wsServer = new WebSocketServer({
httpServer: server,
maxReceivedFrameSize: 2048000, // Added this line
maxReceivedMessageSize: 2048000, // And this line
});
wsServer.on('request', function (request) {
const connection = request.accept(null, request.origin);
connection.binaryType = 'blob';
let fileStream = fs.createWriteStream('recording.webm', { flags: 'a' });
connection.on('message', function (message) {
if (message.type === 'utf8') {
console.log('Received Message: ' + message.utf8Data)
connection.sendUTF('Hi this is WebSocket servers');
}
else if (message.type === 'binary') {
var fileBuffer = new Buffer(message.binaryData, 'base64');
fileStream.write(fileBuffer);
connection.sendUTF(message.binaryData.length)
//connection.sendBytes(message.binaryData)
}
});
connection.on('close', function (reasonCode, description) {
console.log('Client has disconnected.');
});
});
推荐阅读
- c++ - srand() 与非常量参数一起使用时不起作用
- c# - WaitTimeSeconds 的 MassTransit 默认值
- typescript - Electron v14 TypeScript 类型定义中缺少 enableRemoteModule
- java - 从 mongodb 获取随机值
- json - JSON:键和字段名称:动态解析
- python-3.x - 数据框 - 根据给定列的先前和当前行值创建新列
- ruby-on-rails - OOP 如何转化为 Rails?
- ssh - 通过 ssh 远程启动前台程序/脚本
- prolog - Prolog中的谓词,谓词仅适用于数字
- javascript - 如何使用 document.getElementById 将 CSS 切换为“display:none”