2011-02-28 79 views
1

我试图使用AudioTrack类播放PCM流。这是代码:使用AudioTrack从Android上的套接字流式传输音频

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时报告的代码中是否有错误?或者只是数据没有及时到达? 谢谢!

回答

2

你可以做一些检查:

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

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

+1

我试图流式传输一个文件,并完美地工作。没有中断。但是,我应该通过计算吞吐量来得出结论吗?谢谢你的帮助。 – 2011-02-28 15:21:16

+0

我不知道你从哪里得到你的数据,但似乎AudioTrack比你收到它更快地消费数据。 – 2011-02-28 15:34:52

0

我以前没使用AudioTrack,但this implementation比较您的版本我看到的主要区别是,你创建AudioTrack用不同的缓冲区大小比您正在使用您自己的缓冲区:20000 VS 200。我会尝试使用相同的大小。

+0

我试过了,已经有了一些不同的值。我总是受到干扰。 – 2011-02-28 15:21:46

2

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

+0

所以,如果我理解正确:一个线程从套接字中读取数据,并将数据放置在某个地方,可能在共享队列中?或者你建议什么其他结构?同时,另一个线程将缓冲区中的数据迭代到audioTrack。这是你的建议吗?谢谢! – 2011-02-28 21:27:56

+0

在我的实现中,我刚从字数组和头尾指针创建了自己的FIFO。当audioTrack.write准备好接受它时,重要的是让音频数据准备就绪。 – BitBank 2011-03-02 03:08:46

3

试着把代码放在一个高优先级的独立线程中。

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

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

相关问题