如何使用同步ajax请求将音频转换为数组缓冲区?

问题描述:

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); 

} 

这工作正常,不要误解我的意思。事情是,我希望它同步而不是异步加载。如何使用同步ajax请求将音频转换为数组缓冲区?

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

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

然后,它破坏了该方法,因为它不是一个数组缓冲区,也无法读取响应。令人惊讶的是自然的行为。

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

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

+0

也许这是不可能的。它甚至可能是有意的 - 强烈建议不要同步执行ajax。 – soktinpk 2014-12-02 02:41:26

+0

但我真的没有看到它的伤害?它只是简单的XMLHttpRequests并转换成audioBuffer。 – user43353 2014-12-02 02:43:50

+0

危害正在做一个同步操作将挂起您的浏览器持续其等待期 - 包括分流任何目前呈现音频 – 2014-12-02 18:46:11

从标准方面来看。有传闻说(尽管如此),同步请求将在未来的规范中被取消。新功能并不支持它。检查this message

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

这里的the spec

如果异步为假,有一个相关的XMLHttpRequest的文件,要么超时属性值不为零,withCredentials属性值是true,或responseTyp的属性值不是空字符串,抛出“InvalidAccessError”异常并终止这些步骤。

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

+0

嗯。我试图在执行代码之前先加载所有文件,因为代码依赖于这些文件。如果它在加载没有完成之前得到执行,这些文件将以未定义的形式出现。 – user43353 2014-12-02 11:54:21

+0

@ user43353您可能需要一个资源管理工具,就像大多数HTML游戏一样。 – Leo 2014-12-02 12:07:03