如何使用 SoundPool 播放超过 32 种声音?

Posted

技术标签:

【中文标题】如何使用 SoundPool 播放超过 32 种声音?【英文标题】:How to play more than 32 sounds using SoundPool? 【发布时间】:2012-10-24 14:53:56 【问题描述】:

自从我使用简单的 medaiplayer (Sound sometimes remains silent when playing more sounds in a row, why?) 并尝试使用 SoundPool 来创建整个事情以来,我的上一个问题没有得到回答。但是你猜怎么着,几乎同样的事情发生了,但有一个错误

AudioFlinger could not create track, status: -12
Error creating AudioTrack

我了解到最多可以将 32 个声音存储在 soundpool 的内存中,然后我会收到错误消息。没错,在第 32 个声音之后,我无法播放任何声音,因为我总是收到错误消息。那么我如何在 SoundPool 中使用超过 32 种声音呢?我尝试使用 3 个 Soundpool,每个 Soundpool 有 20 个声音,我总是用这个从其他池中卸载所有声音:

    mSoundPoolMapV1.clear();  //clearing HashMap
    for(int i=1;i<15;i++)
    mSoundPoolV1.unload(i);  
    

但是同样的错误又来了。 (我使用 22k 声音而不是 44.1k,我读到这可以解决它,但什么也没发生) 任何建议表示赞赏。到底是什么,我既不能用 mediaplayer 也不能用 soundpool 播放大约 50 种声音?这怎么可能??

release()

    mSoundPoolMap.clear();
    for(int i=1;i<50;i++)
    mSoundPool.unload(i);
    
    mSoundPool.release();

    mSoundPoolMap.put(1, mSoundPool.load(Main.this, R.raw.sound1, 1));
    ...
    mSoundPoolMap.put(50, mSoundPool.load(Main.this, R.raw.sound50, 1));

所以我清除了 hashmp,然后卸载了所有的声音,然后我释放了 soundpool。然后我再次填充哈希图,但现在它根本没有给我任何声音。我一定错过了什么,你能告诉我什么吗?

【问题讨论】:

【参考方案1】:

AudioMixer 有一个限制,即只能同时允许 32 个 AudioTrack。只要 SoundPool 开始播放属于该池的通道之一(我猜这对应于一个样本),它就会尝试创建一个 AudioTrack。但是,在您销毁 SoundPool 之前,轨道不会被销毁,因此即使已停止,轨道名称仍将保持分配状态。

您可以尝试在您的 SoundPool 上调用 release()。这应该会导致原生 SoundPool 对象被破坏,从而破坏它创建的所有 AudioTrack,并在 AudioMixer 中释放它们的名称。

【讨论】:

我通过释放池编辑了我的代码,但是当我触摸按钮时没有播放任何声音。我错过了什么吗? 从未播放过,或者在您发布第一批并尝试加载/播放另一批之后?如果您发布使用最新代码获取的日志可能会有所帮助。 在onCreate中我加载它们并且可以播放它们,然后我按下执行我编写的上层代码的按钮(也释放),然后无法播放声音。 在调用 release() 之后,您应该创建一个新的 SoundPool。正如 SoundPool.release() 的文档所述:“无法再使用 SoundPool,应将引用设置为 null。” 感谢我的耻辱,我跳过了那部分。感谢您的帮助,它现在可以正常工作了!我希望它在未来保持这种状态:)【参考方案2】:

底层音频硬件不是无限的。你一次只能在记忆中保存这么多的声音。当我为台式机制作 3D 音频库时,限制是可变的,因此我必须在开始之前从硬件查询限制,否则会导致看似随机的故障。您应该有一个 SoundPool,只需根据需要加载和卸载声音。然后你需要为应该播放的声音设置某种优先级,这样你就可以确保你真正需要的声音不会被卸载来播放可选的背景噪音。

SoundPool Documentation 实际上对典型用例有很好的描述。

【讨论】:

感谢您的文档,我有时间阅读它,发现它非常有用!

以上是关于如何使用 SoundPool 播放超过 32 种声音?的主要内容,如果未能解决你的问题,请参考以下文章

Soundpool vs Mediaplayer 用于播放多种音效

如何使用 SoundPool 播放随机声音?

如何在特定时间段内使用 SoundPool 同时播放声音

如何使用 Android 动画播放“滴答滴答”声音(可能使用“Android MediaPlayer / SoundPool”)?

Android 编程 - 如何从广播接收器播放 SoundPool 声音?

如何停止通过 Soundpool 播放声音?