从MediaRecorder Blob部件创建新的Blob会导致空Blob

时间:2018-11-04 16:32:52

标签: javascript vue.js

我在new Blob构造函数中遇到了一个非常奇怪的行为。我有一个由MediaRecorder返回的Blob数组:

blobs from MediaRecorder

现在,我似乎无法在代码中对这个Blob做任何事情。在我的代码中运行new Blob(audioChunks)会导致输出一个空数组,但是在控制台中运行同一命令会正确创建一个新的Blob!这是完整的方法:

navigator.mediaDevices.getUserMedia({ audio: true }).then(stream => {
        const mediaRecorder = new MediaRecorder(stream);
        mediaRecorder.start();

        const audioChunks = [];
        mediaRecorder.addEventListener("dataavailable", event => {
          audioChunks.push(event.data);
        });

        sleep(1000).then(r => {
          mediaRecorder.stop();
          console.log(audioChunks) // Show the audioChunks
          console.log(new Blob(audioChunks)) // Show the failed blob
          let audio = new File(new Blob(audioChunks), `${name}.webm`, {
            type: "audio/webm;codecs=opus"
          });
          global.addTrack("filename", audio, id);
          console.log(audioChunks)
        });
      });

当我单击触发它的按钮时,将获得以下控制台输出:

console output with errors

这是Vue.js中的一种方法,但不确定是否真的有所作为。

1 个答案:

答案 0 :(得分:0)

您可能会遇到的一个问题是,您没有在mediaRecorder.start()中设置时间片,因此在获取任何数据之前会触发睡眠超时。 (这只是这么短的测试的问题)

设置较小的时间片(例如100ms):

mediaRecorder.start(100);

您还会遇到其他一些问题,但这可以回答您的第一个问题。

仅供参考,您可以将blob数组传递给新的File(),对我来说,它是在blob的blob上倒转。我将其更改为此并成功:

let audio = new File(audioChunks, `${name}.webm`, {
    type: "audio/webm;codecs=opus"
});

我不知道此行的预期目的:

global.addTrack("filename", audio, id);

我在这里收到“ Uncaught ReferenceError:未定义全局”。这是做什么用的?