javascript - mediarecorder api 通过 Web Audio api 播放(不是音频元素)

标签 javascript web-audio-api mediarecorder

我在从 mediaRecorder api 获取捕获的 blob 以在 Chrome 中播放时遇到问题(它适用于 Firefox)。不确定这是否是 Chrome 中的错误。

它报告的错误:

undefined:1 Uncaught (in promise) DOMException: Unable to decode audio data



 window.AudioContext = window.AudioContext || window.webkitAudioContext;
navigator.getUserMedia = (navigator.getUserMedia ||
                          navigator.webkitGetUserMedia ||
                          navigator.mozGetUserMedia ||
                          navigator.msGetUserMedia);

var context = new AudioContext();

var record = document.querySelector('#record');
var stop = document.querySelector('#stop');

if (navigator.getUserMedia) {
  console.log('getUserMedia supported.');

  var constraints = {
    audio: true
  };
  var chunks = [];

  var onSuccess = function(stream) {
    var mediaRecorder = new MediaRecorder(stream);
    record.onclick = function() {
      mediaRecorder.start();
      console.log(mediaRecorder.state);
      console.log("recorder started");
      record.style.background = "red";
      stop.disabled = false;
      record.disabled = true;
    }

    stop.onclick = function() {
      mediaRecorder.stop();
      console.log(mediaRecorder.state);
      console.log("recorder stopped");
      record.style.background = "";
      record.style.color = "";

      stop.disabled = true;
      record.disabled = false;
    }

    mediaRecorder.onstop = function(e) {
      console.log("onstop() called.", e);

      var blob = new Blob(chunks, {
        'type': 'audio/wav'
      });
      chunks = [];

      var reader = new FileReader();
      reader.addEventListener("loadend", function() {
        context.decodeAudioData(reader.result, function(buffer) {
          playsound(buffer);
        },
        function(e) {
          console.log("error ", e)
        });
      });
      reader.readAsArrayBuffer(blob);
    }

    mediaRecorder.ondataavailable = function(e) {
      chunks.push(e.data);
    }
  }

  var onError = function(err) {
    console.log('The following error occured: ' + err);
  }

  navigator.getUserMedia(constraints, onSuccess, onError);

} else {
  console.log('getUserMedia not supported on your browser!');
}

function playsound(thisbuffer) {
  var source = context.createBufferSource();
  source.buffer = thisbuffer;
  source.connect(context.destination);
  source.start(0);
}
<button id="record">record</button>
<button id="stop">stop</button>

最佳答案

我已经按原样使用了您的代码。在 Chrome 浏览器中一切正常。
此问题已在错误 https://codereview.chromium.org/1579693006/ 时得到修复已关闭并添加到 Chrome 管道中。
这不再是一个问题。

关于javascript - mediarecorder api 通过 Web Audio api 播放(不是音频元素),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35649571/

相关文章:

Android:如何在没有有效视频预览表面的情况下初始化 MediaRecorder?

javascript - 在 jquery 对话框函数中动态调用 javascript 函数

javascript - 使用 javascript 优化解析(提取)json 数据

javascript - Jquery:求和输入文本字段

javascript - 为什么不同操作系统上的decodeAudioData()结果不同

android - 显示录音相机预览的 MediaRecorder

javascript - 查找 JavaScript 错误代码列表

javascript - 可视化音频文件波形,Web Audio API

google-chrome - Chrome : onaudioprocess stops getting called after a while

android - 将视频的配​​乐更改为相同长度的音频文件