【问题标题】:Creating new Blob from MediaRecorder blob parts results in empty Blob从 MediaRecorder blob 部分创建新的 Blob 会导致空 Blob
【发布时间】:2018-11-05 09:41:44
【问题描述】:

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

现在,我似乎无法从我的代码中对这个 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)
        });
      });

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

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

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

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

    要设置更小的时间片(例如 100 毫秒):

    mediaRecorder.start(100);
    

    您还会遇到一些其他问题,但这回答了您最初的问题。

    仅供参考,您可以将 blob 数组传递给 new File(),它对我来说是一个 blob。我把它改成了这个,它成功了:

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

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

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

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

    【讨论】:

    • 感谢您的回复,但首先这是不正确的。我正在获取数据,正如您从返回的包含字节的 blob 中看到的那样。问题是将 blob 转换为字节给了我一个空 blob
    • 必须依赖于平台。那是我遇到的第一个问题。 AudioChunks 已经是一个博客数组。为什么你认为你需要用它制作一个新的 Blob?
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2020-10-19
    • 2015-03-18
    • 2018-02-13
    相关资源
    最近更新 更多