【问题标题】:openSL Enqueue plays buffers only one after another ? Why not mixed?openSL Enqueue 只一个接一个地播放缓冲区?为什么不混?
【发布时间】:2014-05-28 04:07:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: android audio opensl


    【解决方案1】:

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

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

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

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

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

    一般:

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

    【讨论】:

      【解决方案2】:

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

      这里也回答了这个问题:Play several sound effects simultaneously using OpenSL ES Android

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

      【讨论】:

        猜你喜欢
        • 2014-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        相关资源
        最近更新 更多