首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SoundPool "AudioFlinger无法创建轨道,状态:-12“

SoundPool "AudioFlinger无法创建轨道,状态:-12“
EN

Stack Overflow用户
提问于 2017-03-25 14:45:33
回答 2查看 1.4K关注 0票数 9

我有一个带有单一按钮的Android应用程序。当点击按钮时,应用程序开始播放(循环)带有SoundPool的声音。当再次单击按钮时,声音将停止,然后重新启动。

但问题是声音每隔一次播放一次。

  • 单击第一次->声音开始播放
  • 单击第二次->声音停止但不会再次启动
  • 单击第三次->声音开始播放
  • 单击第4次->声音停止但未开始播放
  • 等等..。

当声音不播放时,这个错误出现在logcat中:

代码语言:javascript
复制
E/AudioTrack: AudioFlinger could not create track, status: -12
E/SoundPool: Error creating AudioTrack

当我删除循环(更改-1到0)时,一切都完全正确!

我正在播放的声音是一个MP3文件,大小为71.6 KiB。

我已经在运行Android4.1.2的索尼Xperia上测试了这一点(不起作用)。但在我的华为荣誉6(Android6.0)一切工作,包括循环!

我做错了什么?

这是我的代码:

代码语言:javascript
复制
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private int lastStreamId = 0;
    private int soundID;
    private SoundPool soundPool;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        soundID  = soundPool.load(this, R.raw.sound01, 1);


        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                soundPool.stop(lastStreamId);
                lastStreamId = soundPool.play(soundID, 1, 1, 1, -1, 1);
            }
        });
    }
}

编辑:

我不允许上传原始声音在这里,但这里有另一个声音,做同样的事情。,除了,现在声音只在第一个单击中播放;下面的所有单击只会使其保持沉默,并指出上面的错误。

声音在这里:sound01.mp3

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-28 15:05:27

如您所见,这里环境中的错误代码12表示Out of memory。显然,它们是一些有关Jelly (我想是用于预棒棒糖)设备上的内存分配的问题。

我把你的原始文件从177808 file降到了32000 file,它开始像预期的那样在前棒棒糖设备上工作。

所以,你必须降低你的音频文件前棒棒糖设备。最好有一个raw-v21的原始音频文件,并将下采样到raw。因此,从API 21开始的设备将使用原始版本。

下面是下采样文件。

票数 6
EN

Stack Overflow用户

发布于 2019-03-16 11:09:21

我也有过同样的问题。做以下工作:

(1)确保文件小于1MB

(2)更重要的是,在使用SoundPool实例释放内存空间之后,释放它们

代码语言:javascript
复制
soundPool.release();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43017762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档