2014-04-06 83 views
0

在我的Android應用程序中,我使用AudioRecord並連續發送一個字節數組PCM_16到Node.js服務器。如何在Web中使用Web(使用Web-Audio或其他)播放原始樣本PCM_16音頻數據記錄?

byte[] audioBuffer = new byte[mAudioBufferSampleSize]; 
    mAudioRecord.startRecording(); 
    int audioRecordingState = mAudioRecord.getRecordingState(); 
    if (audioRecordingState != AudioRecord.RECORDSTATE_RECORDING) { 
     Log.e(TAG, "AudioRecord is not recording"); 
     return; 
    } else { 
     Log.v(TAG, "AudioRecord has started recording..."); 
    } 

    while (inRecordMode) { 
     int samplesRead = mAudioRecord.read(audioBuffer, 0, 
       mAudioBufferSampleSize); 
     Log.v(TAG, "Got samples: " + samplesRead); 
     if (WebSocketManager.roomSocket.isConnected()) {    
      WebSocketManager.roomSocket.send(audioBuffer); 

     } 
    } 

在那之後,我可以把它流在ArrayBuffer類型的網頁瀏覽器,並嘗試將其轉換爲Float32Array是緩衝區AudioContext的一個實例。但是我聽不到任何聲音或者嘈雜的聲音。

function onMessage(evt) { 
    var context = new AudioContext(); 
    var source = context.createBufferSource(); 
    source.connect(context.destination); 

    array = new Int8Array(evt.data); 
    abs = new Float32Array(evt.data); 
    arrays = new Float32Array(abs.length); 

    ab = context.createBuffer(1, array.length, 44100); 
    ab.getChannelData(0).set(arrays); 
    source.buffer = ab; 
    source.start(0); 
     // then do it 

    } 

那麼,任何人都可以給我一個預付款嗎? P/S:用decodeAudioData只給一個空的錯誤

對不起,我的英文不好

回答

1

你得到的陣列是每個樣本0-32k(範圍UINT16的)。 AudioBuffer通道數據中的每個採樣都是一個float32 - 標稱範圍爲-1到+1。

您需要轉換每個樣本中的數據,而不僅僅是分配值並依靠轉換。

+0

在java中的字節範圍從-128到127,所以爲什麼我得到的數組是每個樣本0-32k,你能解釋給我嗎? – bhINC

+0

如果是16位,每個採樣應該是兩個字節 - 因此範圍應該是-32k到+32k。樣本的數學應該是sampleInFloat =(sampleInInt-32768)/ 32768。 – cwilso

+0

哦,數組的範圍是從-32768到32767.所以現在,我可以使用數組[i] = array [i]/32768.0將其轉換爲audioBuffer。但音頻可以在突然停止之前在短時間內播放。你如何看待這個問題? P/s:感謝您的熱情。 (希望我正確地寫出來) – bhINC