多个音频播放器(Java或C ++),可以实时修改

时间:2014-02-21 08:28:30

标签: android audio android-ndk audiotrack opensl

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

第一个问题? 有没有可以做这件事的免费或商业图书馆/包装?(可能是java或原生的)

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

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

  1. 当文件开始播放时,我们可以听到启动时的短暂噪音。喜欢点击或其他东西。
  2. 即使我们刷新或释放AudioTrack,似乎声音在队列中播放(特别是当需要快速更改缓冲区时)
  3. 我们无法在MODE_STREAM
  4. 中创建循环
  5. 当我们修改AsyncTask的局部变量CHANGE_RATE和RATE时,它应该调用audioTrack.setPlaybackRate(RATE)。确实如此,但没有任何反应。
  6. 我曾经用iOS写过Obj-C,并且有很多“随时可用”的解决方案(例如cocoacontrols)。从未想过在Android上处理声音会是一场噩梦; /任何帮助都将受到高度赞赏:)

1 个答案:

答案 0 :(得分:0)

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

如果要使用它,则需要使用OpenSL编写播放器。有很多工作的例子。在将流发送到输出接收器之前,请使用算法并将其用于修改PCM流。

更新于2016年1月22日: Android似乎包含Sonic库到6.0版本。因此,应从Android M开始播放速率控制。