4

如何为我的音频创建暂停功能?我在下面的脚本中已经有了一个播放功能。

http://pastebin.com/uRUQsgbh

function loadSound(url) {
    var request = new XMLHttpRequest();
    request.open('GET', url, true);
    request.responseType = 'arraybuffer';

    // When loaded decode the data
    request.onload = function() {

        // decode the data
        context.decodeAudioData(request.response, function(buffer) {
            // when the audio is decoded play the sound
            playSound(buffer);
        }, onError);
    }
    request.send();
}

function playSound(buffer) {
    sourceNode.buffer = buffer;
    sourceNode.noteOn(0);
}

但是我怎样才能暂停或停止呢?

4

3 回答 3

12

简短的回答是“你不能暂停它——正如 idbehold 所说,你可以通过调用 sourceNode.noteOff(0); 来停止它”。

您不能暂停它,原因与音频电缆上没有“暂停”按钮的原因相同——因为数据一直在通过它。您可以实现一个可以暂停的记录器节点,但在某些时候,如果您不取消暂停,它将缓冲大量数据。

实现这个场景的常用方法是跟踪你在播放中的位置(例如,通过记住你开始的时间),然后当你想暂停时记住那个偏移量,调用 noteOff(0),然后当你想重新开始播放创建一个指向相同缓冲区的新节点并使用偏移量调用 noteOnGrain。

于 2013-02-05T19:53:02.800 回答
4

问题noteOff(0)在于它会破坏AudioNode,因此您将无法使用来暂停音频。相反,您可以简单地断开连接sourceNode,这将有效地暂停音频。要恢复播放,只需重新连接即可。由于您的代码连接sourceNodeanalyser

function pause() {
    sourceNode.disconnect();
}

function resume() {
    sourceNode.connect(analyser);
}

希望有帮助!

于 2013-02-04T22:59:30.500 回答
0

在分配缓冲区之前,您已经创建了一个可以使用上下文的 bufferSource。创建bufferSource的方法是“createBufferSource” => context.createBufferSource。创建 bufferSource 后,您使用“context.destination”=> source.connect(context.destination); 创建了一个 conexion。全部,现在要播放,对现代浏览器使用 start(0),对旧浏览器使用 noteOn(0)

function loadSound() {
   xhr = new XMLHttpRequest();
   xhr.open('GET', url, true);
   xhr.responseType = 'arraybuffer';
   xhr.onload = function () {
       /* Processing response data - xhr.response */
       /* Decoding audio data. */
       var context = new webkitAudioContext();
       context.decodeAudioData(xhr.response, function onSuccess (buffer) {
           if (! buffer) {
               alert('Error decoding file data.');
               return;
           }
           var source = context.createBufferSource(); /* Create SourceNode. */
           source.buffer = buffer; /* buffer variable is data of AudioBuffer type from the decodeAudioData() function. */
           source.connect(context.destination); /* Connect SourceNode to DestinationNode. */
           source.start(0); /* Play sound. */
       }, function onError (error) {
           alert('Error decoding file data.');
       });

   };
    xhr.onerror = function () {
        /* Handling errors */
        console.log('error');
    };
    xhr.send();
}
于 2013-09-12T17:45:08.300 回答