Android AudioFlinger无法创建曲目,状态:-12;创建音轨时出错

Android AudioFlinger无法创建曲目,状态:-12;创建音轨时出错,android,soundpool,Android,Soundpool,我的SoundPool有问题,因为它拒绝处理我的.ogg文件。我得到这个错误: AudioFlinger could not create track, status: -12 Error creating AudioTrack 我发现了一条与此相关的线索,(可能的)是: 确保使用恒定比特率的.ogg媒体文件 是这样吗?如果是-使用哪个应用程序(Audacity不支持.ogg自定义导出设置)。如果不是,还有什么问题 作为旁注-在我使用MediaPlayer之前,但现在我想同时播放一些声音。主

我的SoundPool有问题,因为它拒绝处理我的.ogg文件。我得到这个错误:

AudioFlinger could not create track, status: -12
 Error creating AudioTrack
我发现了一条与此相关的线索,(可能的)是:

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

是这样吗?如果是-使用哪个应用程序(Audacity不支持.ogg自定义导出设置)。如果不是,还有什么问题


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

主要编辑:找到了一种解决问题的方法!!向下滚动

我和你在同一条船上。在阅读之前,我必须让你们知道我没有提供一个可以解决这个问题的答案

我已经看到了很多关于SoundPool的堆栈溢出主题,但是我没有看到很多关于Android书籍中Java代码的SoundPool问题:

AudioTrack:AudioFlinger无法创建曲目,状态为-12。
声音池:创建音轨时出错

以下是从Android 4游戏开发源代码开始截取的代码(见下文)。在那里可以看到explosion.ogg文件(在主干中,找到第4章-Android基础知识的/asset文件夹)。您必须单击右侧的“查看原始文件”才能获取该文件

我所做的只是将源代码直接复制到Eclipse中,并将主干提供的explosion.ogg文件添加到我的项目中。我执行了Android emulator,尝试播放该文件,我可以告诉你,我仍然会收到上面引用的相同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):创建音轨时出错

我知道自Android 1.0以来,SoundPool就已经存在,API级别为1。即使我有证据证明SoundPool有效(视频链接,第二个),也不应该有任何理由让SoundPool无法工作

这些都是我的发现,可能对其他人有帮助,也可能没有帮助。简言之,这里不只你一个人

资料来源:

  • 编辑:我能够播放来自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视频链接中的一条评论中学到了这一技巧,该评论的作者名叫“埃里克兰卡斯特”。所有的功劳都归他。我希望这对你有帮助


    我还将Android emulator分辨率大小设置为QVGA,如果这真的很重要的话。

    我最近也遇到了这个错误。我的是一个循环中多次发生的碰撞,所以它实际上会叠加声音,直到声音消失,这导致了错误,但它会继续播放。我通过在反弹发生时将其注册为1来修复此问题

     // bouncecount=
     // 0=no bounce
     // 1=set when bounce occurs and plays the sound
     // 21=reset
    
    由于游戏运行速度约为60帧/秒,因此每秒只允许播放一次声音3次,并且可以通过更改20帧/秒来轻松调整。这不仅减少了游戏中的抖动,而且一点也不明显

    if(bouncecount==1){
       sounds.play(sbump,1,1, 0, 0, 1);bouncecount++;}
    else{if(bouncecount<20&&bouncecount!=0){bouncecount++;}
         else{bouncecount=0;}}
    
    if(bouncecount==1){
    播放(sbump,1,1,0,0,1);bouncecount++;}
    
    else{if(bouncecountFor me status-12是由于在实例化SoundPool时指定了太多的频道而导致的。因此,可能只是内存不足,试图保留太多的频道。

    我遵循以下答案: 其主要思想是SoundManager类有一个允许内存很少的SoundPool(与MusicManager不同),因此在logcat中的“所有消息”中可以看到“内存不足”。 我想,为每个声音调用的每个“.play()”(不知道音乐如何)-在池中分配新的内存空间,为了避免这种情况,可以执行以下操作: -只使用.play()一次,然后使用.seekTo(0),然后使用.resume()(从头开始播放)
    -或者只使用一次.play(),然后使用.pause(),然后使用.resume()(例如循环)

    我必须为Drumkit模拟并行播放大约10个声音。因此,我将每个声音放在自己的声音池中,并使用StreamIds来识别和停止任何相同的声音,以防它已经在播放

    int newStreamID = soundPool.play(soundIDs.get(0), volume, volume, 1, 0, randomFloatRate);
    if (StreamID != null) {
        soundPool.stop(StreamID);
    }
    StreamID = newStreamID;
    
    据我所知,Soundpool解压音频文件,因此您可以使用.wav格式节省CPU使用量


    对于更改我使用的音频格式,循环存在一个问题:当我将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);
    

    这是可行的,但不同设备的延迟是不同的。

    我刚刚在游戏中遇到了这个问题。我正在用java用android本机构建它。我的问题有两个。首先,我在创建声音池时使用了太多的频道,然后在游戏结束时我从未发布声音池,而是通过屏幕进入游戏。我使用了onStop method在游戏结束后发布soundpool和audiomanager,这为我解决了问题

    // in GameActivity
        @Override
        protected void onStop() {
            gameView.audioHandler.release();
            super.onStop();
        }
    
    更新:经过更多测试后,问题仍然再次出现。然而,最终完全消除问题的是之前代码的组合,然后将声音池限制为最大10流,并降低了所用声音MP3的质量。问题主要发生在我在scre上有10多个敌人时使用相同的声音发射所有激光。根据声音池文档,当达到最大流时,逻辑上
    // in AudioHandler class
        public void release() {
            soundPool.release(); // this is my SoundPool
            battleMusic.release(); // this is my AudioManager
        }