我在使用SoundPool时遇到问题,因为它拒绝使用我的.ogg文件。我收到此错误:
AudioFlinger无法创建曲目,状态:-12 创建AudioTrack时出错
我找到了一个关于这个和(可能)answer的线程是:
是这样的吗? (有人请确认或取消) 如果是 - 使用哪个应用程序(Audacity不支持.ogg自定义导出设置)。 如果不是 - 还有什么可能是错的?
作为旁注 - 在我使用MediaPlayer之前,但现在我想播放一些并行的声音。
对我来说,状态-12是由于在实例化SoundPool时指定了太多的通道。因此,可能只是因为内存过多而耗尽内存。
在我的代码中,我必须播放大约10个Sounds parallel(Drumkit-Simulation)。我所做的是,我将每个声音都放在一个自己的声池中,用来停止同一个已经播放的声音,当一个新声音启动时。这解决了它。
int newStreamID = soundPool.play(soundIDs.get(0), volume, volume, 1, 0, randomFloatRate);
if (StreamID != null) {
soundPool.stop(StreamID);
}
StreamID = newStreamID;
据我所知,Soundpool会解压缩音频文件,因此您可以使用.wav节省CPU使用率。我想在这方面你可能会多次覆盖同样的声音。
要更改音频格式,我使用FormatFactory
我最近也遇到了这个错误。我的一次碰撞实际上是在一个循环中多次发生,所以它实际上会堆叠声音,直到它们退出,这会导致错误,但它会继续播放。我通过在发生时将反弹注册为1来修复此问题。
// bouncecount=
// 0=no bounce
// 1=set when bounce occurs and plays the sound
// 21=reset
由于游戏以大约60fps的速度运行,这只允许一次声音的一个实例每秒3次,并且可以通过更改20来轻松调整。这不仅减少了游戏中的抖动,而且并非一点点明显。
if(bouncecount==1){
sounds.play(sbump,1,1, 0, 0, 1);bouncecount++;}
else{if(bouncecount<20&&bouncecount!=0){bouncecount++;}
else{bouncecount=0;}}
希望这有助于某人。
循环有一个问题:当我将repeat设置为-1时,我得到了这个错误,但是0时一切正常。我注意到当我试图逐个播放时,有些声音会出现此错误。例如:
mSoundPool.stop(mStreamID);
mStreamID = mSoundPool.play(mRandID, mVolume, mVolume, 1, -1, 1f);
在这种情况下,第一首曲目播放正常,但是当我切换声音时,下一首曲目会出现此错误。似乎使用循环,缓冲区以某种方式重载,并且mSoundPool.stop无法立即释放资源。
解:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mStreamID = mSoundPool.play(mRandID, mVolume, mVolume, 1, -1, 1f);
}, 350);
它正在工作,但不同设备的延迟是不同的。
我按照这个答案:http://www.andengine.org/forums/gles2/sound-not-playing-t10820.html
主要思想是SoundManager类有一个允许少量内存的SoundPool(与MusicManager不同),因此可以看到logcat中“out of memory”中的“all messages”。
我想,每个“.play()”都会调用每个声音(不知道音乐会是什么) - 在池中分配新的内存空间,并避免你可以执行以下操作:
- 只使用.play()一次,然后.seek To(0),然后.resume()(从头开始播放)
- 或者只使用.play()一次,然后使用.pause(),然后使用.resume()(例如用于循环)