类型错误: 未能在'AuidoBufferSourceNode'上设置'buffer'属性: 提供的值不是类型为'AudioBuffer'的数据。

7
我正在处理现有的 codoCircle。请将音量调低。

如预期一样运行。

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

TypeError:未能在'AudioBufferSourceNode'上设置'buffer'属性:所提供的值不属于类型“ AudioBuffer”

我进行了一些研究,并发现了 第一个答案 有用。

答案说

当我在playSound中分配时player.buffer = buffer,由于加载回调尚未触发,因此缓冲区仍未定义。

对我来说这很有道理,所以我尝试做一个setTimeout,如下:

setTimeout(playSound, 9000);

它没有奏效。

您知道有没有任何解决方法?为什么在CodeCircle中可以工作而在Codepen中不行?


1
使用pixi-audio.js库时遇到了相同的错误,本地一切正常,但上传到服务器后,一个mp3文件在某个位置给我报错(并且从服务器上正确下载)。不知道为什么,请在找到答案后发布。 - Dmitry Malugin
1个回答

6
这对我来说很有意义,所以我尝试使用setTimeout,但这更像是一个快速修复,因为你无法确定是否已加载所有内容。
解决方案是等待每个样本都加载完毕。最好的方法是使用Promises,但这需要(大量)重构,并且与当前浏览器不兼容(因此您需要BabelTypescript等)。
因此,我采取了一种更简单的方法:对于每个样本,我创建了一个布尔变量,在加载完成时(在回调函数中)将其设置为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 链接

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


TypeScript很棒。可以推荐。它也正在成为后端JavaScript的行业标准。 - NobleUplift

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接