0

我想为 HTML5 Web Audio API 编写一个基本脚本,可以播放一些音频文件。但我不知道如何卸载正在播放的音频并加载另一个。在我的脚本中,两个音频文件同时播放,但不是我想要的。

这是我的代码:

var context, 
    soundSource, 
    soundBuffer;

// Step 1 - Initialise the Audio Context
context = new webkitAudioContext();

// Step 2: Load our Sound using XHR
function playSound(url) {
    // Note: this loads asynchronously
    var request = new XMLHttpRequest();
    request.open("GET", url, true);
    request.responseType = "arraybuffer";

    // Our asynchronous callback
    request.onload = function() {
        var audioData = request.response;
        audioGraph(audioData);
    };

    request.send();
}

// This is the code we are interested in
function audioGraph(audioData) {
    // create a sound source
    soundSource = context.createBufferSource();

    // The Audio Context handles creating source buffers from raw binary
    soundBuffer = context.createBuffer(audioData, true/* make mono */);

    // Add the buffered data to our object
    soundSource.buffer = soundBuffer;

    // Plug the cable from one thing to the other
    soundSource.connect(context.destination);

    // Finally
    soundSource.noteOn(context.currentTime);
}

// Stop all of sounds
function stopSounds(){
    // How can do this?
}


// Events for audio buttons
document.querySelector('.pre').addEventListener('click', 
    function () {
        stopSounds();
        playSound('http://thelab.thingsinjars.com/web-audio-tutorial/hello.mp3');
    }
);
document.querySelector('.next').addEventListener('click',
    function() {
        stopSounds();
        playSound('http://thelab.thingsinjars.com/web-audio-tutorial/nokia.mp3');
    }
);
4

1 回答 1

2

您应该在启动时将声音预加载到缓冲区中,并AudioBufferSourceNode在您想要播放时简单地重置。

要按顺序播放多个声音,您需要noteOn(time)根据缓冲区各自的长度一个接一个地使用 调度它们。

要停止声音,请使用noteOff.

听起来您缺少一些基本的网络音频概念。这个(以及更多)在这个HTML5Rocks 教程FAQ中有详细的描述和示例。

于 2012-07-10T15:38:59.287 回答