SoundPool "AudioFlinger не может создать трек, статус: -12"
У меня есть приложение для Android с одной кнопкой. При нажатии кнопки приложение начинает воспроизводить (зацикливать) звук, загруженный с помощью SoundPool. При повторном нажатии кнопки звук останавливается, а затем начинается снова.
Но проблема в том, что звук воспроизводится только через раз.
- Нажмите 1 раз -> звук начинает играть
- Нажмите 2 раза -> звук останавливается, но не начинается снова
- Нажмите 3 раза -> звук начинает играть
- Нажмите 4 раза -> звук останавливается, но не начинает играть
- и так далее...
Когда звук не воспроизводится, эта ошибка появляется в logcat:
E/AudioTrack: AudioFlinger could not create track, status: -12
E/SoundPool: Error creating AudioTrack
Когда я удаляю циклы (меняем -1 на 0), все работает совершенно правильно!
Звук, который я играю, представляет собой MP3-файл размером 71,6 КиБ.
Я проверил это на 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
1 ответ
Как вы можете видеть здесь, код ошибки 12 означает Out of memory
в среде Linux. По-видимому, это некоторые проблемы, связанные с распределением памяти на устройствах Jelly Bean (я полагаю, для pre-lollipop).
Я уменьшил ваш исходный файл с 177808 кбит / с до 32000 кбит / с, и он начал работать, как и ожидалось, на устройствах перед леденцом на палочке.
Таким образом, вы должны уменьшить ваш аудиофайл для устройств перед леденцом на палочке. Лучше иметь raw-v21
для оригинальных аудиофайлов и отложенных выборок в raw
, Таким образом, устройства, начиная с API 21, будут использовать оригинальную версию.
Вот файл с уменьшенной выборкой.
Я была такая же проблема. Сделайте следующее:
(1) убедитесь, что ваши файлы меньше 1 МБ
(2) более важно выпустить экземпляры SoundPool после их использования, чтобы освободить место в памяти
soundPool.release();