什么可以阻止decodeAudioData调用它的回调?

时间:2014-03-22 15:57:19

标签: javascript web-audio

我试图设置一些WebAudio代码。我创建了一个上下文,现在我正在尝试加载一些声音。 (WAV文件。)我设置了一个XHR对象并附加了以下事件:

  request.onload = function (response) {
     context.decodeAudioData(request.response,function (buffer) {
        this.Buffer = buffer;
     });

我已经验证XHR正确触发,并且每次调用onload回调,并且响应是有效的数组缓冲区,并且请求的WAV文件是好的。但由于某些原因,当我多次运行此例程时,我传递给decodeAudioData的回调只会触发一次或两次,其余的时间它永远不会返回。然后,当我稍后播放声音时,我得到一个例外,因为它没有设置。

使用Chrome版本33.0.1750.154 m。有没有人知道什么会导致decodeAudioData不能调用它的回调?

3 个答案:

答案 0 :(得分:1)

无效的WAV文件或其他问题解码很可能。你能设置onerror回调,还是共享一个不起作用的文件?

答案 1 :(得分:0)

我也遇到过这个问题。看来web audio api背后的代码有点儿麻烦,因为如果我在decodeaudiodata(windows 8 64bit环境)的处理过程中使用警报框来检查状态,它将无法正确调用成功或错误回调。我的代码工作正常,然后我的iPad mini得到了更新的chrome,但是在你拥有的版本的最新更新之后,我的ipad从来没有成功或错误得到正确回调,但是windows 8 chrome在同一页面上工作正常(只要处理过程中没有警报框)。

Windows 8 w / chrome 33.0.1750.154 - 只要在处理过程中没有显示警报窗口,就会调用成功回调。

iPad mini w / chrome 33.0.170.154(以及Safari) - 无论警报窗口如何,都不会调用成功或错误回调。这适用于以前版本的chrome。


编辑 - 它不仅仅是警报,在调试器中使用断点会导致同样的问题。


寻找演示页:http://kusogmusic.com/violin/droneshttp://kusogmusic.com/violin/playalong

答案 2 :(得分:0)

如果您说不能在同一ArrayBuffer上多次调用encodeAudioData,那是因为它是破坏性函数。将ArrayBuffer传递给它之后,它将破坏该缓冲区。 IIRC可以节省内存。

如果您说不能用不同的文件/ ArrayBuffers多次调用decodeAudioData,那就完全不同了。

(是的,我知道最初的问题是从2014年开始的。留下这个答案是为了让遥远的未来遇到这个问题的人受益。)