声音池 "AudioFlinger could not create track, status: -12"
SoundPool "AudioFlinger could not create track, status: -12"
我有一个 Android 应用程序只有一个按钮。单击该按钮时,应用程序开始播放(循环播放)使用 SoundPool 加载的声音。再次点击按钮时,声音停止,然后再次开始。
但问题是声音只能每隔一段时间播放一次。
- 点击第 1 次 -> 声音开始播放
- 点击第二次 -> 声音停止但不会再次开始
- 点击第 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(不工作)上进行了测试。但在我的 Huawei 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
如您所见here,错误代码12代表Linux环境中的Out of memory
。显然,它们是关于 Jelly Bean(我想是棒棒糖之前的设备)设备上的内存分配的一些问题。
我已将您的原始文件从 177808kbps 降采样到 32000kbps,它开始在棒棒糖之前的设备上按预期工作。
因此,对于棒棒糖之前的设备,您必须对音频文件进行下采样。最好有一个 raw-v21
的原始音频文件,并将下采样放入 raw
。因此从 API 21 开始的设备将使用原始版本。
Here's 下采样文件。
我遇到了同样的问题。执行以下操作:
(1) 确保您的文件小于 1 MB
(2) 更重要的是在使用它们释放内存后释放您的 SoundPool 实例 space
soundPool.release();
我有一个 Android 应用程序只有一个按钮。单击该按钮时,应用程序开始播放(循环播放)使用 SoundPool 加载的声音。再次点击按钮时,声音停止,然后再次开始。
但问题是声音只能每隔一段时间播放一次。
- 点击第 1 次 -> 声音开始播放
- 点击第二次 -> 声音停止但不会再次开始
- 点击第 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(不工作)上进行了测试。但在我的 Huawei 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
如您所见here,错误代码12代表Linux环境中的Out of memory
。显然,它们是关于 Jelly Bean(我想是棒棒糖之前的设备)设备上的内存分配的一些问题。
我已将您的原始文件从 177808kbps 降采样到 32000kbps,它开始在棒棒糖之前的设备上按预期工作。
因此,对于棒棒糖之前的设备,您必须对音频文件进行下采样。最好有一个 raw-v21
的原始音频文件,并将下采样放入 raw
。因此从 API 21 开始的设备将使用原始版本。
Here's 下采样文件。
我遇到了同样的问题。执行以下操作:
(1) 确保您的文件小于 1 MB
(2) 更重要的是在使用它们释放内存后释放您的 SoundPool 实例 space
soundPool.release();