SoundPool:创建AudioTrack时出错

问题描述 投票:17回答:6

我在使用SoundPool时遇到问题,因为它拒绝使用我的.ogg文件。我收到此错误:

AudioFlinger无法创建曲目,状态:-12 创建AudioTrack时出错

我找到了一个关于这个和(可能)answer的线程是:

  • 确保使用具有恒定比特率的.ogg媒体文件!

是这样的吗? (有人请确认或取消) 如果是 - 使用哪个应用程序(Audacity不支持.ogg自定义导出设置)。 如果不是 - 还有什么可能是错的?

作为旁注 - 在我使用MediaPlayer之前,但现在我想播放一些并行的声音。

android soundpool bitrate audacity
6个回答
2
投票

对我来说,状态-12是由于在实例化SoundPool时指定了太多的通道。因此,可能只是因为内存过多而耗尽内存。


2
投票

在我的代码中,我必须播放大约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
投票

我最近也遇到了这个错误。我的一次碰撞实际上是在一个循环中多次发生,所以它实际上会堆叠声音,直到它们退出,这会导致错误,但它会继续播放。我通过在发生时将反弹注册为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;}}

希望这有助于某人。


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);

它正在工作,但不同设备的延迟是不同的。


-1
投票

我按照这个答案: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()(例如用于循环)

© www.soinside.com 2019 - 2024. All rights reserved.