由于我的上一个问题没有得到回答,我使用了简单的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个声音池,每声道有20个声音,我总是用其它声音从其他声池中卸载所有声音:
mSoundPoolMapV1.clear(); //clearing HashMap
for(int i=1;i<15;i++){
mSoundPoolV1.unload(i);
}
但同样的错误又来了。 (我使用22k声音代替44.1k,我读过这可以解决它但没有发生任何事情) 任何建议赞赏。到底是什么,我不能用媒体播放器和音池播放约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。然后我再次填充哈希图,但现在它根本没有给我任何声音。我必须错过一些东西,你能告诉我什么吗?
答案 0 :(得分:1)
AudioMixer有一个限制,它只能同时允许32个AudioTracks。只要SoundPool开始播放属于池的其中一个通道(我猜这对应于一个样本),它就会尝试创建一个AudioTrack。但是,在销毁SoundPool之前,轨道不会被销毁,因此即使轨道名称已经停止,轨道名称仍将保持分配状态。
您可以尝试在SoundPool上调用release()
。这应该导致本机SoundPool对象被销毁,从而销毁它创建的所有AudioTracks并在AudioMixer中取消分配它们的名称。
答案 1 :(得分:0)
底层音频硬件不是无限制的。你一次只能在内存中保存这么多声音。当我为台式机制作3D音频库时,限制是可变的,因此我必须在启动之前从硬件查询限制,否则会导致看似随机的故障。您应该有一个SoundPool,只需在需要时加载和卸载声音。然后你需要为应该播放的声音设置某种优先级,这样你就可以确保你真正需要的声音不会被卸载以播放可选的背景噪音。
SoundPool Documentation实际上对一个典型的用例有一个非常好的描述。