1

寻求有关在 Android 上播放音频的帮助。我们有一个 OpenGL 应用程序(Java + C++),现在我们想要播放声音效果。播放器应允许在播放时修改播放速率和音量。可能是 OpenSL 或 Audiotrack。

第一个问题? 是否有任何免费或商业库/包装器可以做这件事?(可能是 java 或本机)

..,如果没有,我会解释我们到目前为止所做的,以及我们遇到的问题。

我们使用 AudioTrack 实例创建了 MusicPlayer 类(扩展 AsyncTask)。在活动的 onResume() 中,我们创建了它的 5 个实例,在线程池上执行它。在任务的doInBackground()中,我们有一个运行循环检查状态变化、加载文件和写入缓冲区。在 JNI 中,我们有存储事件队列并每 10 毫秒将它们发送到 java 一次的单例。它以某种方式起作用,但距离被接受还差得很远。我们遇到以下问题:

  1. 当文件开始播放时,我们可以在开始时听到短促的噪音。比如点击什么的。
  2. 即使我们刷新或释放 AudioTrack,声音似乎也在队列中播放(尤其是当需要快速更改缓冲区时)
  3. 我们无法在 MODE_STREAM 中创建循环
  4. 当我们修改 AsyncTask 的局部变量 CHANGE_RATE 和 RATE 时,它应该调用 audioTrack.setPlaybackRate(RATE)。确实如此,但什么也没有发生。

我曾经用 Obj-C for iOS 编写,并且有很多“即用型”解决方案(例如 cocoacontrols)。从未想过在 Android 上处理声音会是一场噩梦;/ 任何帮助将不胜感激:)

4

1 回答 1

0

Android 4.0 或更高版本不再支持播放速率控制。我不确定禁用它的原因是什么。我不得不采用SoundTouch库实现的SOLA算法来为我的应用程序添加播放速率控制。

如果你想使用它,你需要使用 OpenSL 编写一个播放器。周围有很多工作示例。在将流发送到输出接收器之前,采用算法并将其用于修改 PCM 流。

22.01.2016 更新: Android 似乎将Sonic库包含在 6.0 版本中。因此播放速率控制应该从 Android M 开始可用。

于 2014-02-25T17:31:09.227 回答