SoundPool“AudioFlinger无法创建曲目,状态:-12”

时间:2017-03-25 14:45:33

标签: java android soundpool audiotrack audioflinger

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

但问题是声音只是每隔一段时间播放一次。

  • 点击第一次 - >声音开始播放
  • 点击第二次 - >声音停止但不会重新开始
  • 点击第3次 - >声音开始播放
  • 点击第4次 - >声音停止但没有开始播放
  • 等......

当声音无法播放时,logcat中会出现此错误:

E/AudioTrack: AudioFlinger could not create track, status: -12
E/SoundPool: Error creating AudioTrack

当我删除循环(将-​​1更改为0)时,一切正常!

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

我在Sony Xperia U上测试了这个,运行Android 4.1.2(不工作)。但在我的华为Honor 6(Android 6.0)中,一切正常,包括循环!

我做错了什么?

这是我的代码:

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

2 个答案:

答案 0 :(得分:3)

正如您所看到的here,错误代码 12 代表Linux环境中的Out of memory。显然,它们是关于果冻豆(我想用于棒棒糖前)设备上的内存分配的一些问题。

我已将您原始文件的采样率从177808kbps下采样到32000kbps,并且它已开始按照预期在棒棒糖前设备上运行。

因此,您必须为前棒棒糖设备下采样音频文件。最好为原始音频文件设置raw-v21,并将下采样放入raw。因此,从API 21开始的设备将使用原始版本。

enter image description here

Here's下采样文件。

答案 1 :(得分:0)

我有同样的问题。请执行以下操作:

(1)确保文件小于1 MB

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

soundPool.release();
相关问题