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