SoundPool:创buildAudioTrack时出错

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

AudioFlinger无法创build曲目,状态:-12
创buildAudioTrack时出错

我发现了一个关于这个的线程,(可能的) 答案是:

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

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

作为一个注意事项 – 在使用MediaPlayer之前,现在我想演奏几个并行的声音。

Solutions Collecting From Web of "SoundPool:创buildAudioTrack时出错"

主要编辑:find一种方法来修复你的日子! 向下滚动!

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

我曾经见过很多关于SoundPool的Stack Overflow主题,但是我从来没有看到过很多与Android手册中的Java代码有关的SoundPool问题:

AudioTrack:AudioFlinger无法创build音轨,状态-12。
SoundPool:创buildAudioTrack时出错。

下面是从这里提供的Beginning Android 4游戏开发源代码中截取的代码(见下文)。 你可以在这里findexplosion.ogg文件(在trunk中find第4章 – Android基础的/ asset文件夹)。 你必须点击右边的“查看原始文件”来获取文件。

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

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

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

我知道SoundPool从Android 1.0开始,在API级别1上存在。即使有证据表明SoundPool可以工作(video链接,第二个),SoundPool也不应该失效。

这些是我的发现,可能或不会帮助别人。 总之,你并不孤单。

资源:

  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

编辑:我能够从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); } } 

我所做的是重构我的代码。 我从Youtubevideo链接的评论中学到了这个技巧,评论的作者的名字是“ErichLancaster”。 所有学分都归他。 我希望这能帮助你。

如果真的很重要,我也将Android模拟器分辨率大小设置为QVGA。

对于我来说,状态-12是由于在实例化SoundPool时指定的通道过多造成的。 所以它可能只是用尽内存,试图保持太多的渠道。

我最近也遇到了这个错误。 我的是一个实际发生在一个循环中的碰撞,所以它实际上会叠加声音,直到它们退出,这会导致错误,但它会继续播放。 我通过在发生时注册反弹来解决这个问题。

  // bouncecount= // 0=no bounce // 1=set when bounce occurs and plays the sound // 21=reset 

由于游戏运行速度大约为60fps,因此每秒只能播放一次声音3次,并且可以通过更改20来轻松进行调整。这不仅可以减less游戏中的抖动,而且还不至于引人注目。

 if(bouncecount==1){ sounds.play(sbump,1,1, 0, 0, 1);bouncecount++;} else{if(bouncecount<20&&bouncecount!=0){bouncecount++;} else{bouncecount=0;}} 

希望这有助于某人。

在我的代码中,我必须播放大约10个声音并行(Drumkit-Simulation)。 我做的是,我把每一个声音放在一个自己的soundpool,并用来停止已经播放的声音,当一个新的开始。 这解决了它。

  int newStreamID = soundPool.play(soundIDs.get(0), volume, volume, 1, 0, randomFloatRate); if (StreamID != null) { soundPool.stop(StreamID); } StreamID = newStreamID; 

据我所知Soundpool解压缩audio文件,所以你可以节省CPU使用.WAV。 我想,在这个明智的方面,你可能会多次重复同样的声音。

为了改变audio格式,我使用FormatFactory

有一个循环的问题:当我设置重复-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,允许的内存很less(与MusicManager不同 ),因此可以看到logcat中的“所有消息”“内存不足”。

我想,每个“.play()”都会调用每一个声音 (不知道音乐如何) – 在池中分配新的内存空间,并避免你可以执行以下操作:

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

– 或仅使用.play()一次,然后使用.pause(),然后使用.resume()(例如循环)