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();
Другие вопросы по тегам