我正在尝试使用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时我报告的代码有什么问题吗?或者可能只是数据没有及时到达? 谢谢!
答案 0 :(得分:3)
尝试将代码放在具有高优先级的单独线程中。
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO)
在线程的run()中读取和写入数据。
答案 1 :(得分:2)
你可以做一些检查:
使用您的代码读取文件。只需将文件作为流打开。
测量吞吐量。每次有大量数据到达时,记录时间(System. nanoTime()
)和长度。然后你可以计算数据是否迟到。
答案 2 :(得分:2)
从可变延迟流中读取音频数据并将其发送到同一线程中的audioTrack.write将会像您观察到的那样效果不佳。这是2个线程的作业,其中一个从流中读取数据(并缓冲一个合理的数量),而另一个将音频数据写入audioTrack对象。您可能会一次读取和写入大块音频数据,但是audioTrack类对此施加了限制。当audioTrack线程在写入操作后唤醒时,您无法在该线程中执行大量工作,否则会导致音频输出出现间隙;你必须提供连续的数据流。
答案 3 :(得分:0)
之前我没有使用AudioTrack
,但是将您的版本与this implementation进行比较,我看到的主要区别在于您创建的AudioTrack
缓冲区大小与您使用的不同你自己的缓冲区:20000
vs 200
。我会尝试使用相同的大小。