如何将在解码音频数据中创建的缓冲区分配给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/

10-09 05:43