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

问题描述 投票:1回答:3

我正在尝试设置一些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不调用它的回调?

javascript web-audio
3个回答
1
投票

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


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


0
投票

如果你说你不能在同一个ArrayBuffer上多次调用decodeAudioData,那是因为它是一个破坏性的功能。将ArrayBuffer传递给它后,它将销毁该缓冲区。 IIRC是为了节省内存。

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

(是的,我意识到最初的问题是从2014年开始。只是留下这个答案,为了远在其中的任何人的利益而绊倒它。)

© www.soinside.com 2019 - 2024. All rights reserved.