java - Android:通过 TCP 套接字流式传输音频

标签 java android sockets dataoutputstream

对于我的应用,我需要在 Android 手机上录制来自 MIC 的音频,然后通过 TCP 将其发送到需要播放的其他 Android 手机。

我正在使用 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);

请你看看,让我知道我在这里做错了什么?

谢谢,

最佳答案

在一些帮助下,我得到了这个工作,只是部分帮助。

我从 http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html 的代码开始,把File的流改成Socket的流,把isAvailable()改成if(inputStream.read(byteArray) != -1)。

现在正在通过 TCP 实时传输音频。

但是,

我在另一端听到的只是噪音,我现在正在为 AudioRecorder 和 AudioTrack 寻找正确的参数集 - 频率、 channel 配置和编码、音频源等。

如果您对此有任何想法,请告诉我。

谢谢,

编辑: 这是我的一个愚蠢的错误。 除了我上面所说的之外,在播放器端使用 inputStream,在记录器端使用 outputStream,并使用字节数组而不是短裤,它会起作用。 :)

关于java - Android:通过 TCP 套接字流式传输音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2749236/

相关文章:

java - 无法构造 - Jackson 的实例

Android - 如何开始创建启动器应用程序?

项目依赖中jar的Android "has already been added to output"错误

sockets - Python3 从 self.connect(('badhost' ,6667) 时捕获错误

python - Windows 上带有套接字包装器的 `OSError: [Errno 9] Bad file descriptor`

java - 将 String 类型解析为 Java 中可用的其他数字类型的最佳方法是什么?

java - 使用 Eclipse 编辑器出现 FileNotFoundException

java - Maven 配置问题一个或多个约束尚未满足

android - 在此 MapSample 小部件上方找不到正确的 Provider<AppState>

java服务器发送打印流到端口80或443