SoundPool:创建AudioTrack时出错

时间:2012-03-07 09:47:05

标签: android soundpool bitrate audacity

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

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

  

我找到了一个关于此问题的线索,(可能的)answer是:

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

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

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

7 个答案:

答案 0 :(得分:16)

主要编辑:找到一种方法来固定你的一天!滚动下面!!

我和你在同一条船上。在阅读之前,我必须告诉您,我未能提供可以解决此问题的答案。

我已经看过许多关于SoundPool的Stack Overflow主题,但是我没有看到很多SoundPool问题与Android书中的Java代码有关:

  

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

这里是从这里提供的Beginning Android 4 Game Development源代码剪掉的代码(见下文)。你在那里得到了explosion.ogg文件(在trunk中,找到第4章的/ asset文件夹--Android Basics)。您必须单击右侧的“查看原始文件”才能获取该文件。

我所做的只是将源代码直接复制到Eclipse中,并将trunk中提供的explosion.ogg文件添加到我的项目中。我执行了Android模拟器,尝试播放该文件,我可以告诉你我仍然得到上面引用的相同的Logcat错误。

一个人在Youtube上提供了一个视频,说明SoundPool正常工作。视频链接如下。我做了视频指示我编码的内容,我抓住了我从上面提供的第二个链接获得的相同的explosion.ogg文件。我仍然遇到这些错误:

  

03-13 05:17:10.143:E / AudioTrack(3370):AudioFlinger无法创建曲目,状态:-12
  03-13 05:17:10.143:E / SoundPool(3370):创建AudioTrack时出错

我知道自从Android 1.0以来,SoundPool在API级别1存在。即使我有SoundPool工作的证据(视频链接,第二个),SoundPool也不应该有任何失败的原因。 / p>

这些是我的发现,可能会或可能不会以其他方式帮助他人。简而言之,你并不孤单。

来源:

  1. http://code.google.com/p/beginning-android-games/source/browse/trunk/ch04-android-basics/src/com/badlogic/androidgames/SoundPoolTest.java
  2. http://www.youtube.com/watch?v=ioGWpu8Ud7A
  3. 编辑:我能够从SoundPool播放声音。

    这是我的代码:

    package nttu.edu.test;
    
    import nttu.edu.R;
    import android.app.Activity;
    import android.media.AudioManager;
    import android.media.SoundPool;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.TextView;
    
    public class SoundPoolTest extends Activity implements OnClickListener {
        SoundPool soundPool = null;
        int explosionId = 0;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            TextView v = new TextView(this);
            v.setOnClickListener(this);
            setContentView(v);
            this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
            v.setText("Click anywhere to play the sound.");
        }
    
        protected void onResume() {
            super.onResume();
            if (soundPool == null) {
                soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
                explosionId = soundPool.load(this, R.raw.explosion, 1);
            }
        }
    
        protected void onPause() {
            super.onPause();
            if (soundPool != null) {
                soundPool.release();
                soundPool = null;
            }
        }
    
        public void onClick(View v) {
            if (explosionId != 0)
                soundPool.play(explosionId, 1, 1, 0, 0, 1);
        }
    }
    

    我所做的是重构我的代码。我从Youtube视频链接中的一条评论中了解到了这一提示,其中评论的作者名为“ErichLancaster”。所有的积分都归他所有。我希望这能帮到你。

    我还将Android模拟器的分辨率大小设置为QVGA,如果它真的重要或不重要。

答案 1 :(得分:2)

对我来说状态-12是由于在实例化SoundPool时指定了太多的通道。因此,可能只是因为记忆力不足而试图保留太多频道。

答案 2 :(得分: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

答案 3 :(得分: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;}}

希望这有助于某人。

答案 4 :(得分: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);

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

答案 5 :(得分:0)

我在玩游戏时遇到了这个问题。我正在使用Java在android native中构建它。我的问题是2折。首先,我在创建声音池时使用了太多通道,然后在游戏结束并通过屏幕转到游戏时从未释放声音池。当游戏结束时,我使用onStop方法释放了音池和音频管理器,这对我来说解决了这个问题。

// in GameActivity
    @Override
    protected void onStop() {
        gameView.audioHandler.release();
        super.onStop();
    }
// in AudioHandler class
    public void release() {
        soundPool.release(); // this is my SoundPool
        battleMusic.release(); // this is my AudioManager
    }

更新:经过更多测试后,该问题仍然再次发生。但是,最终解决该问题的方法最终完全是将先前的代码组合在一起,然后将声音池限制为最大10个流,从而降低了所用MP3声音的质量。问题主要是当我在屏幕上有10个以上的敌人都用相同的声音发射激光时发生的。根据SoundPool文档,当达到最大流时,在逻辑上将消除旧流。鉴于-12代码表示已达到声音池的1 MB限制,因此我得出的结论是,声音负担过重,因此将其设置为10的流限制,它将永远无法达到1 mb的限制,必须开始循环旧水。奇怪的是,我的音效持续时间不长,但仍然达到极限。我希望这对某人有帮助!自减少流量以来,我再也没有这个问题。

答案 6 :(得分:-1)

我按照这个回答:http://www.andengine.org/forums/gles2/sound-not-playing-t10820.html

主要思想是 SoundManager 类有一个允许少量内存的SoundPool(与 MusicManager 不同),所以在logcat中的“所有消息”中可以看到“内存不足”。

我想,每个“.play()”都要求每个 声音 (不知道音乐怎么样) - 分配新的内存空间池,并避免您可以执行以下操作:

- 只使用.play()一次,然后使用.seekTo(0),然后使用.resume()(从开始播放)

- 或者只使用.play()一次,然后使用.pause(),然后使用.resume()(例如用于循环)