Как я могу создать функцию паузы для моего аудио? У меня уже есть функция воспроизведения в моем сценарии ниже.

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
Mike Boutin 3 Фев 2013 в 02:01

3 ответа

Лучший ответ

Краткий ответ: «Вы не можете приостановить это - вы можете остановить это, как говорит idbehold, вызвав sourceNode.noteOff (0);».

Вы не можете поставить его на паузу по той же причине, по которой на аудиокабеле нет кнопки «пауза», потому что через него проходят данные. Вы могли бы реализовать узел рекордера, который может делать паузу, но в какой-то момент он будет буферизировать огромный объем данных, если вы не отмените его.

Обычный способ реализации этого сценария состоит в том, чтобы отслеживать, где вы находитесь в процессе воспроизведения (например, вспоминая, когда вы начали), а затем, когда вы хотите сделать паузу, вы запомните это смещение, вызовите noteOff (0), затем, когда вы хотите Перезапустите воспроизведение, создайте новый узел, указывающий на тот же буфер, и вызовите noteOnGrain со смещением.

12
cwilso 5 Фев 2013 в 19:53

Перед назначением буфера, вы должны создать bufferSource и использовать контекст. Методом для создания bufferSource является "createBufferSource" => context.createBufferSource. После создания bufferSource вы должны создать соединение, используя «context.destination» => source.connect (context.destination) ;. Это все, теперь для воспроизведения используйте 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();
}
0
Danilobrinu 12 Сен 2013 в 17:45

Проблема с noteOff(0) состоит в том, что он уничтожит AudioNode, поэтому вы не сможете использовать его для приостановки звука. Вместо этого вы можете просто отключить sourceNode, что эффективно приостановит звук. Чтобы возобновить воспроизведение, просто заново подключите его. Поскольку ваш код соединяется с sourceNode к analyser:

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

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

Надеюсь, это поможет!

4
jorgeh 4 Фев 2013 в 23:22