如何使用同步ajax请求将音频转换为arrayBuffer?

时间:2014-12-02 02:37:39

标签: javascript ajax html5-audio

var context = new webkitAudioContext();
var url = [ "/foo.mp3"];
function init(callback) {
  var req = new XMLHttpRequest();
  var audioBuffers = [];
  for(var i = 0; i < url.length; i++) {
    req.open("GET", url[i], true);
    req.responseType = "arraybuffer";

    req.onload = function() {
      context.decodeAudioData(req.response, function(buffer) {
         //blah blah push buffer into an array
      });
    req.send();
    }

    if(callback) callback(audioBuffers);

}

这很好用,不要误会我的意思。问题是,我希望它同步加载而不是异步加载。

req.open("GET", url[i], true) 

最后一个参数是您声明它是否同步的地方。出于某种原因,当我将其设为false时,您无法将其responseType更改为arraybuffer。

这会破坏方法,因为它不是数组缓冲区,无法读取响应。并且是令人惊讶的自然行为。

context.decodeAudioData(req.response, function(buffer){}); 

我对此进行了一些研究,但我只找到了将字符串转换为数组缓冲区的方法。 在这种情况下,我将音频(如mp3格式)转换为数组缓冲区,同时保持请求同步。  有没有解决方法呢?

1 个答案:

答案 0 :(得分:0)

从标准方面来看。有传言说(可能是正确的)同步请求将在未来的规范中被删除。新功能并不支持它。检查this message

  

最近更改了XMLHttpRequest2规范,禁止在设置xhr.responseType时发送同步请求。

此处the spec

  

如果 async为false ,则存在关联的XMLHttpRequest文档,且timeout属性值不为零,withCredentials属性值为true,或responseType属性值不为空string ,抛出&#34; InvalidAccessError&#34;异常并终止这些步骤。

从应用程序方面。使用ArrayBuffer通常意味着您请求的资源在某种程度上是一个大二进制文件。虽然同步请求会阻止UI,但用户体验非常糟糕。所以,即使你可以这样做,也不是一个好主意。