openSL Enqueue只能一个接一个地播放缓冲区?为什么不混?

时间:2013-10-07 16:26:19

标签: android audio opensl

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

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

如果我在openSL文档中读错了,请帮助并纠正错误!

2 个答案:

答案 0 :(得分:3)

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

使用OpenSL,如果你想同时播放声音,你应该自己混合它们并用混合声音加载缓冲区。最简单的方法是逐个样本地添加它们。假设每个声音可以达到最大余量,除以输入声音的数量。 (这种划分可以使音量稍微降低,但是假设剪辑是不可接受的,它需要花费一些力气来解决它。)

要混合2个声音,当您创建输出样本(即要入队的数据)时,您可以这样做:

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

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

一般来说:

out[i] = (snd1[i] + ... + sndN[i])/N;

答案 1 :(得分:1)

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

此问题也在这里得到解答:Play several sound effects simultaneously using OpenSL ES Android

PS:如果您手动混合两个声音,请不要按通道数划分(标准化),因为它不对:例如两个小提琴比一个声音大,对吧? 。声音设计师要避免饱和,而不是程序员。