Android AudioTrack()如何在启动后停止播放流

时间:2011-07-14 04:24:08

标签: android

我的目标API是2.2 我动态创建音频片段,因此使用soundpool或mediaplayer是不可能的。 我发现没有/未充分记录的一个项目是AudioTrack()将创建实例的设置限制。我发现它在6到12个实例之间。文档中未涉及的一件事是每次启动AudioTrack()时它都会创建一个新实例。会话ID直到版本2.3才会实现,因此GetSessionID()在2.2下不可用。我看到的许多问题都是每次你做的 AudioTrack audioTrack =(新)AudioTrack(这里的各种参数);它开始了一个新的过程 所以只做audioTrack.stop();如果您尝试停止上一个流,则不起作用。

所以我的问题是我开始播放可能超过一分钟的audioTrack。这是在流外过程中完成的(通过参数传递单独的例程)流正常。该程序正在执行一些其他用户指导的任务,我想在完成其'回放缓冲区之前停止录音轨。

我需要一种引用正在播放和停止的音轨的方法。 我的新手和太长的C程序员以及缺乏Java经验正在阻碍我。当然必须有办法随时停止录音带。 寻找一种方法来引用录音带并将其停止。
我想也许是android.media.audiotrack.stop();可能是接近但接近不要削减它。救命!我花了15个小时寻找一个例子。 TNX

3 个答案:

答案 0 :(得分:5)

调用这3种方法对我有用。我也有代码来停止另一个线程中的缓冲。

audioTrack.flush();
audioTrack.stop();
audioTrack.release();

答案 1 :(得分:2)

确实,stop()不会立即切断播放。您需要的是pause() + flush()。根据文件:

  

public void stop()

     

停止播放音频数据。当在MODE_STREAM模式下创建的实例上使用时,音频将在播放完最后一个缓冲区后停止播放。 要立即停止,请使用pause(),然后使用flush()丢弃尚未播放的音频数据。

单独调用暂停可以非常快速地切换播放。但是,我注意到有时候,暂停+刷新序列会继续读取缓冲区一段时间。在pause()flush()调用之间引入一些延迟在我的应用程序中解决了这个问题。

答案 2 :(得分:0)

除非我遗漏了什么,否则每当你创建一个AudioTrack的新实例时,请确保并保留它(数组,链表,散列图等)。这样,您可以在任何时候返回到先前创建的对象并调用其方法。