1

在openSL中,当我创建一个simpleBufferQueue时,为什么它只能一个接一个地播放缓冲区?这种情况有什么帮助?更实际的用法是当我可以使用 5 个或更多缓冲区创建它时,它可以在我加入缓冲区后立即混合/同时播放它们!

到目前为止,一起播放声音的唯一方法是创建多个简单的缓冲区队列 AudioPlayers。

如果我在 openSL 文档中读到任何错误,请帮助和纠正!

4

2 回答 2

3

OpenSL ES 被设计成一个特别有用的音频 API。任何高级音频工作站应用程序、合成器应用程序等都可能会由程序员完成大量效果和内部混音。特别是对于设计和代码的可移植性,所需要的只是放置输出的地方。

使用 OpenSL,如果您想同时播放声音,您应该自己混合它们并使用混合的声音加载缓冲区。最简单的方法是逐个样本添加它们。假设每个声音可以达到最大动态余量,除以输入声音的数量。(这种划分可以使音量有点低,但需要一些努力才能绕过它,假设削波是不可接受的。)

要混合 2 种声音,当您创建输出样本(即要排队的数据)时,您可以执行以下操作:

out[i] = (snd1[i] + snd2[i])/2;

(您可能想要优化数学,注意数据类型,并且可能使用不同的索引。)

一般来说:

out[i] = (snd1[i] + ... + sndN[i])/N;
于 2013-10-07T17:23:56.247 回答
1

您必须自己创建多个缓冲区队列或混合音频。您可以查看这个库,它替换了 soundpool 并使用了 opensl:https ://code.google.com/p/opensl-soundpool/

这个问题也在这里得到解答:使用 OpenSL ES Android 同时播放多个音效

PS:如果您手动混合两种声音,则永远不要除以(归一化)通道数,因为这是不对的:例如,两把小提琴的声音比一个大,对吗?. 避免饱和取决于声音设计师,而不是程序员。

于 2014-05-27T20:07:39.077 回答