我目前正在通过OpenSL在Android上实现混音效果。我有一个初步实施,但我遇到了一些问题。
我的实施如下:
1)对于每个声音效果,我创建了几个使用SLDataLocator_AndroidFD数据源的AudioPlayer对象(每个同时声音一个),而这些数据源又指OGG文件。例如,如果我有快速连续播放的枪发射声(让我们称之为gun.ogg),我会使用大约5个AudioPlayer对象来引用相同的gun.ogg音频源以及相同的outputmix对象。
2)当我需要播放该声音效果时,我会搜索我创建的所有AudioPlayer对象,找到一个当前不在SL_PLAYSTATE_PLAYING状态的对象并使用它来播放效果。
3)在播放剪辑之前,我使用SLPlayItf :: SetPosition寻找它的开头。
到目前为止,这项工作正常,但在快速连续播放声音时会发出一些噼啪声。我在Android NDK新闻组上看到Android上的OpenSL在切换数据源方面存在问题。有人遇到过这个问题吗?
我也想知道是否有其他人在Android上看到或想出了OpenSL的混音方法。如果是这样,你的方法与我的不同吗?有关噼啪声的建议吗?
我已经在互联网上搜索了OpenSL文档和示例代码,但是关于混合的问题并不多(只有我已经想到的加载)。任何帮助将不胜感激。
答案 0 :(得分:1)
这可能不是最好的方法(创建许多音频播放器实例)。不幸的是,OpenSL ES的Android版本(2.3)不支持SLDynamicSourceItf。这与OpenAL的源绑定接口类似。一种方法是创建多个流播放器。然后,您将搜索当前未播放的流播放器,并开始从内存中将声音效果传输到该播放器。这不是理想的,但它是可行的。
您可能不应该使用ogg格式的声音效果。你最好使用WAV(PCM),因为它不需要解码。
Ogg可以播放背景音乐。