2012-06-29 51 views
17

我目前有一個字節數組形式的PCM音頻。格式有16位小尾數。我想將其轉換爲Android上的某些可播放格式,最好是3.2或更高版本。有沒有人有如何做到這一點的建議?我已經做了一些研究並嘗試了以下內容,但沒有一個成功。如果有人能提出更好的方法或指出我出錯的地方,我們將非常感激。PCM原始字節[]在Android上的音頻

我已嘗試使用正確的音頻設置創建AudioFormat,但Android不支持javax.sound.sampled庫。

我也嘗試將PCM數據寫入波形文件,但我遇到了麻煩獲取所有必要的wav標題信息。

我也嘗試過使用Android提供的AudioTrack類來播放PCM數據。但是,我似乎無法聽到任何聲音。這是我的方法:

public void playback(){ 
     try{ 
       AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 500000, AudioTrack.MODE_STATIC); 
       audioTrack.write(audio, 0, 500000); 

     } catch(Throwable t){ 
     Log.d("Audio","Playback Failed"); 
    } 
} 

任何意見,將不勝感激。

+0

已更新我的回答 –

回答

19

http://developer.android.com/reference/android/media/AudioTrack.html

該類看起來已經正是你需要的!

write(byte[] audioData, int offsetInBytes, int sizeInBytes) 

將音頻數據寫入音頻硬件進行播放。

編輯

您的流更改爲AudioManager.STREAM_MUSIC

+0

感謝您指導我修復該流。這有助於糾正錯誤。 – ShannonS

+6

請選擇正確的答案,這將有助於您在將來收到更多答案。 –

17

的問題是你是否想打你的一些源直接在Android應用程序接收PCM樣品或者如果你有一些外部文件,你需要兌換。在第一種情況下,請按照jack57所描述的方式行事。這非常簡單,您甚至可以添加標記以獲得精確的時間。

int bufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 

AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM); 

mAudioTrack.play(); 

然後調用write方法,在一個週期:

mAudioTrack.write(buffer, 0, buffer.length); 

在第二種情況下,只需要使用一些免費的音頻編輯器:http://audacity.sourceforge.net/download/。您可以將PCM樣本存儲爲.txt文件,在編輯器中將其打開並保存爲您需要的格式...

+0

謝謝你的闡述。這幫助我解決了錯誤。 – ShannonS