通过 Socket.io 流式传输 MediaRecorder Blob

问题描述 投票:0回答:1

在浏览器上,我们创建了一个

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 音频文件的二进制数据的正确方法是什么?

node.js socket.io web-mediarecorder
1个回答
0
投票

我知道我的回答迟了,但根据https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send

指定 Blob 会将 Blob 的原始数据排入队列,以便在 二进制帧(Blob.type 被忽略)。 bufferedAmount 的值 增加原始数据的字节大小。

因此,您必须将 mime 类型添加回原始数据。这是执行此操作的公认答案:https://stackoverflow.com/a/50875615/1079320

© www.soinside.com 2019 - 2024. All rights reserved.