2010-05-01 48 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