在浏览器上,我们创建了一个
MediaRecorder
实例并使用它来录制音频。当我们停止记录时,我们会尝试将数据(此时是 Blob)上传到 NodeJS 服务,然后该服务将数据写入文件。
上传成功,但写入服务器的文件不是有效的音频文件。
我们将文件写入 Socket.IO 套接字,如下所示:
recorder.ondataavailable = async (chunk) => {
console.log(`Mime type: ${recorder.mimeType}`);
console.log(`blowing chunks`);
chunks.value.push(chunk.data);
const result = await socket.emitWithAck('data', chunk.data);
console.log(result);
};
在服务器上接收它,如下所示:
socket.on('data', async (data: Buffer, ack) => {
try {
writeFileSync('data/testfile.ogg', data);
ack('saved');
} catch (err) {
console.log(err);
// throw (err);
}
});
(我们也尝试过
appendFile
,但客户端的“ondataavailable”仅在我们此时停止录制时才会被触发,因此使用追加或写入没有任何可能性,写入使我们免于一直手动删除文件。 )
根据 MediaRecorder.mimeType,音频的媒体类型为
audio/ogg
。
数据客户端和服务器端的大小是相同的,因此在保存时看起来不会丢失一些数据。
使用 NodeJS 保存应该是编码的 ogg 音频文件的二进制数据的正确方法是什么?
我知道我的回答迟了,但根据https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send:
指定 Blob 会将 Blob 的原始数据排入队列,以便在 二进制帧(Blob.type 被忽略)。 bufferedAmount 的值 增加原始数据的字节大小。
因此,您必须将 mime 类型添加回原始数据。这是执行此操作的公认答案:https://stackoverflow.com/a/50875615/1079320