【发布时间】:2019-11-11 13:03:31
【问题描述】:
我正在尝试将 base64 块上传到节点 js 服务器并将这些块保存到一个文件中
let chunks = [];
app.post('/api', (req, res) => {
let {blob} = req.body;
//converting chunks of base64 to buffer
chunks.push(Buffer.from(blob, 'base64'));
res.json({gotit:true})
});
app.post('/finish', (req, res) => {
let buf = Buffer.concat(chunks);
fs.writeFile('finalvideo.webm', buf, (err) => {
console.log('Ahh....', err)
});
console.log('SAVED')
res.json({save:true})
});
上面代码的问题是视频无法播放,我不知道为什么我真的做错了什么,我也尝试过可写流它也不起作用
更新 - 我
我没有发送 blob,而是实现了发送二进制文件,但即使我面临TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object. 之类的问题
client.js
postBlob = async blob => {
let arrayBuffer = await new Response(blob).arrayBuffer();
let binary = new Uint8Array(arrayBuffer)
console.log(binary) // logging typed Uint8Array
axios.post('/api',{binary})
.then(res => {
console.log(res)
})
};
server.js
let chunks = [];
app.post('/api', (req, res) => {
let {binary} = req.body;
let chunkBuff = Buffer.from(binary) // This code throwing Error
chunks.push(chunkBuff);
console.log(chunkBuff)
res.json({gotit:true})
});
//Somehow combine those chunks into one file
app.post('/finish', (req, res) => {
console.log('Combinig the files',chunks.length);
let buf = Buffer.concat(chunks);
console.log(buf) //empty buff
fs.writeFile('save.webm', buf, (err) => {
console.log('Ahh....', err)
});
res.json({save:true})
});
更新 - II
我能够接收二进制块并附加到流中,但在最终视频中,只有第一个块正在播放,我不知道其他块发生了什么,视频结束了。
代码
const writeMyStream = fs.createWriteStream(__dirname+'/APPENDED.webm', {flags:'a', encoding:null});
app.post('/api', (req, res) => {
let {binary} = req.body;
let chunkBuff = Buffer.from(new Uint8Array(binary));
writeMyStream.write(chunkBuff);
res.json({gotit:true})
});
更新 - III
我的客户代码 |注意:我已经尝试过其他方式来上传已注释掉的 blob
customRecordStream = stream => {
let recorder = new MediaStreamRecorder(stream);
recorder.mimeType = 'video/webm;codecs=vp9';
recorder.ondataavailable = this.postBlob
recorder.start(INT_REC)
};
postBlob = async blob => {
let arrayBuffer = await new Response(blob).arrayBuffer();
let binary = new Uint8Array(arrayBuffer)
axios.post('/api',{binary})
.then(res => {
console.log(res)
})
// let binaryUi8 = new Uint8Array(arrayBuffer);
// let binArr = Array.from(binaryUi8);
// // console.log(new Uint8Array(arrayBuffer))
//
// console.log(blob);
// console.log(binArr)
// let formData = new FormData();
// formData.append('fname', 'test.webm')
// formData.append("file", blob);
//
// console.log(formData,'Checjk Me',blob)
// axios({
// method:'post',
// url:'/api',
// data:formData,
// config: { headers: {'Content-Type': 'multipart/form-data' }}
// }).then(res => {
// console.log(res,'FROM SERBER')
//
// })
//
//
// .then(res => {
// console.log(res)
// })
// this.blobToDataURL(blob, (blobURL) => {
//
// axios.post('/api',{blob:blobURL})
// .then(res => {
// console.log(res)
// })
// })
};
【问题讨论】:
-
为什么base-64编码这个?很有可能,您的编码/解码分段错误。只需发送二进制数据,效率会高得多!
-
发送二进制数据听起来不错,但我可以将这些二进制文件合并到一个视频文件中吗?
-
是的,最好的办法就是将流写入文件。但是如果你不能这样做,你也可以追加到一个文件,或者写一系列的缓冲区等等。
-
如果你发布一个例子会很棒
-
这有 6 个不同的部分。贴一个具体的例子。例如,发布一个问题,询问如何将二进制文件放入服务器,并显示您目前拥有的代码。然后,发布一个关于在 Node.js 中接收它的问题,并显示到目前为止的代码。
标签: node.js buffer fs getusermedia arraybuffer