2

我在带有音频 API 的 Chrome 上发出了奇怪的错误(SYNTAX_ERR: DOM Exception 12)。我第一次尝试了 Audio Api 并做了 Kyle Nau 的教程(几次)(http://www.youtube.com/watch?v=1wYTkZVQKzs)。当我使用简单的 mp3 运行代码时,所有声音都可以正常播放,但是当我尝试从同一个教程中添加音量控制块时,只会播放新对象创建列表中的最后一个声音。两个首先在播放中显示“SYNTAX_ERR: DOM Exception 12”。我检查了 mp3 并更改了声明的位置 = 同样的不良影响。删除音量控制,一切都会再次正常播放。在本教程中一切都很好。

测试表明,取消注释此部分时会出现问题:

        playSound.connect(this.gainNode);
        this.gainNode.connect(audioContext.destination);

我不明白为什么会出现此错误。

这里代码。这是很好的工作变体(我用评论标记了问题的地方):

    function Sound(source, level) {
    if (!window.audioContex) {
        audioContext = new webkitAudioContext;
    };
    var that = this;
    that.source = source;
    that.buffer = null;
    that.isLoaded = false;

// that.gainNode = audioContext.createGain();

// if (!level) {

// that.gainNode.gain.value = 1;

// } 别的 {

// that.gainNode.gain.value = level;

// };

    var getSound = new XMLHttpRequest();
    getSound.open("GET",that.source,true);
    getSound.responseType = "arraybuffer";
    getSound.onload = function() {
        audioContext.decodeAudioData(getSound.response,function(buffer) {
            that.buffer = buffer;
            that.isLoaded = true;               
        });
    };
    getSound.send();
};

Sound.prototype.play = function(){
    if(this.isLoaded === true) {
        var playSound = audioContext.createBufferSource();
        playSound.buffer = this.buffer;

// playSound.connect(this.gainNode);

// this.gainNode.connect(audioContext.destination);

        playSound.connect(audioContext.destination);
        playSound.noteOn(0);
    };
};

// Sound.prototype.setVolume = function(level) {

// this.gainNode.gain.value = level;

// };

var laserSound = new Sound("sound/laser.mp3");
var dropSound = new Sound("sound/drop.mp3");
var pickupSound = new Sound("sound/pickup.mp3");

//laserSound.setVolume(.1);

window.addEventListener("keydown", onKeyDown);

function onKeyDown(event) {
    switch (event.keyCode) {
        //Z
        case 90: 
            laserSound.play();
        break;
        //X
        case 88:
            dropSound.play();
        break;
        //C
        case 67:
            pickupSound.play();
        break;
    };

};
4

2 回答 2

1

在注释掉的第一行中创建增益节点时,它必须是 audioContext.createGainNode(); 而不是 audioContext.createGain();

看起来您缺少节点。

我希望这会有所帮助。

于 2013-04-09T21:44:18.270 回答
-1

您在某处有语法错误。您不需要在函数声明之后放置分号。在这种情况下,您只能使用分号:

var myFunction = function(){

};
于 2013-03-05T15:04:51.423 回答