使用AudioTrack从Android上的套接字流式传输音频

时间:2011-02-28 14:44:12

标签: android sockets streaming

我正在尝试使用AudioTrack类播放PCM流。这是代码:

AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, 20000, AudioTrack.MODE_STREAM);
audioTrack.play();
// Reading data.
byte[] data = new byte[200];
int n = 0;
try {
   while ((n = s.getInputStream().read(data)) != -1)
      audioTrack.write(data, 0, n);
}
catch (IOException e) {
   return;
}

不幸的是,我得到的音频不断被打断。我试图在文件中写下数据,而不是写入audioTrack,然后用aplay播放。看来它很完美。没有中断。使用audioTrack时我报告的代码有什么问题吗?或者可能只是数据没有及时到达? 谢谢!

4 个答案:

答案 0 :(得分:3)

尝试将代码放在具有高优先级的单独线程中。

android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO)

在线程的run()中读取和写入数据。

答案 1 :(得分:2)

你可以做一些检查:

  1. 使用您的代码读取文件。只需将文件作为流打开。

  2. 测量吞吐量。每次有大量数据到达时,记录时间(System. nanoTime())和长度。然后你可以计算数据是否迟到。

答案 2 :(得分:2)

从可变延迟流中读取音频数据并将其发送到同一线程中的audioTrack.write将会像您观察到的那样效果不佳。这是2个线程的作业,其中一个从流中读取数据(并缓冲一个合理的数量),而另一个将音频数据写入audioTrack对象。您可能会一次读取和写入大块音频数据,但是audioTrack类对此施加了限制。当audioTrack线程在写入操作后唤醒时,您无法在该线程中执行大量工作,否则会导致音频输出出现间隙;你必须提供连续的数据流。

答案 3 :(得分:0)

之前我没有使用AudioTrack,但是将您的版本与this implementation进行比较,我看到的主要区别在于您创建的AudioTrack缓冲区大小与您使用的不同你自己的缓冲区:20000 vs 200。我会尝试使用相同的大小。