3

我目前正在通过 OpenSL 在 Android 上实现音效混合。我有一个初始实施,但我遇到了一些问题。

我的实现如下:

1) 对于每个音效,我创建了几个 AudioPlayer 对象(每个同步声音一个),这些对象使用一个 SLDataLocator_AndroidFD 数据源,该数据源又引用一个 OGG 文件。例如,如果我有一个快速连续播放的开枪声音(我们称之为 gun.ogg),我使用大约 5 个 AudioPlayer 对象,它们引用相同的 gun.ogg 音频源和相同的 outputmix 对象。

2) 当我需要播放该音效时,我会搜索我创建的所有 AudioPlayer 对象,并找到一个当前不处于 SL_PLAYSTATE_PLAYING 状态的对象并使用它来播放效果。

3) 在播放剪辑之前,我使用 SLPlayItf::SetPosition 寻找它的开头。

到目前为止,这一切正常,但是在快速连续播放声音时会出现一些噼啪声。我在 Android NDK 新闻组上读到,Android 上的 OpenSL 在切换数据源方面存在问题。有没有人遇到过这个问题?

我还想知道是否有其他人看到或想出了在 Android 上用于 OpenSL 的混音方法。如果是这样,您的方法与我的不同吗?关于噼啪声有什么建议吗?

我已经在 Internet 上搜索 OpenSL 文档和示例代码,但是关于混音的内容并不多(仅加载我已经弄清楚的内容)。任何帮助将不胜感激。

4

1 回答 1

1

这可能不是最好的方法(创建许多音频播放器实例)。不幸的是,OpenSL ES 的 Android 版本 (2.3) 不支持 SLDynamicSourceItf。这类似于 OpenAL 的源绑定接口。一种方法是创建多个流播放器。然后,您将搜索当前未播放的流播放器并开始从内存中将您的声音效果流式传输到它。这并不理想,但它是可行的。

您可能也不应该将 ogg 格式用于音效。您最好使用 WAV (PCM),因为它不需要解码。

Ogg 非常适合流式传输背景音乐。

于 2012-02-08T01:41:08.027 回答