2013-02-02 158 views
3

如何爲我的音頻創建暫停功能?我已在下面的腳本中使用了播放功能。暫停網絡音頻API聲音播放

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); 
} 

但我怎樣才能暫停或停止呢?

+1

'sourceNode.noteOff(0);' – idbehold

回答

9

簡短的回答是「你不能暫停它 - 你可以通過調用sourceNode.noteOff(0);來阻止它,就像idbehold所說的那樣:」。

出於同樣的原因,音頻電纜上沒有「暫停」按鈕也無法暫停 - 因爲數據一直在運行。你可以實現一個可以暫停的記錄器節點,但是如果你沒有取消暫停,它會在某個時候緩衝大量的數據。

實現此場景的常用方法是跟蹤回放的位置(例如,通過記住開始時的位置),然後在想要暫停時記住該偏移量,然後調用noteOff(0),然後當你想重新開始播放時,創建一個指向同一個緩衝區的新節點,並調用帶偏移量的noteOnGrain。

+4

不知道當我所做的一切都是解釋API時,爲什麼你低調回答我的答案。 – cwilso

4

noteOff(0)的問題是它會破壞AudioNode,所以您將無法使用暫停音頻。相反,您可以簡單地斷開sourceNode,這將有效地暫停音頻。要恢復播放,只需重新連接即可。由於您的代碼連接到sourceNodeanalyser

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

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

希望幫助!

+3

這是Chrome的實現中的錯誤,實際上 - 不要依賴它繼續作爲「暫停」。 – cwilso

+1

cwilson是對的,這是錯誤的答案,將來無法正常工作。這是一個錯誤,並且在API中不受支持。 – AlexC

+0

@cwilso是否有這個bug的鉻票?我試圖通過斷開和重新連接一個節點來實現「靜音」功能,但只是意識到當斷開連接時聲音會恢復到原來的位置,而不是基於currentTime的上下文。謝謝! – Craig

0

在分配緩衝區之前,你已經創建了一個bufferSource可以使用的上下文。 創建bufferSource的方法是「createBufferSource」=> context.createBufferSource。在創建bufferSource之後,您使用「context.destination」=> source.connect(context.destination);創建了一個conexion。是所有的,玩到現在,使用起始(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(); 
}