在我的应用程序中,我将创建多个音频轨道,其中一些需要同时播放。我将使用MODE_STREAM
并在应用程序运行时写入数据。声音将动态生成,这就是我使用Audio Track而不是其他任何东西的原因。
我相信有4种选择:
这四种方法中哪一种是管理多个AudioTracks的最佳方式?
我认为线程池是可行的方法,但我没有肯定,因为我实际上并没有使用它。
非常感谢任何建议
答案 0 :(得分:1)
为简单起见,我每次播放AudioTrack时都只创建一个新线程。
但是,不管它真的没关系。我发现当尝试一次播放多个AudioTrack时,会发出噼里啪啦声。我认为这只是Android系统的一个问题,而不是我的应用程序。从API级别9(姜饼)开始,我可以将会话ID应用到音频轨道,我相信我可以使用SoundPool播放它,这样可以让多个AudioTracks的播放更加顺畅。
目前,由于有多少用户仍在使用2.2以及我没有使用姜饼设备这一事实,我将把这个项目放到一边,直到稍后。
答案 1 :(得分:0)
我认为你最好的选择是AsyncTask。
答案 2 :(得分:0)
为每个AudioTrack创建一个AsyncTask,并使用Excecutor执行它们(在我的Android 4.4上,如果没有使用Excecutor,则只会执行第一个任务)。 以下是将麦克风信号流式传输到AudioTrack,将音频文件流并行传输到其他AudioTrack的示例。
/** Task for streaming file recording to speaker. */
private class PlayerTask extends AsyncTask<Null, Null, Null> {
private short[] buffer;
private int bufferSize;
private final AudioTrack audioTrack;
...
@Override
protected Null doInBackground(final Null... params) {
...
while (!isCancelled()) {
audioTrack.write(buffer, 0, bufferSize);
}
...
}
}
/** Task for streaming microphone to speaker. */
private class MicTask extends AsyncTask<Null, Null, Null> {
private short[] buffer;
private int bufferSize;
private final AudioTrack audioTrack;
...
@Override
protected Null doInBackground(final Null... params) {
...
while (!isCancelled()) {
audioTrack.write(buffer, 0, bufferSize);
}
...
}
}
/** On the UI-thread starting both tasks in parallel to hear
both sources on the speaker. **/
PlayerTask playerTask = new PlayerTask();
playerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Null());
MicTask micTask = new MicTask();
micTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Null());