如何将在解码音频数据中创建的缓冲区分配给soundBuffer以便稍后播放?
请注意,在decodeAudioData函数调用内对playSound()的调用成功播放了缓冲区,但是从“播放”按钮进行的调用返回“值不是ArrayBuffer类型”,并且在测试时,soundBuffer仍未定义。
我假设深度嵌套的函数在最外层的函数中失去了soundBuffer的作用域,但是我似乎可以将soundBuffer封装在一个闭包中,以使其成功传递。
$(function () {
var soundBuffer, context;
try {
context = new webkitAudioContext();
}
catch (e) {
console.log("Error setting up webaudiocontext: " + e);
}
loadSound("https://dl.dropboxusercontent.com/u/9780255/counting-coins-3.mp3",soundBuffer);
$("#playSound").click(function () {
playSound(soundBuffer);
});
function loadSound(url, buffer) {
var rq = new XMLHttpRequest();
rq.open("GET", url, true);
rq.responseType = "arraybuffer";
rq.onload = function () {
context.decodeAudioData(rq.response,
function (b) {
buffer = b;
console.log("buffer loaded...");
playSound(buffer);
});
};
rq.onerror = function (e) {
console.log("error loading audio:"+e);
};
rq.send();
}
function playSound(s) {
var sn= context.createBufferSource();
sn.buffer = s;
sn.connect(context.destination);
sn.start(0);
}
});
此源代码位于jsfiddle上:http://jsfiddle.net/karasutengu/qA5Nb/8/它可能仅适用于可识别webkitAudioContext的chrome。
最佳答案
您需要提供一个回调以在当前作用域中设置soundBuffer。
将loadSound更改为:
loadSound("https://dl.dropboxusercontent.com/u/9780255/counting-coins-3.mp3", function(buffer) {
soundBuffer = buffer;
});
加载声音的功能定义为:
function loadSound(url, callback) {
成功功能包括:
function (b) {
buffer = b;
console.log("buffer loaded...");
callback(buffer);
});
http://jsfiddle.net/karasutengu/qA5Nb/8
关于javascript - 我无法解决这个问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18395883/