【问题标题】:TypeError: Failed to set the 'buffer' property on 'AudioBufferSourceNode': The provided value is not of type 'AudioBufferTypeError:无法在“AudioBufferSourceNode”上设置“buffer”属性:提供的值不是“AudioBuffer”类型
【发布时间】:2017-05-03 17:11:26
【问题描述】:

我正在处理现有的codoCircle。降低音量。

效果如预期。

现在我想在codepen 中使用相同的代码,我得到了这个错误

TypeError:无法在“AudioBufferSourceNode”上设置“buffer”属性:提供的值不是“AudioBuffer”类型

我做了一些研究,发现first answer 很有用。

答案说

在我分配playSoundplayer.buffer = buffer 时,缓冲区仍未定义,因为尚未触发加载回调。

这对我来说很有意义,所以我尝试做一个 setTimeout点赞:

setTimeout(playSound, 9000);

没有成功。

您知道任何解决方法吗?为什么在 CodeCircle 中有效,而在 Codepen 中无效?

【问题讨论】:

  • 使用 pixi-audio.js 库得到相同的错误,本地都按预期工作,但是当上传到服务器时,一个 mp3 文件在一个地方给了我这个错误(它是从服务器正确下载)。不知道为什么,如果你找到了,请发布答案。

标签: javascript jquery asynchronous xmlhttprequest codepen


【解决方案1】:

他对我来说很有意义,所以我尝试做一个 setTimeout 像 ..

这更像是一个快速修复,但很棘手,因为您不确定是否所有内容都已加载。

解决方案是等到每个样本都加载完毕。最好的方法是为此使用Promises,但这需要(大型)重构和isn't compatible with all the current browsers(因此您需要BabelTypescript 等)。

所以我采用了一种更简单的方法:对于每个样本,我都创建了一个 boolean 变量,加载完成后(在回调函数中)将设置为 true

var loadedHat = false;
var loadedSnare = false;
var loadedBd = false;

loadSample('cl_hat_3001.wav', function (buffer) {
    hat = buffer;
    loadedHat = true;
    startWhenAllLoaded();
});
loadSample('brp_snrim1.wav', function (buffer) {
    snare = buffer;
    loadedSnare = true;
    startWhenAllLoaded();

});
loadSample('bd08.wav', function (buffer) {
    bd = buffer;
    loadedBd = true;
    startWhenAllLoaded();
});

然后我将您的代码包装在一个start 函数中,并创建了一个startWhenAllLoaded,它在所有树布尔值都是true 时开始

function startWhenAllLoaded()
{
    if(!started && loadedHat && loadedSnare && loadedBd){
        started = true;
        start();
    }
}

编辑的codepen是here

注意:不确定现在是否一切正常,错误消失了,但我认为代码需要一些调整

【讨论】:

  • TypeScript 很棒。可以推荐。它也正在成为后端 JavaScript 的行业标准。
猜你喜欢
  • 2021-10-28
  • 2022-12-15
  • 1970-01-01
  • 2023-03-14
  • 2019-12-11
  • 1970-01-01
  • 2018-08-06
  • 2016-12-03
  • 1970-01-01
相关资源
最近更新 更多