2013-12-20 177 views
1

我目前正在開發對講機類型的環境。錄製和重新採樣音頻現在工作正常(感謝您的幫助),播放作品......有點。播放多個連續音頻文件後延遲

我的數據來自於(WAV的)斑點,所以這裏就是我做什麼:

audioPlay(blob) 
{ 
     var fileReader = new FileReader(); 
     fileReader.onload = function() { 
       theContext.decodeAudioData(this.result, function(buffer) { 
         var source = theContext.createBufferSource(); 
         source.buffer = buffer; 
         source.connect(theContext.destination); 
         source.start(0); 
         }); 
       }; 
     fileReader.readAsArrayBuffer(blob); 
} 

但每一個新的聲音增加了輕微的啓動延遲,這與每一個新的音頻增長。幾個音頻後,延遲增加了將近2-3秒。日誌記錄不顯示任何延遲,程序流程一直到.source.start。

任何想法?

回答

0

對於每個樣本,不要從0開始播放。而是跟蹤時間。

if (nextTime == 0) { nextTime = context.currentTime } 
source.start(nextTime); 
nextTime+=source.buffer.duration; 
+0

Thanks @Brad will tr​​y that and report雖然恕我直言,它沒有任何意義,因爲我創建了新的緩衝區和新的source.connects - 完全獨立的進程 –

+0

'audioPlay'內有兩個連續的異步操作,'fileReader.onload'事件回調是異步和'decodeAudioData'是異步的,你真的不能對這種方式有任何期望,因此調用'source.start(0)'不起作用。 –

+0

@KevinEnnis我不關注你。不要期望有任何準確或可預測的時間,我假設在onload完成並且decodeAudioData完成後(pcm數據在緩衝區中可用並準備播放)立即開始。我們正在談論最小的獨立樣本,最多100K。第一個樣本的工作原理就是如此,在後續樣本中增加了一小部分延遲 - 在4或5個樣本之後加上一秒左右,等等。 –

0

麥克拉,這聽起來更像是它可能是在源問題 - 你確定每個到來的斑點是否正確(正確的長度,並在一開始有聲音?)看起來這可能是你只是把新的錄音加到那個末尾的空緩衝區的末尾。除了這個特定的問題之外,我還會看看會出現的音頻blob - 可能由於某些原因,解碼過於昂貴? (也就是說,如果您有2-3秒的累積延遲,您應該能夠從日誌中判斷延遲是在接收數據,解碼還是在緩衝區中。

+0

我看着那個。每個音頻獨立播放立即開始(頁面重新加載後),日誌顯示現在延遲 - 是一個謎:)但是,我會這樣解決:D –