2010-05-01 47 views
16

對於我的應用程序,我需要在Android手機上錄製來自MIC的音頻,並通過TCP將其發送到另一個需要播放的android手機。Android:通過TCP套接字流式音頻

我使用的是AudioRecordAudioTrack類。這對於文件非常有用 - 使用DataOutputStream將文件寫入文件,並使用DataInputStream從文件中讀取。

但是,如果我從套接字而不是文件獲得相同的流,並嘗試寫入它,我會得到一個異常。

我不知道什麼可能會出錯。任何幫助將不勝感激。

編輯:問題是相同的,即使我嘗試使用較大的緩衝區大小(65535字節,160000字節)。

這是代碼:

記錄:

int bufferSize = AudioRecord.getMinBufferSize(11025, , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 

AudioRecord recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); 

byte[] tempBuffer = new byte[bufferSize]; 

recordInstance.startRecording(); 

while (/*isRecording*/) { 
     bufferRead = recordInstance.read(tempBuffer, 0, bufferSize); 
     dataOutputStreamInstance.write(tempBuffer); 
} 

上面得到的是DataOutputStream爲:

BufferedOutputStream buff = new BufferedOutputStream(out1); //out1 is the socket's outputStream 
DataOutputStream dataOutputStreamInstance = new DataOutputStream (buff); 

可否請你看看,讓我知道它是什麼我可能在這裏做錯了?

感謝,

+0

您是否設法將音頻文件發送到其他設備? – B770 2013-08-07 09:40:54

回答

8

我得到了這個工作,有一些幫助,只有部分。

我從http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html的代碼開始,將File的流更改爲Socket的流,並將isAvailable()更改爲if(inputStream.read(byteArray)!= -1)。

現在正在通過TCP實時流式傳輸音頻。

然而,

所有我聽到在另一端是噪聲,並且我現在狩獵正確一套AudioRecorder和AudioTrack參數 - 的頻率,信道配置和編碼,音頻源等

如果您對此有任何意見,請讓我知道。

感謝,

編輯: 這是我的一個愚蠢的錯誤。 除了上面所說的全部之外,在播放器端使用inputStream,在記錄器端使用outputStream,而使用字節數組而不是短褲,它將起作用。:)

+0

雖然我正在挖一些舊的線程..你可以請你把你的代碼(你所做的更改)? – 2012-07-11 05:48:42

+0

你好Chaitanya,你是怎麼用相同的代碼?我無法通過TCP實時傳輸音頻。你能指導我嗎? – iMOBDEV 2014-04-07 14:31:06

1

不知道你得到了具體的異常,很難確切地知道什麼是錯的。這也有助於查看您用來創建out1(即您的套接字代碼)的代碼。

您可能需要注意的是從recordInstance.read()中讀取的數據量;您可能無法獲得大小完整的數據塊,因此您只需要注意將字節0bufferRead-1寫入輸出套接字。

+0

非常感謝您的回覆。 – Chaitanya 2010-05-02 03:37:54