【发布时间】:2014-05-28 04:07:39
【问题描述】:
在 openSL 中,当我创建一个 simpleBufferQueue 时,为什么它只能一个接一个地播放缓冲区?这种情况有什么帮助? 更实际的用法是当我可以使用 5 个或更多缓冲区创建它时,它可以在我加入缓冲区后立即混合/同时播放它们!
到目前为止,一起播放声音的唯一方法是创建多个简单的缓冲区队列 AudioPlayer。
如果我在 openSL 文档中看到任何错误,请帮助和纠正!
【问题讨论】:
在 openSL 中,当我创建一个 simpleBufferQueue 时,为什么它只能一个接一个地播放缓冲区?这种情况有什么帮助? 更实际的用法是当我可以使用 5 个或更多缓冲区创建它时,它可以在我加入缓冲区后立即混合/同时播放它们!
到目前为止,一起播放声音的唯一方法是创建多个简单的缓冲区队列 AudioPlayer。
如果我在 openSL 文档中看到任何错误,请帮助和纠正!
【问题讨论】:
OpenSL ES 被设计成一个特别有用的音频 API。任何高级音频工作站应用程序、合成器应用程序等都可能会由程序员完成大量效果和内部混音。特别是对于设计和代码的可移植性,所需要的只是放置输出的地方。
使用 OpenSL,如果您想同时播放声音,您应该自己混合它们并使用混合的声音加载缓冲区。最简单的方法是逐个样本添加它们。假设每个声音可以达到最大动态余量,除以输入声音的数量。 (这种划分可以使音量有点低,但需要一些努力才能绕过它,假设削波是不可接受的。)
要混合 2 种声音,当您创建输出样本(即要排队的数据)时,您可以这样做:
out[i] = (snd1[i] + snd2[i])/2;
(您可能想要优化数学,注意数据类型,并可能使用不同的索引。)
一般:
out[i] = (snd1[i] + ... + sndN[i])/N;
【讨论】:
您必须自己创建多个缓冲区队列或混合音频。您可以检查这个库,它替换了 soundpool 并使用了 opensl:https://code.google.com/p/opensl-soundpool/
这里也回答了这个问题:Play several sound effects simultaneously using OpenSL ES Android
PS:如果您手动混合两种声音,请不要除以(归一化)通道数,因为这是不对的:例如,两把小提琴的声音比一个大,对吧? .避免饱和取决于声音设计师,而不是程序员。
【讨论】: