如何使用同步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,同时保持请求同步。 有没有这方面的解决方法?
答
从标准方面来看。有传闻说(尽管如此),同步请求将在未来的规范中被取消。新功能并不支持它。检查this message。
XMLHttpRequest2规范最近更改为禁止在设置xhr.responseType时发送同步请求。
这里的the spec:
如果异步为假,有一个相关的XMLHttpRequest的文件,要么超时属性值不为零,withCredentials属性值是true,或responseTyp的属性值不是空字符串,抛出“InvalidAccessError”异常并终止这些步骤。
从应用程序端。使用ArrayBuffer
通常意味着您请求的资源在某种程度上是一个大的二进制文件。虽然同步请求会阻止用户界面,但这真是糟糕的用户体验。所以即使你可以这样做,也不是一个好主意。
也许这是不可能的。它甚至可能是有意的 - 强烈建议不要同步执行ajax。 – soktinpk 2014-12-02 02:41:26
但我真的没有看到它的伤害?它只是简单的XMLHttpRequests并转换成audioBuffer。 – user43353 2014-12-02 02:43:50
危害正在做一个同步操作将挂起您的浏览器持续其等待期 - 包括分流任何目前呈现音频 – 2014-12-02 18:46:11