2015-01-14 110 views
0

我有一個很奇怪的問題:播放Web Audio API使用很慢

我打一個wav與網絡音頻API的方式如下:

 var d2 = new DataView(evt.data); 

     var data = new Float32Array(d2.byteLength/Float32Array.BYTES_PER_ELEMENT); 
     for (var jj = 0; jj < data.length; ++jj) { 
      data[jj] = d2.getFloat32(jj * Float32Array.BYTES_PER_ELEMENT, true); 
     } 

     var buffer = context.createBuffer(1, data.length, 44100); 
     buffer.getChannelData(0).set(data); 

     source = context.createBufferSource(); 
     source.buffer = buffer; 
     source.start(startTime); 
     source.connect(context.destination); 

     startTime += buffer.duration; 

這工作完全正常,但現在播放速度很慢...

我沒有改變任何代碼。唯一改變的是我最近將我的操作系統從Windows 7改爲Windows 8.1。 與這個問題有任何關係嗎?

我在Chrome和Firefox中試過它,它們都有相同的行爲。

感謝您的幫助!

編輯:

我送浮點值到客戶端,因爲正如我在this thread學到的網絡音頻API需要一個1之間浮動-1值來處理音頻數據正確。 當我刪除浮點值並開始再次發送PCM數據時,播放速度正常。它再次充滿了噪音,但速度是正常的...

我真的很感激任何輸入,可能會幫助我弄清楚這個奇怪的問題。

回答

1

檢查AudioContext的採樣率,並將其替換爲硬編碼的44100值。另外,請檢查您的緩衝區的通道數量。你的代碼,只能用於單聲道。

+1

謝謝!這是抽樣率......但並不如我預期的那樣。有接縫是我的聲卡/ sounddrivers的問題...我不得不將我的輸出設備中的採樣率增加到88200.您是否知道爲什麼只有網絡音頻API接口與驅動程序有問題? – metabolic

+0

Chrome和Firefox都使用默認的音頻輸出設備採樣率,因此有必要使代碼適應任何採樣率。你確定你的音源不是交錯立體聲嗎?你是否檢查過你的源代碼樣本的大小?它是32位還是16位? – padenot

0

我有同樣的問題,玩88200似乎解決它。

但作爲@padenot指出,我試圖分裂這樣的左,右聲道(假設我是用交錯的立體交易):

var floatsLeft = new Float32Array(samples.length/2); 
var floatsRight = new Float32Array(samples.length/2); 

for (var i = samples.length - 1; i >= 0; i--) { 
    if(i%2 == 0) 
    floatsLeft[i/2] = samples[i]; 
    else 
    floatsRight[(i-1)/2] = samples[i]; 
}; 

var audioBuffer = audioContext.createBuffer(2, samples.length/2, audioContext.sampleRate) 
var bufferSource = audioContext.createBufferSource(); 

audioBuffer.getChannelData(0).set(floatsLeft); 
audioBuffer.getChannelData(1).set(floatsRight); 

bufferSource.buffer = audioBuffer; 
bufferSource.connect(audioContext.destination); 
bufferSource.start(0); 

而現在它完美的作品。也可能是立體聲!