2014-06-14 106 views
4

我有一個來自桌面應用程序的傳入實時流,通過websocket連接到我的網頁。 我正在將PCM流轉換爲float 32數組。當我開始播放曲目時,我聽到了故障,所以我創建了一個bufferArray來存儲流的一部分,然後再播放它。 我得到的問題是,創建緩衝區後,我不能添加任何塊到數組。使用Web Audio API緩衝音頻

這裏我接收來自套接字連接的數據並將其存儲在數組中。我在開始流之前等待100個塊。

sock.onmessage = function(e) { 
     var samples = e.data; 
     obj = JSON.parse(samples); 

     stream = stream.concat(obj); 

     if(j == 1000){ 
      console.log(stream); 
      playPcm(stream); 
     } 

     console.log(j); 
     j ++; 
    } 

此方法處理音頻數據塊

function playPcm(data){ 
    var audio = new Float32Array(data); 
    var source = context.createBufferSource(); 
    var audioBuffer = context.createBuffer(1, audio.length, 44100); 

    audioBuffer.getChannelData(0).set(audio); 
    // console.log(audioBuffer); 

    source.buffer = audioBuffer; 


    source.connect(context.destination); 

    source.start(AudioStart); 
    AudioStart += audioBuffer.duration; 
} 

我看了一下scriptProcessorNode,但無法弄清楚如何處理它。現在我幾乎陷入困境,因爲我對Web Audio API不是很熟悉。

回答

3

不要試圖保持編輯相同的緩衝區 - 你將無法修改播放緩衝區(它今天有時在Chrome中有效,但這是一個錯誤)。您應該將第一組塊緩衝到一個緩衝區中,就像您現在要獲得一些延遲空間一樣,然後當附加塊進入時您應該將它們安排爲單獨的AudioBuffer/BufferSourceNode組合。 (即跟蹤你開始播放第一個節目的時間和正在播放的節目數量,並且計劃每個節點在最後一節節目播放結束時播放)。

+1

你有來自套接字的mp3數據塊的例子嗎? –

相關問題